閲覧いただきありがとうございます。
Unity(ver 2020.3.9f1)で作ったゲームをiPad(iOS14.6)に移植して実行してみました。
敵と接触した時に「GamaManager」の「GameOver」メソッドを呼び出してゲームオーバー画面を表示させたいです。
Unityのシミュレーター上ではメソッドが呼ばれて正常に表示できます。
しかし実機(iPad)ではGameOverメソッドが呼ばれなくてゲームオーバー画面が出てこないです。
敵と接触した時に下記のようなエラーが出ているためGameOverメソッドが呼べていないのが分かります。
Error
1NullReferenceException: Object reference not set to an instance of an object. 2 at GameManager.GameOver () [0x00000] in <00000000000000000000000000000000>:0 3 at EnemyController.OnCollisionEnter (UnityEngine.Collision other) [0x00000] in <00000000000000000000000000000000>:0
GameManager自体はgameManager変数に読み込めていることはログから確認できます。
下記は**Debug.log(gameManager);**のログです。
Log
1GameManager (GameManager) 2UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[]) 3UnityEngine.Logger:Log(LogType, Object) 4UnityEngine.Debug:Log(Object) 5EnemyController:OnCollisionEnter(Collision)
敵にアタッチしているスクリプトがこちらです。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.AI; 5using UnityStandardAssets.Characters.ThirdPerson; 6 7[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))] 8[RequireComponent(typeof(ThirdPersonCharacter))] 9 10public class EnemyController : MonoBehaviour 11{ 12 [System.NonSerialized] 13 public bool isActive = false; 14 15 [SerializeField] 16 Transform target; 17 18 [SerializeField] 19 Transform returnPoint; 20 21 [SerializeField] 22 Animator animator = null; 23 24 readonly int crushParamHash = Animator.StringToHash("Crush"); 25 26 private bool crushing = false; 27 28 NavMeshAgent agent; 29 ThirdPersonCharacter character; 30 31 GameManager gameManager; 32 KurokumaCharacterController player; 33 34 void Start () 35 { 36 gameManager = GameObject.FindGameObjectWithTag("GameController").GetComponent<GameManager>(); 37 agent = GetComponentInChildren<UnityEngine.AI.NavMeshAgent>(); 38 character = GetComponent<ThirdPersonCharacter>(); 39 agent.updateRotation = false; 40 agent.updatePosition = true; 41 player = GameObject.FindGameObjectWithTag("Player").GetComponent<KurokumaCharacterController>(); 42 } 43 44 private void Update() 45 { 46 if (isActive == true) 47 { 48 agent.isStopped = false; 49 if (target != null) 50 agent.SetDestination(target.position); 51 52 if (agent.remainingDistance > agent.stoppingDistance) 53 { 54 character.Move(agent.desiredVelocity, false, false); 55 } 56 else 57 { 58 character.Move(Vector3.zero, false, false); 59 } 60 } 61 else 62 { 63 agent.isStopped = false; 64 if (returnPoint != null) 65 agent.SetDestination(returnPoint.position); 66 67 if (agent.remainingDistance > agent.stoppingDistance) 68 { 69 character.Move(agent.desiredVelocity, false, false); 70 } 71 else 72 { 73 character.Move(Vector3.zero, false, false); 74 } 75 /* 76 character.Move(Vector3.zero, false, false); 77 agent.isStopped = true; 78 return; 79 */ 80 } 81 } 82 83 public void SetTarget(Transform target) 84 { 85 this.target = target; 86 } 87 88 //他のオブジェクトに接触したときの処理 89 void OnCollisionEnter(Collision other) 90 { 91 if(crushing == true) return; 92 93 if(other.gameObject.tag == "Player") 94 { 95 if(player.attackState == false) 96 { 97 if(TouchToGameOver.fallDownFlag == false) 98 { 99 //Invoke("callGameOver",1); 100 //callGameOver(); 101 Debug.Log("gameManager ="); 102 Debug.Log(gameManager); 103 /* こいつが実機で呼ばれない */ 104 gameManager.GameOver(); 105 } 106 TouchToGameOver.fallDownFlag = true; 107 isActive = false; 108 } 109 else 110 { 111 animator.SetBool(crushParamHash, true); 112 Invoke("destroyEnemy",1); 113 crushing = true; 114 } 115 } 116 } 117 void destroyEnemy() 118 { 119 Destroy (this.gameObject); 120 } 121 122 void callGameOver() 123 { 124 gameManager.GameOver(); 125 Debug.Log("ゲームオーバー"); 126 } 127 128 //検出範囲に入った時の処理 129 void OnTriggerStay(Collider other) 130 { 131 if(other.gameObject.tag == "Player") 132 { 133 isActive = true; 134 } 135 } 136 137 //検出範囲から出たときの処理 138 void OnTriggerExit(Collider other) 139 { 140 if (other.gameObject.tag == "Player") 141 { 142 isActive = false; 143 } 144 } 145}
実機ではInvokeは動作しないことは把握済みです。
こちらがGameManager内のGameOverメソッドです。
C#
1public void GameOver() 2 { 3 player.WriteMessage("ゲームオーバー..."); 4 if (isClear || isGameOver) 5 { 6 return; 7 } 8 9 isGameOver = true; 10 11 //★ここにゲームオーバー時の処理 12 //★追加2 13 //プレイヤーを止める 14 player.IsActive = false; 15 player.StopCharacter(); 16 //ゲームオーバー画面を出す 17 //Instantiate(gameOverCanvasPrefab); 18 GameObject parent = GameObject.Find ("GameOverParent"); 19 GameObject canvas = parent.transform.Find("iPadGameOverCanvas").gameObject; 20 canvas.SetActive(true); 21 }
どうすれば実機でもGameOverメソッドを呼び出すことができるでしょうか?
ヒントでも良いのでご教授お願い致します。
※ゲームオーバー画面のcanvasのサイズはiPadでも表示できるように調整してあり、初めからアクティブ状態を有効にした場合はiPadで表示されます
回答1件
あなたの回答
tips
プレビュー