今回は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。
衝突検出を継続的にするので、瞬間移動の通った道も判定するという感じですね。
