【バイオハザード風のゲームを作ってみよう。その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キーを押下すると開く。
今回は以上です。