【バイオハザード風のゲームを作ってみよう。その16】
今回も下記動画をやっていきます。
今回は弾薬ボックスに近づくと矢印表示が出るようにしていきます。
・弾薬ボックスを配置し、その上に下矢印のイメージを作成します。
僕は、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
今回は以上です。