動いている床の上に乗ったとき、床と一緒に動いていく仕組みを作ってみましょう。
2つのオブジェクトで親子関係を取り、床オブジェクトの影響を受けるように作成していきます。
ジャンプしたときは床の動きに影響を受けません。
動く床から落下したとき、親のスケールの影響を受けてオブジェクトが変形してしまう問題があります。
これを防止するには、スケールの影響を受けない空オブジェクトを親にする必要があります。
関連記事:
エレベーターをつくる
乗れば上昇していく床
乗れば下降していく床
行き帰りできるムービングウォーク
エリアに入れば自動で動く(ムービングウォーク)
階段を上るオブジェクト移動(SimpleMove)
親オブジェクトと子オブジェクトの取得
床オブジェクトの動き
Cubeオブジェクトを作成して、名前をFloorに変更します。
座標をすべて0にして、スケールを変更しました。
このようにオブジェクトが配置されています。
空のオブジェクトを作成します。
GameObject(空のオブジェクト)の中に、Floorを入れて、親子関係をつくります。
FloorMove.csを作成して、GameObjectに追加します。
FloorMove.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FloorMove : MonoBehaviour { int counter = 0; float move = 0.01f; void Update() { transform.Translate(new Vector3(move, 0, 0)); counter++; if (counter == 300) { counter = 0; move *= -1; } } } |
ゲームプレイして、Floorが動くことを確認しましょう。
プレーヤーのオブジェクト
Cubeオブジェクトを作成して、名前をPlayerに変更します。
Yを少し上げて、上から落下させるように置きました。
Playerにリジッドボディをつけておきます。
シーンビューではこのように配置されています。
動く床に乗るスクリプト
PlayerMove.csを作成し、Playerに追加します。
PlayerMove.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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); } } |
床に着地している時は、GameObject(空のオブジェクト)を親に。
床から離れると、親子関係から外れるしくみです。
ゲームプレイしてみましょう。
親子関係のONとOFFは、床と一緒に動かすために必須のスクリプトになります。
しかし、Floorを親するだけでは、落下したとき、親のスケールの影響でサイズ変更されてしまいます。
このように空のオブジェクトを利用すれば、落下時の変形も解決できます。
関連記事:
エレベーターをつくる
乗れば上昇していく床
乗れば下降していく床
行き帰りできるムービングウォーク
エリアに入れば自動で動く(ムービングウォーク)
階段を上るオブジェクト移動(SimpleMove)
親オブジェクトと子オブジェクトの取得