RigidBodyオブジェクトの移動。動く床・壁のすり抜け【Unity】

今回はRigidBodyオブジェクトの移動についてです。動く床を作成したり、壁のすり抜けなどです。

はじめに

Unityのバージョンは2021.3.3f1です。

オブジェクトを動かす方法はいくつかあり、下記で何個か紹介しています。

今回は、RigidBodyをアタッチしたオブジェクトの移動についてのメモです。

実装開始

まずはアクションゲームなどでよく見る動く床のイメージ。

「2DObject」→「Sprites」→「Square」を追加。

スケールを変更して横長にします。

Rigidbody2Dをアタッチして、BodyTypeをKinemticにします。

下記のスクリプトを作成し、オブジェクトにアタッチ。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RigidBodyMove : MonoBehaviour
{
    private Rigidbody2D _rb;

    void Start()
    {
         _rb = GetComponent<Rigidbody2D>();
    }

     void FixedUpdate()
     {
          _rb.position = transform.position + transform.right * Time.deltaTime;
     }
}

FixedUpdete内で、Rigidbodyのポジションを変更をしています。実行すると右方向に動いていきます。

FixedUpdate内を下記の様にしても同じように動いている様に見えます。

        _rb.MovePosition(transform.position + transform.right * Time.deltaTime);

他オブジェクトへの影響

次に、下記の様に動く床の上にオブジェクトを乗せてみます。

追加したオブジェクトには下記の様にRigidbody2DとBoxCollider2Dをアタッチ。

動く床(Square)にもBoxCollider2Dをアタッチ。

下記がRigidBody.positonで動かした場合です。

自分自身の位置だけを変更しており、他のオブジェクトには何も影響していないです。

下記がMovePositionで動かした場合です。

MovePositonで動かした場合、他のオブジェクトに物理的な影響を与えています。

下の方が自然な動きですが、ゲームによっては上のような動きもありそうです。

壁のすり抜け

次は壁のすり抜けについてです。

分かりやすく、床のスケールを小さくして進行方向の途中に壁を設置します。

ゆっくり動く場合は問題ないですが、下記の様にスクリプトを変更して早く動かすと壁をすり抜けたり、意図しない動きとなる場合があります。

        _rb.MovePosition(transform.position + transform.right * 200 * Time.deltaTime);

移動ではなく位置を変更しているので、瞬間移動的な感じになり壁を抜けています。

すり抜けないようにするには、CollisionDetectionを「Continuous」にすればOK。

衝突検出を継続的にするので、瞬間移動の通った道も判定するという感じですね。

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