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

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

youtu.be

今回は弾薬ボックスに近づくと矢印表示が出るようにしていきます。

・弾薬ボックスを配置し、その上に下矢印のイメージを作成します。
僕は、googleスプレッドシートで下矢印を作り、windowsのペイント3Dで背景を透明にしました。
win10labo.info

・Enterキー押下にアクションを設定。

・弾薬ボックスに近づくと矢印表示が出るようにする。また、矢印は常にカメラ正面となるようにする。
そして、Enterキー押下で今はコメントが表示されるようにします。

public class InteractableObject : MonoBehaviour //EP16追加 _INTERACTABLES直下のBox Of Ammo(9mm)にアタッチ
{
    //The base class for interractable objects, (Item, Doors, Ect)

    protected PlayerManager player; //The player interacting with the objects.
    [SerializeField] protected GameObject interactableCanvas; //The image indicating a player can interact with this objects
    protected Collider interactableCollider; //The collider enabling interaction when the player is enough for interaction

    protected virtual void OnTriggerEnter(Collider other)
    {
        //OPTIONAL: Check for specific layer of collider

        //playerがnullの場合
        if (player == null)
        {
            //PlayerManagerをゲット
            player = other.GetComponent<PlayerManager>();
        }
        //playerがnullではない場合
        if (player != null)
        {
            //canvasオブジェクトをONする
            interactableCanvas.SetActive(true);
            player.canInteract = true;
        }
    }

    protected virtual void OnTriggerStay(Collider other)
    {
       if(player.inputManager.InteractionInput)
        {
            Interact(player);
            player.inputManager.InteractionInput = false;
        }
    }

    protected virtual void OnTriggerExit(Collider other)
    {
        //OPTIONAL: Check for specific layer of collider

        if (player == null)
        {
            player = other.GetComponent<PlayerManager>();
        }

        if (player != null)
        {
            interactableCanvas.SetActive(false);
            player.canInteract = false;
        }
    }

    protected virtual void Interact(PlayerManager player)
    {
        Debug.Log("You have interacted");
    }
}
public class BillboardWorldUI : MonoBehaviour //EP16追加 _INTERACTABLES直下のInteractable Canvasにアタッチ
{
    Camera mainCamera; //main cameraオブジェクトを代入する変数

    private void Awake()
    {
        //main cameraオブジェクトを代入
        mainCamera = Camera.main;
    }

    private void LateUpdate()
    {
        if (mainCamera != null)
        {
            //アイテム発見時の↓が常にカメラ正面になるよう向きを調整
            transform.LookAt(mainCamera.transform.position + mainCamera.transform.forward);
        }
    }
}
public class InputManager : MonoBehaviour
{
 (省略)
 public bool InteractionInput; //EP16追加 PlayerActionsのInteractアクションのtrue/falseを代入

private void OnEnable() //OnEnableはオブジェクトが有効になったときに呼び出されます.
    {
        if(playerControls == null)
        {
            playerControls = new PlayerControls();

            //アクション実行中コールバック
           (省略)          
            // PlayerActionsのInteractアクションの指定ボタンが押下された場合、InteractionInput = trueにする
            playerControls.PlayerActions.Interact.performed += i => InteractionInput = true; //EP16追加

        }

        playerControls.Enable();
    }

 public void HandleAllInputs()
    {
        (省略)
        HandleInteractionInput(); //EP16追加
    }

 //EP16追加
    private void HandleInteractionInput()
    {
        //Enterキーが押下された場所が弾薬ボックス前ではない場合、 InteractionInput = falseにする
        if (InteractionInput)
        {
            if (!player.canInteract)
            {
                InteractionInput = false;
            }
        }
    }
}
public class PlayerManager : MonoBehaviour
{
 (省略)
 public bool canInteract; //EP16追加 プレイヤーが弾薬ボックスのコライダーに触れている場合true、触れていない場合false
}

プレイ動画はこんな感じです。
youtu.be

今回は以上です。