すり抜ける床を簡単に作成-PlatformEffector-【Unityゲーム作成】

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;
        }

    }
}

下記の様な感じですね。

タイトルとURLをコピーしました