プレイヤーが動く床に乗っても落ちないようにする方法について紹介します!

事前準備
ステージやキャラクターの準備や、動く床の作り方についてはこちらをご覧ください。
プレイヤーを床と一緒に動かす方法
現状では、プレイヤーが動く床の上に乗ってもそのまま落ちてしまいます。動かすには、さらにスクリプトを追加する必要があります。

プレイヤーが床と一緒に動くスクリプト
新しく以下のスクリプトを作成して、動く床にアタッチします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StickyPlatform : MonoBehaviour
{
// 床に衝突したときに実行
private void OnCollisionEnter2D(Collision2D collision)
{
// 衝突したオブジェクト名がPlayerなら、床の子オブジェクトにする
if(collision.gameObject.name == "Player")
{
collision.gameObject.transform.SetParent(transform);
}
}
// 床から離れたときに実行
private void OnCollisionExit2D(Collision2D collision)
{
// 衝突したオブジェクト名がPlayerなら、床の子オブジェクトから解除する
if (collision.gameObject.name == "Player")
{
collision.gameObject.transform.SetParent(null);
}
}
}
プレイヤーのオブジェクト名がPlayerとなっていることを確認します。

実行
床の上に乗ることができました!しかし、床の側面に当たると床にくっついてしまってしまっています。

これは床の上側だけでなく、側面にも判定があることが原因です。そこで、上側だけに衝突判定があるように改良しましょう。
プレイヤーを床と一緒に動かす方法 改良版
床の上側に衝突判定用コライダーの追加
動く床にもう一つBox Collider 2Dコンポーネントを追加して、Is Triggerにチェックを入れておきます。

OffsetやSizeを調整して、床の上側に配置します。

あとは、床の上側のコライダー内に入ったときに、床と一緒に動くようにスクリプトを変更します。
スクリプト変更
OnCollisionEnter2D、OnCollisionExit2Dから、OnTriggerEnter2D、OnTriggerExit2Dに変更します。
これで、IsTriggerにチェックをつけたコライダーにのみ衝突判定が行われるようになります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StickyPlatform : MonoBehaviour
{
// 床の上側コライダーの中に入ったときに実行
private void OnTriggerEnter2D(Collider2D collision)
{
// 衝突したオブジェクト名がPlayerなら、床の子オブジェクトにする
if (collision.gameObject.name == "Player")
{
collision.gameObject.transform.SetParent(transform);
}
}
// 床の上側コライダーから離れたときに実行
private void OnTriggerExit2D(Collider2D collision)
{
// 衝突したオブジェクト名がPlayerなら、床の子オブジェクトから解除する
if (collision.gameObject.name == "Player")
{
collision.gameObject.transform.SetParent(null);
}
}
}
改良版の実行結果
床の側面に当たっても、床にくっつかなくなりました!

まとめ
ポイントをまとめます。
- 動く床の衝突判定用のコライダーを作成して、上側に配置する
- OnTriggerEnter2D、OnTriggerExit2Dを使用して衝突判定をする
- プレイヤーを床の子オブジェクトにすることで、一緒に動かせる
動く床も含め、2Dアクションゲームが簡単に作れるアセットはこちらです。
Corgi Engine – 2D + 2.5D Platformer