【バイオハザード風のゲームを作ってみよう。その21】

今回も下記動画をやっていきます。
youtu.be

今回はキー無し/キーありドアの開閉を実装していきます。

・ドア付きの部屋を用意します。私はCubeで簡易的なドアを作成しました。

・ドアオープンのアニメーションを作ります。これはドアの左下を軸に90度回転させるアニメーションです。

・キーを用意します。私はUnityアセットストアの"Key and Lock"を利用しました。なお、このアセットが以前のシェーダに対応している為、使っているURP(ユニバーサルレンダーパイプライン)に下記方法で変更します。

Unityはちゃんとコンバーターを用意してくれています。
まず、コンバートしたいマテリアルをすべて選択した状態にして、
Edit > Render Pipeline > Universal Render Pipeline > Upgrade Selected Materials to UniversalRP Materials
を選択します。

引用サイト:
qiita.com

・下記スクリプトを追加します。

public class DoorInteractable : InteractableObject //EP21追加 ドアにアタッチ
{
    [Header("Door")]
    [SerializeField] Animator doorAnimator;

    [Header("Lock Details")]
    [SerializeField] bool isLocked;
    [SerializeField] bool requiresKey;
    [SerializeField] string kyeID;

    SphereCollider DoorHitCollider;

    private void Awake()
    {
        DoorHitCollider = GetComponent<SphereCollider>();
    }

    protected override void OnTriggerEnter(Collider other)
    {
        base.OnTriggerEnter(other);
    }

    protected override void OnTriggerStay(Collider other)
    {
        base.OnTriggerStay(other);
    }

    protected override void OnTriggerExit(Collider other)
    {
        base.OnTriggerExit(other);
    }

    protected override void Interact(PlayerManager player)
    {
        base.Interact(player);
        //扉がロックされている場合
        if (isLocked)
        {
            //SEND:A UI POP UP("THIS DOOR IS LOKED")
            //OPTION 1:If player has key, we auto use the key
            //OPTION 2:Open Inventory snd make player manually select key

            //OPTION 1
            //If this door requires a key, and it is currently locked, we scan our players inventory for the correct item
            if (requiresKey && isLocked)
            {
                foreach (Item item in player.playerInventroyManager.itemsInInventory)
                {
                    //If the kye is present, we unlock the door
                    if (item.itemID == kyeID)
                    {
                        isLocked = false;
                    }
                }
            }
        }

        //If the door is unlocked, we open the door upon interaction
        if (!isLocked)
        {
            interactableCanvas.SetActive(false);
            //扉が開くアニメーションを実行
            doorAnimator.Play("Open Door");
            //扉が開いたらドアコライダーをoff
            DoorHitCollider.enabled = false;
        }
    }
}
public class Item : ScriptableObject //EP4追加。ScriptableObjectは基本的にゲーム中に変化しない値を登録しておくのに使うデータベースのようなもの
{
    [Header("Item Information")]
    public string itemName;
    public GameObject itemModel;
    public string itemID; //EP21追加
}
public class PlayerInventroyManager : MonoBehaviour //EP15追加 プレイヤーにアタッチ
{
    //THIS IS TEMP.
    //THIS WILL CHANGE DRAMATICALLY WHEN WE INTRODUCE RE STYLED INVENTORY SYSTEM
    public BoxOfAmmoItem currentAmmoInventory;

    //EP21追加
    //When we have our grid style inventory, this will serve as a list that will show every item we currently have in the gird inventory
    //This will be used for checks, for example reloading check this list to make sure ammo is present
    //Opening a door that requires a key will check this list to make sure the key is present
    public List<Item> itemsInInventory;
}
public class PickUpItemInteractable : InteractableObject //EP21追加 緑キーにアタッチ
{
    [SerializeField] Item item;

    protected override void OnTriggerEnter(Collider other)
    {
        base.OnTriggerEnter(other);
    }

    protected override void OnTriggerStay(Collider other)
    {
        base.OnTriggerStay(other);

    }

    protected override void OnTriggerExit(Collider other)
    {
        base.OnTriggerExit(other);
    }

    protected override void Interact(PlayerManager player)
    {
        base.Interact(player);

        //CHECK FOR SPACE

        //SELECT WHICH SLOT ON GRID ITEM WILL BE PLACED

        //キーをitemsInInventoryリストに加える
        player.playerInventroyManager.itemsInInventory.Add(item);
        //キーを削除する
        Destroy(gameObject);
    }
}
[CreateAssetMenu(menuName ="Items/kye Item")]
public class KyeItem : Item //EP21追加
{
    
}

プレイ動画です。
はじめにキー有り扉(緑マークの扉)の前でEnterキーを押下するが、キーが無いので開かない。→反対側のキー無し扉の前でEnterキーを押下すると扉が開く。→部屋の奥にキーがありEnterキーを押下すると取得できる。→キー有り扉の前でEnterキーを押下すると開く。

youtu.be

今回は以上です。