(Unity)駅のホームドアの作成

  • 特定のキーを押すとドアが左右に開く
  • 別のキーを押すとドアが閉じる。

(スクリプトの作成)

<左ドア専用>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 左ドア専用
public class DoorMove_L : MonoBehaviour
{
    private int num = 0;
    public Vector3 targetPos1;
    public Vector3 targetPos2;

    void Update()
    {
        Vector3 pos = transform.position;

        if(Input.GetKeyDown(KeyCode.Y))
        {
            num = -1;
        }
        else if(Input.GetKeyDown(KeyCode.U))
        {
            num = 1;
        }

        // 「0」「1」「−1」を掛けることでドアの動きを制御する。
        transform.Translate(num * transform.right * Time.deltaTime * 1.5f);

        // 指定した位置で止める。
        if (pos.x < targetPos1.x)
        {
            // 0を掛けることで移動を停止する。
            num = 0;
            pos.x = targetPos1.x;
            transform.position = pos;
        }

        if(pos.x > targetPos2.x)
        {
            num = 0;
            pos.x = targetPos2.x;
            transform.position = pos;
        } 
    }
}

<右ドア専用>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 右ドア専用
public class DoorMove_R : MonoBehaviour
{
    private int num = 0;
    public Vector3 targetPos1;
    public Vector3 targetPos2;

    void Update()
    {
        Vector3 pos = transform.position;

        if(Input.GetKeyDown(KeyCode.Y))
        {
            num = 1;
        }
        else if(Input.GetKeyDown(KeyCode.U))
        {
            num = -1;
        }

        transform.Translate(num * transform.right * Time.deltaTime * 1.5f);

        if(pos.x > targetPos1.x)
        {
            num = 0;
            pos.x = targetPos1.x;
            transform.position = pos;
        }

        if(pos.x < targetPos2.x)
        {
            num = 0;
            pos.x = targetPos2.x;
            transform.position = pos;
        }
    }
}

(設定)

  • 左右のドアオブジェクトに対応したスクリプトを追加する。
  • ドアを止めたい位置(座標)を指定する。

 

 

  • 設定が完了したらゲームを再生
  • 「Y」ボタンでドアが左右に開く
  • 「U」ボタンでドアが閉じれば成功です。

 

 


<<ホームドアのモジュール化>>

  • モジュール化することで簡単に複製(量産)できるようになります。

(親子関係を使ってオブジェクトの改良)

 


(スクリプトの改良)

<左ドア専用>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 左ドア2
public class DoorMove_L2 : MonoBehaviour
{
    private int num = 0;
    private Vector3 targetPos1;
    private Vector3 targetPos2;

    void Start()
    {
        // このホームドアの最初の位置を取得する。
        Vector3 initialPos = transform.position;

        // ドアをどこまで移動させるかを決める。
        targetPos1.x = initialPos.x - 3;

        // ドアをどこに戻すかを決める。
        targetPos2.x = initialPos.x;
    }

    void Update()
    {
        Vector3 pos = transform.position;

        if(Input.GetKeyDown(KeyCode.Y))
        {
            num = -1;
        }
        else if(Input.GetKeyDown(KeyCode.U))
        {
            num = 1;
        }

        // 「0」「1」「−1」を掛けることでドアの動きを制御する。
        transform.Translate(num * transform.right * Time.deltaTime * 1.5f);

        // 指定した位置で止める。
        if(pos.x < targetPos1.x)
        {
            // 0を掛けることで移動を停止する。
            num = 0;
            pos.x = targetPos1.x;
            transform.position = pos;
        }

        if(pos.x > targetPos2.x)
        {
            num = 0;
            pos.x = targetPos2.x;
            transform.position = pos;
        }
    }
}

<右ドア専用>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 右ドア2
public class DoorMove_R2 : MonoBehaviour
{
    private int num = 0;
    private Vector3 targetPos1;
    private Vector3 targetPos2;

    private void Start()
    {
        Vector3 initialPos = transform.position;
        targetPos1.x = initialPos.x + 3;
        targetPos2.x = initialPos.x;
    }

    void Update()
    {
        Vector3 pos = transform.position;

        if (Input.GetKeyDown(KeyCode.Y))
        {
            num = 1;
        }
        else if (Input.GetKeyDown(KeyCode.U))
        {
            num = -1;
        }

        transform.Translate(num * transform.right * Time.deltaTime * 1.5f);

        if (pos.x > targetPos1.x)
        {
            num = 0;
            pos.x = targetPos1.x;
            transform.position = pos;
        }

        if (pos.x < targetPos2.x)
        {
            num = 0;
            pos.x = targetPos2.x;
            transform.position = pos;
        }
    }
}

(実行結果)

  • ホームドアを複製して確認してみましょう。