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

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

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

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

Unity

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

Q&A

3回答

814閲覧

Unity GetComponentについて

KotaroW

総合スコア4

C#

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

Unity

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

0グッド

0クリップ

投稿2021/04/20 06:13

編集2021/04/20 09:51

私は現在、playerとenemyが交互に攻撃しあうゲームを作成しております。

Unitクラスにhp、atkなどのパラメータを入れ、BattleMainSystemで、
Unitクラスのインスタンスplayerとenemyを制御しています。

新たに装備クラスを作成して、playerのhpを上げるステータス変化の実装を行いたいのですが、

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

と出てきてしまいます。staticでの方法も試しましたが、うまくいきません。どこに原因があるか教えていただけますでしょうか。

# Battleシーンのplayer(Unitクラスを保持)
![イメージ説明

Settingシーンの001(PanelControllerクラスを保持)

イメージ説明

Debug.Log(GameObject.Find("Player"));をUnitクラスでは

↓それぞれPlayer、Enemyという空オブジェクトにアタッチしています。

public class Unit : MonoBehaviour { public Slider HPbar; public int hp; public int hpMax = 100; public int atk = 10;

↓BattleMainSystemという空オブジェクトにアタッチしていて、それぞれには上記のオブジェクトを指定しています。

public class BattleMainSystem : MonoBehaviour { public Unit player; public Unit enemy;

↓ここが装備クラスでここで、playerのステータスを自由に変更したいです。

public class PanelController : MonoBehaviour{ void Start() { Debug.Log(GameObject.Find("Player").GetComponent<Unit>().hp); }

追記エラーコード

NullReferenceException: Object reference not set to an instance of an object PanelController.Start () (at Assets/Scripts/PanelController.cs:14)

14行目とは、Debug.Log(GameObject.Find("Player").GetComponent<Unit>().hp);の部分です。
おそらく装備クラスでインスタンスを作る必要があるのではないかと考えていますが、うまくいきませんでした。
過去のサイト等を参照させていただいたのですが、問題点がどこに当たるのかが分かりません。。。

追記
Debug.Log(GameObject.Find("Player").GetComponent<Unit>().hpMax);をBattleMainSystemクラスに仕込んでみたところ、予想される値が表示されました。装備(PanelController)クラスでのみエラーをはきます。

# Debug.Log(GameObject.Find("Player"));を入れたところ、UnitクラスとPanelControllerクラスで異なる。
イメージ説明![イメージ説明]

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

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

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

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

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

sakura_hana

2021/04/20 06:43

現状だと問題発生の可能性がある部分が多すぎて指摘できません。 エラーメッセージの続きの部分に原因箇所が書いてあるので確認してください(「at 問題のスクリプトファイル名:行数」という形式で書かれています)。もしくは全文をコピペして質問に追記してください。 また、自分で怪しい部分に「Debug.Log(nullになっている可能性のある変数);」として確認してみてください。 頻出質問なので過去の質問や関連サイトを調べるのも有効かと思います。(エラーメッセージでググれば情報がたくさん出ます)
KotaroW

2021/04/20 06:58

回答ありがとうございます!過去の質問をもっと掘り下げてみます
guest

回答3

0

このエラーは、「オブジェクトがアタッチされていないよ」というエラーです。

public GameObject 〇〇;

の〇〇の部分にオブジェクトがアタッチされている確認してください。

エラーとかは、その文をそのままググれば出ると思います!

投稿2021/04/21 14:05

RYUGONSP

総合スコア81

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

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

0

この情報で考えられるのは

  1. Playerオブジェクトの誤字("Prayer"とか"player"になっていないか?)
  2. PlayerオブジェクトにUnitをアタッチし忘れ

ですかね。
それぞれ適切に指定できているかスクショなり追記するといいかもです。

また、本題とはずれますがBattleMainSystemplayerを保持しているのであれば、

public class PanelController : MonoBehaviour{ public BattleMainSystem battleMainSystem; void Start() { Debug.Log(battleMainSystem.player.hp); } }

とするのもありかもしれません。

投稿2021/04/20 08:36

kimkim

総合スコア142

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

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

KotaroW

2021/04/20 09:02

回答ありがとうございます!1と2どちらも何度も確認しましたが、合っていました。 その方法を試してみたのですが、やはり同じエラーコードが出ました。装備クラスではない、Playerと同じシーンに存在する他クラスでは正しい値が得られたので、 BattleMainSystemとかPlayerとかと別シーンに存在することが原因ではないかと思っています。。。
guest

0

Nullが出てるということは参照取れてないので、とりあえず細かくしてログチェックが良いと思います。

エラーが原因が明確にDebug.Log(GameObject.Find("Player").GetComponent<Unit>().hp);であるというのなら

cs

1//Debug.Log(GameObject.Find("Player").GetComponent<Unit>().hp); 2var _player = GameObject.Find("Player"); 3var _player_unit = player.GetComponent<Unit>(); 4var _player_unit_hp = _player_unit.hp; 5 6Debug.Log("Player : " + _player); 7Debug.Log("Player Unit : " + _player_unit); 8Debug.Log("Player Unit Hp: " + _player_unit_hp);

みたいに3つに分けて、それぞれ参照取れているか調べます

投稿2021/04/20 07:43

hogefugapiyo

総合スコア3302

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

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

KotaroW

2021/04/20 08:04

回答ありがとうございます! 真ん中のvarで、The name 'player' does not exist in the current contextが出てしまいました。 _を付け加えても駄目でした。 おそらく装備クラスをアタッチしているものがクローンなのでそれが良くないのかなと思いました。。。
KotaroW

2021/04/20 08:17

そもそもシーンが異なるため、上手く反映されていないのでしょうか?
hogefugapiyo

2021/04/20 09:41

えっと、シーンがそれぞれ違うんですか? GameObject.Find(name); って【シーン上のアクティブなnameと完全一致するオブジェクトを探す】挙動なのでシーン上にアクティブなPlayerオブジェクトがないと参照は取れなかったりします ヒエラルキー(シーン)のスクショとかあるとよりわかりやすくなると思います。
KotaroW

2021/04/20 09:47

諸悪の根源それな気がしてまいりました。。。追記いたします。よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問