動いている床の上に乗ったとき、床と一緒に動いていく仕組みを作ってみましょう。
2つのオブジェクトで親子関係を取り、床オブジェクトの影響を受けるように作成していきます。
ジャンプしたときは床の動きに影響を受けません。
動く床については、こちらの作成方法もあります。
関連記事:
【Unity C#】動く床の上で一緒に移動する(方法2)
【Unity C#】乗れば下降していく床
【Unity C#】エリアに入れば自動で動く(ムービングウォーク)
床オブジェクトの動き
Cubeオブジェクトを新規作成し、名前をFloorに変更。
座標をすべて0にして、スケールを変更しました。
このような形状で、配置されています。
Floorに動きをつけます。
FloorMove.csを作成し、Floorに追加します。
FloorMove.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FloorMove : MonoBehaviour { int counter = 0; float move = 0.01f; void Update() { Vector3 p = new Vector3(move, 0, 0); transform.Translate(p); counter++; if (counter == 300) { counter = 0; move *= -1; } } } |
プレイして、まずは往復運動を確認します
プレーヤーのオブジェクト
もう一つCubeオブジェクトを作り、名前をPlayerに変更。
Yを少し上げて、上から落とすように配置します。
このように配置しています。
Playerにリジッドボディをつけます。
親子関係を取る
PlayerSet.csを作成し、Playerに追加します。
PlayerSet.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 35 36 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerSet : MonoBehaviour { private Rigidbody rb; public float upForce = 100f; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { if(Input.GetMouseButtonDown(0)) { rb.AddForce(new Vector3(0,upForce,0 )); } } void OnCollisionEnter(Collision col) { if (transform.parent == null && col.gameObject.name == "Floor") { var emptyObject = new GameObject(); emptyObject.transform.parent = col.gameObject.transform; transform.parent = emptyObject.transform; } } void OnCollisionExit(Collision col) { if (transform.parent != null && col.gameObject.name == "Floor") { transform.parent = null; } } } |
プレイして動きを確認しましょう。
クリックでジャンプして、床に着地します。
new GameObject()により、親としての空のオブジェクト生成。
「空のオブジェクト」の子オブジェクトとなって、床と同一の動きを保ちます。
わざわざ「空のオブジェクト」を作成するのは、落下時の変形を防ぐためです。
床(Floor)を親とした場合、落下したときに親のスケールの影響を受けて、オブジェクトがゆがんでしまうことがあります。
ここでは、「空のオブジェクト」の子オブジェクトとなることで、Floorのスケールとの関連性を無くしています。
動く床の実装については、こちらの方法もあります。
関連記事:
【Unity C#】動く床の上で一緒に移動する(方法2)
【Unity C#】乗れば下降していく床
【Unity C#】エリアに入れば自動で動く(ムービングウォーク)