今、ProBuilderの練習として簡単な迷路作っているんですけど
やっている最中に、ふとマリオの土管みたいなワープ機能ほしいなーって思ったので作ってみました。
まず、簡単に手前の円柱を『円柱A』、奥の円柱を『円柱B』とします。
円柱Aにプレイヤーが触れたら円柱Bに移動させます。
円柱はIsTriggerにチェックを入れることで接触時にOnTriggerEnterメソッドを呼ぶことが可能になります
ワープ(Warp.cs)
public class Warp : MonoBehaviour { private GameObject obj; public Warp transObj; private Vector3 transVec; void Start() { //移動先(円柱B)の座標を取得する transVec = transObj.transform.position; } //物体と重なる瞬間呼ばれる void OnTriggerEnter(Collider other) { //重なったオブジェクトを取得 obj = GameObject.Find(other.name); //移動先(円柱B)の座標に移動する obj.transform.position = transVec; } }
これを円柱Aにアタッチしてあげて、transObj(移動先オブジェクト)に円柱Bをセットします。
すると
のように移動することができました。
しかし、一方通行ではなく円柱Bから円柱Aにも移動できるようにするならば工夫が必要です。
(円柱BにワープスクリプトをアタッチしてtransObjに円柱Aをセットする場合)
なぜなら移動直後に円柱BのOnTriggerEnterメソッドが発生するため、
無限ループに陥ります。
なので一度、円柱から離れないと、移動がおこらないよう以下のプログラムを書き足しましょう
ワープ(Warp.cs)
public class Warp : MonoBehaviour { private GameObject obj; public Warp transObj; private Vector3 transVec; //移動状態を表すフラグ public bool moveStatus; void Start() { transVec = transObj.transform.position; //初期では移動可能なためTrue moveStatus = true; } void OnTriggerEnter(Collider other) { obj = GameObject.Find(other.name); //自分が移動可能なとき移動する。 if (moveStatus) { //移動先は直後移動できないようにする transObj.moveStatus = false; obj.transform.position = transVec; } } //物体と離れた直後呼ばれる void OnTriggerExit(Collider other) { //移動可能にする。 moveStatus = true; }
これで一回離れないとワープが作動しないようになりました。
最後に、ProBuilder から Pipeを選択し、円柱を囲えば
完成です。
これだけで、めちゃくちゃゲームっぽくなって楽しいですね
コメント