Unity2Dゲームで「すり抜ける床」の実装メモです。
例えばプレイヤーが床下からジャンプすると頭をぶつけずに、すり抜けて床に乗る感じですね。アクションゲームにありがちな機能ですね。
はじめに
「Unity 2020.3.26f1」ヴァージョンで作成しています。
2Dゲームで「プレイヤーがジャンプした時に、下からすり抜けて床に着地」出来るように実装していきます。
事前準備
まずはキー操作で動くプレイヤーと一番下の地面をセットします。下記が参考です。
実装開始
画面作成→スクリプト作成で行います。
画面作成
白い四角がプレイヤー、一番下の黒い部分が地面です。NomalFloorは通常の床、ThroughFloorをすり抜ける床にしていきます。

Playerオブジェクトは下記の様な感じ。

PlayerMoveスクリプトは下記の様な感じ。キーで左右に動いてスペースでジャンプします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { [SerializeField] private float PlayerSpeed; [SerializeField] private float jumpPower; [SerializeField] private LayerMask groundLayer; private Rigidbody2D _rigidbody; void Start() { _rigidbody = GetComponent<Rigidbody2D>(); } void Update() { float InputX = Input.GetAxisRaw("Horizontal"); if (Input.GetKey(KeyCode.Space) && isGrounded()) { _rigidbody.velocity = new Vector2(_rigidbody.velocity.x, jumpPower); } _rigidbody.velocity = new Vector2(InputX * PlayerSpeed, _rigidbody.velocity.y); } private bool isGrounded() { RaycastHit2D raycastHit = Physics2D.Raycast(transform.position, Vector2.down, 0.6f, groundLayer); return raycastHit.collider != null; } }
地面と、通常の床は下記。

すり抜ける床は色を少し変えておきます。

この状態で床下からジャンプすると、当然ですがボックスコライダーが設定しているのでぶつかります。

プラットフォームエフェクトを追加
すり抜ける床にしたいオブジェクトにPlatformEffector2Dをアタッチ、BoxCollider2Dのエフェクターで使用にチェックを入れます。
シーンビューを見ると半円状に衝突範囲が表示されます。この半円がコライダーの動作判定になります。
下記の場合、上からオブジェクトが来た場合はぶつかり、下からの場合は反応しないです。

実際に動かしてみて下記の様な動きになればOK

回転オフセットを180にすると、逆の動作となり、上からがすり抜けます。

これを利用する形で、下記スクリプトを作成してThroughFloorにアタッチ。
床に乗った状態で、下矢印キーを押すとプレイヤーが下にすり抜けます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ThroughFloor : MonoBehaviour { private PlatformEffector2D _platformEffector; void Start() { _platformEffector = GetComponent<PlatformEffector2D>(); } void Update() { if (Input.GetKey(KeyCode.DownArrow)) { _platformEffector.rotationalOffset = 180f; } if (Input.GetKey(KeyCode.Space)) { _platformEffector.rotationalOffset = 0f; } } }
下記の様な感じですね。
