今、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を選択し、円柱を囲えば

完成です。
これだけで、めちゃくちゃゲームっぽくなって楽しいですね



コメント