プレイヤーが動く床に乗っても落ちないようにする方法について紹介します!
![](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_640,h_400/https://umistudioblog.com/wp-content/uploads/2023/10/StickyPlatform3.gif)
事前準備
ステージやキャラクターの準備や、動く床の作り方についてはこちらをご覧ください。
プレイヤーを床と一緒に動かす方法
現状では、プレイヤーが動く床の上に乗ってもそのまま落ちてしまいます。動かすには、さらにスクリプトを追加する必要があります。
![](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_640,h_400/http://umistudioblog.com/wp-content/uploads/2023/10/MovingPlatform.gif)
プレイヤーが床と一緒に動くスクリプト
新しく以下のスクリプトを作成して、動く床にアタッチします。
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となっていることを確認します。
![](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_1014,h_582/https://umistudioblog.com/wp-content/uploads/2023/10/image-24.png)
実行
床の上に乗ることができました!しかし、床の側面に当たると床にくっついてしまってしまっています。
![](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_640,h_400/https://umistudioblog.com/wp-content/uploads/2023/10/StickyPlatform1.gif)
これは床の上側だけでなく、側面にも判定があることが原因です。そこで、上側だけに衝突判定があるように改良しましょう。
プレイヤーを床と一緒に動かす方法 改良版
床の上側に衝突判定用コライダーの追加
動く床にもう一つBox Collider 2Dコンポーネントを追加して、Is Triggerにチェックを入れておきます。
![](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_840,h_752/https://umistudioblog.com/wp-content/uploads/2023/10/image-25.png)
OffsetやSizeを調整して、床の上側に配置します。
![](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_1024,h_526/https://umistudioblog.com/wp-content/uploads/2023/10/image-26-1024x526.png)
あとは、床の上側のコライダー内に入ったときに、床と一緒に動くようにスクリプトを変更します。
スクリプト変更
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);
}
}
}
改良版の実行結果
床の側面に当たっても、床にくっつかなくなりました!
![](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_640,h_400/https://umistudioblog.com/wp-content/uploads/2023/10/StickyPlatform2.gif)
まとめ
ポイントをまとめます。
- 動く床の衝突判定用のコライダーを作成して、上側に配置する
- OnTriggerEnter2D、OnTriggerExit2Dを使用して衝突判定をする
- プレイヤーを床の子オブジェクトにすることで、一緒に動かせる
動く床も含め、2Dアクションゲームが簡単に作れるアセットはこちらです。
Corgi Engine – 2D + 2.5D Platformer