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

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

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

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

Q&A

1回答

661閲覧

MissingReferenceException:タイプ

Fuwa

総合スコア49

C#

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

0グッド

0クリップ

投稿2022/01/19 21:37

編集2022/01/20 02:01

このエラーの意味はわかるのですが治し方がわかりません治し方を教えてください。

エラー内容
MissingReferenceException:タイプ 'EnamyManager'のオブジェクトは破棄されましたが、まだアクセスしようとしています。
スクリプトは、それがnullかどうかをチェックするか、オブジェクトを破棄しないようにする必要があります。
EnamyManager.Damage(System.Int32ダメージ)(Assets / Scrips / Quest / EnamyManager.cs:46)
PlaterManager.Attack(EnamyManager enamy)(Assets / Scrips / Quest / PlaterManager.cs:19)
BattleManager.PlayerAttckU()(Assets / Scrips / Quest / BattleManager.cs:96)
Eanamy2.OnTap2()(Assets / Scrips / Quest / Eanamy2.cs:65)

EnamyManager

private void Awake() { sphere = GameObject.Find("Sphere "); } Action tapAction; // クリックされたときに実行したい関数(外部から設定したい ) public new string name; public int hp; public int at; public GameObject hitEffect; public int Attack(PlaterManager player) { int damage = player.Damage(at); return damage; } public int Damage(int damage) { Instantiate(hitEffect, this.transform, false); //エラーが出てる場所 transform.DOShakePosition(0.3f,0.5f , 20, 0, false, true); //エラーが出てる場所 hp -= damage; Debug.Log("EnamyのHPは" + hp); if(hp <= 0) { hp = 0; } return damage; } public void addEventListenerOnTap(Action action) { tapAction += action; } public void OnTap() { Debug.Log("クリックされた"); tapAction(); }

}

Eanamy2

//tapActionに関数を登録する関数
public void addEventListenerOnTap(Action action)
{

tapAction += action; } //クリックしたら public void OnTap2() { Debug.Log("クリックされた"); tapAction();//エラーが出てる場所 }

}

PlaterManager

public int Attack(EnamyManager enamy)
{

int damage = enamy.Damage(at); //エラーが出てる場所 return damage; } public int Attack2(Eanamy2 eanamy2) { int damage = eanamy2.Damage2(at); return damage; } // ダメージ受ける関数 public int Damage(int damage) { hp -= damage; Debug.Log("PlayerのHPは" + hp); if (hp <= 0) { hp = 0; } return damage; }

BattleManager

public void Setup(EnamyManager enamyManager)
{
//BGM
SoundManager.instace.PlayBGM("Battle");
//

enamyUI.gameObject.SetActive(true); enamy = enamyManager; //enamy ↓の関係 enamyUI.SetupUI(enamy); playerUI.SetupUI(player); //EnamyUImanagerのaddEventListenerOnTapの引数にPlayerAttckUを入れる enamy.addEventListenerOnTap(PlayerAttckU); //DOMove移動五秒かけて // enamy.transform.DOMove(new Vector3(0, 10 , 0), 5f); } //初期設定 public void Setup2(Eanamy2 eanamy2z) { //BGM SoundManager.instace.PlayBGM("Battle"); // enamyUI.gameObject.SetActive(true); eanamy2 = eanamy2z; //enamy ↓の関係 enamyUI.SetupUI(eanamy2); playerUI.SetupUI(player); //EnamyUImanagerのaddEventListenerOnTapの引数にPlayerAttckUを入れる eanamy2.addEventListenerOnTap(PlayerAttckU); //DOMove移動五秒かけて // enamy.transform.DOMove(new Vector3(0, 10 , 0), 5f); } void PlayerAttckU() { //コルーチンを停止 StopAllCoroutines(); //テキスト送り //音を鳴らすキック SoundManager.instace.PlaySE(1);

int damage = player.Attack(enamy); //エラーが出てる場所

enamyUI.UpdateUI(enamy); DialogTextManager.instance.SetScenarios(new string[] { "プレイヤーの攻撃\nモンスターに"+damage+"ダメージを与えた" }); if (enamy.hp <= 0) { StartCoroutine(EndBatle()); } else { StartCoroutine(EnemyTurn()); } } void PlayerAttckU2() { StopAllCoroutines(); SoundManager.instace.PlaySE(1); int damage = player.Attack2(eanamy2); //UI表示 enamyUI.UpdateUI2(eanamy2); DialogTextManager.instance.SetScenarios(new string[] { "プレイヤーの攻撃\nモンスターに" + damage + "ダメージを与えた" }); if (eanamy2.hp <= 0) { StartCoroutine(EndBatle()); } else { StartCoroutine(EnemyTurn2()); } }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/01/20 00:54

Unity の話ですよね? であれば Unity のタグをつけてください。 Unity に興味のある人の目を引いて回答が得やすくなるという質問者にとってのメリットがあるし、逆に Unity に興味のない閲覧者にとっては開いて読む手間が省けるというメリットがあります。
Fuwa

2022/01/20 02:51 編集

教えていただきありがとうございます。
guest

回答1

0

エラーメッセージに書いてある通りですね。
該当行で EnamyManager 型のインスタンスを呼び出して操作しているけど、そのインスタンスは既に破棄されている (Destroy されたとか、エディター上で Delete されたとか)ので、それは不正な操作ですよ、ということです。
まだ操作したいなら破棄してはいけないし、破棄するのが正しいのであればアクセスする前に null チェックして null だったら命令を呼び出さないようにしないと、エラーになります。

投稿2022/02/28 09:19

bboydaisuke

総合スコア5275

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問