質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2134閲覧

【Unity】実機の時だけメソッドが呼べない

takk_014

総合スコア53

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

2グッド

0クリップ

投稿2021/09/15 02:51

編集2021/09/15 03:02

閲覧いただきありがとうございます。
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で表示されます

chocomintboy256👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/09/15 03:08

GameOverメソッドの中の何かがnullなのでは?
takk_014

2021/09/15 04:07

GameOverメソッドの中身を全てコメントアウトして実行してみたものの同じエラーログが出てしまいました...
YAmaGNZ

2021/09/15 04:24

そうなのであれば、gameManagerを実際にnullチェックしてGameOverメソッドを実行するようにしてみてはどうでしょう?
takk_014

2021/09/15 06:29

すみません嘘でした、メソッドの最初の一行だけコメントアウトできていなかったです。 全てコメントアウトしたところエラーは出なくなりました。 原因としてはGameManagerのPlayer変数がnullだったためです。 なぜPlayer変数がnullになったかは今後調べていきますが、とりあえず表題は解決できてゲームオーバー画面を出せました。 そのためこのスレッドは閉じさせていただきます。 ご教授ありがとうございました。
guest

回答1

0

ベストアンサー

たまにあるのが、エディタと実機だとStartやAwakeの実行順序が違う場合があり、そのせいでどこかでNullエラーが起きているというパターンです。
必ずしもGameOverやGameManagerに問題があるとは限らないので、Logcat(MacならXcodeのログ)をみて何かがNullになっていないかをチェックする必要があります。

めんどくさいですが、例えば画面にデバッグ用のボタンを置いて、それ押したらGameOver直行するようにしてみて、実機でボタンを押したらゲームオーバーになるかどうかとか。切り分けてデバッグしていくのが愚直ながら早い気がします

投稿2021/09/15 04:30

hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takk_014

2021/09/15 06:32

ご回答ありがとうございます。 >StartやAwakeの実行順序が違う場合があり そんなことがあるのですね・・・ エラーの原因はGameManagerのplayer変数がnullだったことが判明しました。 しかし、player変数がnullになってしまった原因はそこにあるかも知れませんね。 今後そのことを頭に入れて調査していきます。 とりあえず表題については解決してゲームオーバー画面を出せたためこのスレッドは閉じさせて頂きます。 ご教授ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問