今回はUnityの2Dゲームで「すり抜ける床」を簡単に実装してみます。
プレイヤーが床下からジャンプすると頭をぶつけずに、すり抜けて床に乗る感じですね。アクションゲームにありがちな機能ですね。
はじめに
Unityのバージョンは2021.3.14f1です。
PlatformEffectorを利用して簡単に作成していきます。すり抜ける床を実装しますが、床に関する挙動を制御することが出来ます。
実装開始
UI作成→スクリプト作成の順番で行います。
プレイヤーと地面の作成
Hierarchyで右クリックし「2DObject」→「Sprites」→「Square」を選択、2つ作成します。

一つはPlayerとして、BoxCollider2D、Rigidbody2D、Playerスクリプトをアタッチします。

Playerスクリプトの中身は下記にします。横移動とスペースキーでジャンプができるようになります。
using UnityEngine;
public class Player : MonoBehaviour
{
private float _Speed = 5.0f;
private float _JumpPower = 10.0f;
private Rigidbody2D _rb;
private void Awake()
{
_rb = GetComponent<Rigidbody2D>();
}
void Update()
{
float inputX = Input.GetAxisRaw("Horizontal");
if (Input.GetKey(KeyCode.Space) && _rb.velocity.y == 0)
{
_rb.velocity = new Vector2(_rb.velocity.x, _JumpPower);
}
_rb.velocity = new Vector2(inputX * _Speed, _rb.velocity.y);
}
}
もう一つはGroundとし、スケール、色を変更。BoxCollider2Dをアタッチします。

実行してみて、横移動、ジャンプができればOK。

床を作成
Hierarchyで右クリックし「2DObject」→「Sprites」→「Square」を更に2つ追加します。
一つは「NormalFloor」と言う名前にし、スケールを変更、BoxCollider2Dをアタッチ。

もう一つは「ThroughFloor」と言う名前にしスケール、色を変更、BoxCollider2Dをアタッチします。

実行すると下記のような感じに。BoxColliderをセットしてあるので、下からジャンプするとぶつかり、上から乗ることが出来ます。

プラットフォームエフェクトを追加
すり抜ける床にしたいオブジェクトにPlatformEffector2Dをアタッチ、BoxCollider2Dの「UsedByEffector」にチェックを入れます。

シーンビューを見ると半円状に衝突範囲が表示されます。この半円がコライダーの動作判定になります。上からオブジェクトが来た場合はぶつかり、下からの場合は反応しないです。
実際に動かしてみて下記の様に、下からはすり抜けて、上からは抜けなければOK

「RotationalOffset」を180にすると、逆の動作となり、上からすり抜けます。

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

