動く床の実装について、前回記事でも取り上げましたが、今回は別の方法でつくってみます。
前回記事:【Unity C#】動く床の上で一緒に移動する(方法1)
前回と動きはまったく同じなのですが、最初に床と空のオブジェクトの親子関係をつくっておく方法です。
動く床から落下したとき、親のスケールの影響を受けてオブジェクトが変形してしまう問題があります。
これを防止するには、スケールの影響を受けない空オブジェクトを親にする必要があります。
関連記事:
【Unity C#】乗れば下降していく床
【Unity C#】エリアに入れば自動で動く(ムービングウォーク)
床オブジェクトの動き
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 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; } } } |
ゲームプレイして、Floorが動くことを確認しましょう。
プレーヤーのオブジェクト
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 PlayerMove : MonoBehaviour { private Rigidbody rb; public float upForce = 100f; public GameObject gameObject; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { if(Input.GetMouseButtonDown(0)) { rb.AddForce(new Vector3(0,upForce,0 )); } } void OnCollisionEnter(Collision col) { if (col.gameObject.name == "Floor") { transform.SetParent(gameObject.transform); } } void OnCollisionExit(Collision col) { if (col.gameObject.name == "Floor") { transform.SetParent(null); } } } |
ゲームオブジェクトのフィールドに、GameObjectを入れます。
床に着地している時は、GameObject(空のオブジェクト)を親に。
床から離れると、親子関係から外れるしくみです。
ゲームプレイしてみましょう。
親子関係のONとOFFは、床と一緒に動かすために必須のスクリプトになります。
しかし、Floorを親するだけでは、落下したとき、親のスケールの影響でサイズ変更されてしまいます。
このように空のオブジェクトを利用すれば、落下時の変形も解決できます。
動く床については、こちらの作成方法もあります。
関連記事:
【Unity C#】乗れば下降していく床
【Unity C#】エリアに入れば自動で動く(ムービングウォーク)