動く床の実装について、前回記事でも取り上げましたが、今回は別の方法でつくってみます。
前回と動きはまったく同じなのですが、最初に床と空のオブジェクトの親子関係をつくっておく方法です。
関連記事:
エレベーターをつくる
乗れば上昇していく床
乗れば下降していく床
行き帰りできるムービングウォーク
エリアに入れば自動で動く(ムービングウォーク)
階段を上るオブジェクト移動(SimpleMove)
床オブジェクトの動き
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のスケールとの関連性を無くしています。
関連記事:
動く床の上で一緒に移動する(方法2)
エレベーターをつくる
乗れば上昇していく床
乗れば下降していく床
行き帰りできるムービングウォーク
エリアに入れば自動で動く(ムービングウォーク)
階段を上るオブジェクト移動(SimpleMove)