はじめに
Unityでゲームを作っていると、プレイヤーが動いている床の上に乗った時、床と一緒に動くようにしたい場面がよくあります。この機能は、エレベーター、動く歩道、あるいはゲームの世界をリアルに感じさせるための要素として非常に役立ちます。
今回はUnityで動いている床の上に乗ったとき、床と一緒に動く仕組みの作り方について、初心者にもわかりやすく説明します。
基本概念: 親子関係
Unityにおけるオブジェクトの動きは、親子関係を使って簡単に管理できます。親オブジェクトが動くと、その子オブジェクトも一緒に動く仕組みです。
この概念を利用して、動く床を親オブジェクトとし、プレイヤーを子オブジェクトにすることで、床が動くとプレイヤーも一緒に動くように設定できます。
ステップ1: 動く床の作成
まずは動く床のオブジェクトを作成します。Unityのエディター内で、空のオブジェクトを作成し、その子オブジェクトに平面オブジェクトを作り、これを動く床とします。
平面オブジェクトには、簡単なアニメーションやスクリプトを使って動きを付けます。例えば、一定の範囲内を往復する動きや、回転する動きなどです。
動く床のスクリプト
スクリプトの解説:
moveDirection
: 床が動く方向。例えば、new Vector3(1f, 0f, 0f)
はx軸方向への動きを意味します。moveDistance
: 床が移動する距離。moveSpeed
: 床の移動速度。startPosition
: ゲーム開始時の床の位置。endPosition
: 床が移動する目標の位置。movingForward
: 床が前進しているかどうかを示すブール変数。
動作の仕組み:
- スクリプトが開始されると、
Start
関数によって床の初期位置(startPosition
)と終了位置(endPosition
)が計算されます。 Update
関数内でMoveFloor
関数が毎フレーム呼び出され、床が前進または後退するようにします。MoveFloor
関数では、床が設定した距離を移動すると方向を変えるようにしています。これにより、床が往復して動く効果が実現されます。
このスクリプトを使って、動く床を実装することができます。必要に応じて、moveDirection
、moveDistance
、moveSpeed
の値を調整して、望む動作を得てください。
このスクリプトはFloorの親オブジェクト(空のオブジェクト)にアタッチして使用します。
using UnityEngine;
public class MovingFloor : MonoBehaviour
{
public Vector3 moveDirection = new Vector3(1f, 0f, 0f);
public float moveDistance = 5f;
public float moveSpeed = 2f;
private Vector3 startPosition;
private Vector3 endPosition;
private bool movingForward = true;
void Start()
{
startPosition = transform.position;
endPosition = startPosition + moveDirection.normalized * moveDistance;
}
void Update()
{
MoveFloor();
}
void MoveFloor()
{
if (movingForward)
{
transform.position += moveDirection.normalized * moveSpeed * Time.deltaTime;
if (Vector3.Distance(transform.position, startPosition) >= moveDistance)
{
movingForward = false;
}
}
else
{
transform.position -= moveDirection.normalized * moveSpeed * Time.deltaTime;
if (Vector3.Distance(transform.position, endPosition) >= moveDistance)
{
movingForward = true;
}
}
}
}
ステップ2: プレイヤーの設定
プレイヤーのオブジェクトを作成し、動く床のオブジェクトの上に配置します。プレイヤーのオブジェクトには、操作を受け付けるためのスクリプトを付加しますが、この時点で床との親子関係は設定しません。
![](https://cbagames.jp/wp-content/uploads/2024/02/2024-02-09_190809.png)
ステップ3: 親子関係の動的な設定
プレイヤーが床の上に乗った瞬間に、床をプレイヤーの親オブジェクトとして設定する必要があります。これを実現するために、プレイヤーのスクリプトにトリガー検出の機能を追加します。プレイヤーが床と接触した時(例えば、OnCollisionEnter
イベント)、その床をプレイヤーの親オブジェクトに設定します(transform.SetParent
を使用)。
プレイヤーのスクリプト
このPlayerMove
スクリプトは、プレイヤーがマウスボタンをクリックした時に上方向に力を加えてジャンプさせる機能を持っています。
さらに、プレイヤーが「Floor」という名前のオブジェクト(この場合は動く床を想定しています)に接触した時に、そのオブジェクトを親に設定しています。これにより、床が動くとプレイヤーも一緒に動くようになります。床から離れると、親子関係を解除しています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
Rigidbody rb;
float upForce = 100f;
[SerializeField] GameObject parentObj;
void Start()
{
rb = GetComponent<Rigidbody>();
parentObj = GameObject.Find("GameObject");
}
void Update()
{
if(Input.GetMouseButtonDown(0))
rb.AddForce(new Vector3(0,upForce,0 ));
}
void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "Floor")
transform.SetParent(parentObj.transform);
}
void OnCollisionExit(Collision other)
{
if(other.gameObject.name == "Floor")
transform.SetParent(null);
}
}
プレイヤーにスクリプトをアタッチしてinspector画面からFloorの親オブジェクト(空のオブジェクト)を設定します。
![](https://cbagames.jp/wp-content/uploads/2024/02/2024-02-09_192139.png)
ステップ4: ジャンプ時の処理
プレイヤーがジャンプしたり、何らかの理由で床から離れたりした時、床との親子関係を解除する必要があります。これも、プレイヤーのスクリプトで検出し、プレイヤーが床から離れた瞬間に親子関係を解除します(transform.SetParent(null)
を使用)。
注意点
- 床とプレイヤーの間に正確な衝突検出を行うためには、両方のオブジェクトに
Collider
コンポーネントが必要です。 - プレイヤーが床と一緒に動くようにするためには、プレイヤーの物理演算を正確に管理する必要があります。プレイヤーに
Rigidbody
コンポーネントを追加し、適切な設定を行ってください。
まとめ
Unityで動いている床の上に乗った時、床と一緒に動く機能を実装する方法は、親子関係を動的に設定することで実現できます。この仕組みを理解しておくと、エレベーターや動く歩道など、ゲーム内で多様なインタラクティブなオブジェクトを作成する際に役立ちます。初心者でも簡単に試せるので、ぜひ挑戦してみてください。