[UNITY]マリオの土管を作る。(ワープ)

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

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

コメント

タイトルとURLをコピーしました