Grow(仮) リフトを作る
雀荘です。
今回はリフトを作ります。
リフトとは、上下左右に移動する床のことです。
上下扉とかにも使えますし、2Dアクションの一つのお約束ですね。
制作には以下の記事を参考にさせていただきました。
やったことはほとんどこのままで
コードもコピペな内容なのですが……
まず手始めに、colliderを2つ作ります。
1つは物体のあたり判定用に。
2つ目(物体の上にうっすらと引いてやつ)は他の物体の接地判定用のやつです。
そして、2つ目のtriggerをtrueにしておきます。
これで準備完了です。
using UnityEngine; using System.Collections.Generic; public class Lift : MonoBehaviour { public Vector3 speed = Vector3.zero; //1フレームで動く距離(マイナスは逆方向) public Vector3 distance = Vector3.zero; //この距離まで動く //distanceまで動いた後に反対方向へ折り返して動くか? //falseだとdistanceまで動いたらそこで止る public bool turn = true; private Vector3 moved = Vector3.zero; //移動した距離を保持 private List<GameObject> ride = new List<GameObject>(); //床に乗ってるオブジェクト void Update() { //床を動かす float x = speed.x; float y = speed.y; float z = speed.z; if (moved.x >= distance.x) x = 0; else if (moved.x + speed.x > distance.x) x = distance.x - moved.x; if (moved.y >= distance.y) y = 0; else if (moved.y + speed.y > distance.y) y = distance.y - moved.y; if (moved.z >= distance.z) z = 0; else if (moved.z + speed.z > distance.z) z = distance.z - moved.z; transform.Translate(x, y, z); //動いた距離を保存 moved.x += Mathf.Abs(speed.x); moved.y += Mathf.Abs(speed.y); moved.z += Mathf.Abs(speed.z); //床の上のオブジェクトを床と連動して動かす foreach (GameObject g in ride) { Vector2 v = g.transform.position; g.transform.position = new Vector3(v.x + x, v.y + y); //yの移動は不要//////////// } //折り返すか? if (moved.x >= distance.x && moved.y >= distance.y && moved.z >= distance.z && turn) { speed *= -1; //逆方向へ動かす moved = Vector3.zero; } } void OnTriggerEnter2D(Collider2D other) { //床の上に乗ったオブジェクトを保存 ride.Add(other.gameObject); //Debug.LogError ("ride"); } void OnTriggerExit2D(Collider2D other) { //床から離れたので削除 ride.Remove(other.gameObject); } }
使用するにあたって
コメントで"yの移動は不要"と書かれた部分をyの移動も行うようにしました。
また、OnTriggerEnterの部分も2D仕様に変更。
これで2D仕様にひとまずはなりました。
今後はそういった上下移動を含む物体を、
このコードを参考に作らせていただきます。
違和感のないリフトがこんなに簡単にできるなんて!
昔C++で自作してた時はぜんぜんうまくいかず泣く泣く外してました。
Unityすごい
さっそく加圧スイッチを作ってみましたが新しい問題に直面することも……
しかしこのイベント用colliderという考え方はすごいな