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

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

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

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

Q&A

解決済

2回答

745閲覧

UnityでエラーコードObject reference not set to an instance of an object

loKA

総合スコア15

Unity

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

0グッド

0クリップ

投稿2021/04/01 01:13

https://youtu.be/sPiVz1k-fEs
を参考にオンラインゲームを作っています。
Playerスクリプトに、

cs

1 2void Attack() 3 { 4 Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, attackRadius, enemyLayer); 5 foreach(Collider2D hitenemy in hitEnemies) 6 { 7 hitenemy.GetComponent<Player>().OnDamage(14); 8 } 9 }

で攻撃するメゾットと、

cs

1public void OnDamage(int damagePower) 2 { 3 healthPoint -= damagePower; 4 }

を用意して、Attack()を利用し、オンライン上の敵に攻撃したところ、

NullReferenceException: Object reference not set to an instance of an object>

と、public void OnDamage(int damagePower)
の行にエラーが起きました。
調べたところ hitenemy.GetComponent<Player>().OnDamage(14);
の記述が問題とか、いつの間にか治るとかありますが、解決策と原因を教えてください

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

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

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

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

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

ayousanz

2021/04/01 10:11

単純にPlayer.csをアタッチしているオブジェクトがないだけではないのでしょうか?
loKA

2021/04/01 10:33

あります
ayousanz

2021/04/01 12:16

ではhitenemy.GetComponent<Player>().OnDamage(14);をコメントアウトして,Debug.log(hitenemy.GetComponent<Player>())とかでnullかどうかを確かめてみてください
loKA

2021/04/02 04:26

Debug.Logしたら、 GamePlayer(Clone) (Player) UnityEngine.Debug:Log(Object) と出てきました。 GamePlayerはPlayerに設定してるUnity上での名前です
ayousanz

2021/04/02 06:59

では,そのDebugLogとエラー文のどうなっていますか? DebugLogが確認できる場合はPlayer.csはあるということになります 同じ感じでOnDamage()を呼び出してください
loKA

2021/04/02 08:55

同じ感じとはどういうことですか? エラー文は出ませんでしたが、.OnDamage(14);を追加すると最初と同じエラーがそのままでます
ayousanz

2021/04/03 12:46

言葉足らずでした. GetComponentでPlayerが呼べていて,OnDamageのみが呼び出せないということはOnDamageの中がおかしいことになると思います. その関数が正常に呼べているのかを確認してみてください
loKA

2021/04/04 09:35

foreach(Collider2D hitenemy in hitEnemies) { OnDamage(16);   } で相手にじゃなく、攻撃したら自分にくらうようにしたら自殺攻撃できます やはりGetComponent<>().ondamege()が無理なようで....
ayousanz

2021/04/04 10:47 編集

怪しそうなところがわかったので,その辺で原因を探してみてください さすがにこれ以上は上記のコード等からでは私にはわかりかねます..申し訳ないです
guest

回答2

0

ベストアンサー

取得したhitEnemiesの中に一つでもPlayerがアタッチされていないGameObjectがあると例外が発生します。GetComponentしたあと、nullチェックをしてみてください。

csharp

1 foreach(Collider2D hitenemy in hitEnemies) 2 { 3 var player = hitenemy.GetComponent<Player>(); 4 if(player != null) player.OnDamage(14); 5 }

投稿2021/04/12 12:25

takezoux2

総合スコア6

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

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

loKA

2021/04/14 08:19

if(player != null) player.OnDamage(14); の行に同じエラーがでます...
takezoux2

2021/04/14 12:53

それだとOnDamageメソッドの実装の方に問題ありそうですね healthPointがプロパティになってて、なにか他のobjectを参照しているとか無いですか? Playerクラスの実装もすべて書いてもらったほうが良いかと思います。
loKA

2021/04/17 07:37

OnDamage()の中に audioSource.PlayOneShot(damageSound); animator.SetTrigger("Hurt");とサウンドとアニメーターの設定をしていました。 これをコメントアウトして無効化したところうまく行きました。 どうすればaudioSouceやanimatorを設定できるんでしょうか...
takezoux2

2021/04/19 01:21

audioSourceやanimator変数は、自分で定義した定数ですよね? でしたら、 * GUIのペインのほうで、D&Dで参照を設定 * AwakeやStartなどで、GetComponentして代入しておく のどちらかが必要かと思います。
guest

0

GetComponentをCollider2Dから呼び出しているからではないでしょうか。
コライダー.gameObjectから呼び出してみてください。
または地形など他のものとの衝突が発生してそれにPlayerコンポーネントがアタッチされていない
などではないでしょうか。

投稿2021/04/09 10:56

AstraWalker

総合スコア9

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

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

loKA

2021/04/12 08:23

hitenemy.gameObject.GetComponent<Player>().OnDamage(16); にしても、同じようにエラーが起きました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問