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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

1回答

2460閲覧

Unity アクセスしようとしたオブジェクトが破棄されている

st1890

総合スコア3

C#

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2020/07/22 14:18

編集2020/07/22 15:08

前提・実現したいこと

神経衰弱ゲームを制作中です。
場のカードが全てなくなると、カードを再配布してゲームを継続させる機能を実装しようとしています。
現在、カードの再配布まではできているのですが、二週目のペアが揃った時のカード透過処理がうまくできていません。
透過処理にはCanvas Groupを使用しています。

対処方法をご教示いただきたいです。
よろしくお願いします。

発生している問題・エラーメッセージ

MissingReferenceException: The object of type 'CanvasGroup' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. Card.SetInvisible () (at Assets/Script/Card.cs:104) CardCreateManager.HideCardList (System.Collections.Generic.List`1[T] containCardList) (at Assets/Script/CardCreateManager.cs:126) GameSceneManager.Update () (at Assets/Script/GameSceneManager.cs:48)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using UnityEngine.UI; 6 7public class GameSceneManager : MonoBehaviour 8{ 9 10 public CanvasGroup CanvasGroup; 11 12 //一致したカードリスト 13 private List<int>mContainCardIdList = new List<int>(); 14 15 //カード生成マネージャークラス 16 public CardCreateManager CardCreate; 17 18 public Card Card; 19 20 void Start (){ 21 22 //一致したカードIDリストを初期化 23 this.mContainCardIdList.Clear(); 24 25 //カードリストを生成する 26 this.CardCreate.CreateCard(); 27 } 28 void Update() 29 { 30 31 //選択したカードが二枚以上になったら 32 if(GameStateController.Instance.SelectedCardIdList.Count >= 2){ 33 34 //最初に取得したCardIDを取得する 35 int selectedId = 36 GameStateController.Instance.SelectedCardIdList[0]; 37 38 //二枚目にあったカードと一緒だったら 39 if(selectedId == 40 GameStateController.Instance.SelectedCardIdList[1]){ 41 42 Debug.Log($"Contains!{selectedId}"); 43 //一致したカードIDを保存する 44 this.mContainCardIdList.Add(selectedId); 45 } 46 47 //カードの表示切り替えを行う 48 this.CardCreate.HideCardList(this.mContainCardIdList);  //48行目 49 50 //選択したカードリストを初期化する 51 GameStateController.Instance.SelectedCardIdList.Clear(); 52 } 53 54       //カードの再配布処理 55 if(this.mContainCardIdList.Count>= 3){ 56 //this.Card.OffInvisible();     //CanvasGroupのアルファ値を1にするメソッドを用意してみた・・・失敗 57 //this.CanvasGroup.alpha = 1;    //直接アルファ値を指定してみた・・・失敗 58 mContainCardIdList.Clear(); 59 this.CardCreate.CreateCard(); 60 Debug.Log("Count3 OK!"); 61 } 62 } 63}

C#

1 //48行目で呼び出そうとしている処理 2 //取得していないカードを背面にする 3 public void HideCardList(List<int>containCardList){ 4 5 foreach(var _card in this.CardList){ 6 7 //既に獲得したカードのIDの場合、非表示にする 8 if(containCardList.Contains(_card.Id)){ 9 10 //カードを非表示にする 11 _card.SetInvisible();       //126行目 12 } 13 14 //獲得していないカードは裏面表示にする 15 else{ 16 //カードを裏面表示にする 17 _card.SetHide(); 18 } 19 } 20 }

試したこと

CanvasGroupのアルファ値を1にするメソッドを用意してみた・・・失敗
直接アルファ値を指定してみた・・・失敗

補足情報(FW/ツールのバージョンなど)

Unity.2019.2.9f1

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

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

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

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

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

guest

回答1

0

問題のエラーは GameSceneManager.cs の 48 行目で起きていて、CanvasGroup 型のオブジェクト変数に対してメソッド呼び出しやプロパティへのアクセスなどの操作をしようとしているけど、そこに格納したオブジェクトはもう破棄されちゃっててないのでその処理はできませんよ、ということを言っています。

だからまず確認すべきことはエラーが起きた時に割り当てたオブジェクトが Hierarchy 上に存在しているかどうか、です。既に破棄されているので存在していないのですが、次に考えることはどうしてそのオブジェクトが破棄されたのか、ということです。

アルファ値がどうこうというのは関係ありません。

投稿2020/07/22 14:25

bboydaisuke

総合スコア5308

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

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

bboydaisuke

2020/07/22 14:26

48行まで数えるのは面倒だったのでソースは見ませんでしたが、どの行でエラーが出たのかは行数を数えなくてもわかるように質問するとよいでしょう。
st1890

2020/07/22 15:07

回答ありがとうございます。 質問の仕方についてのアドバイスもありがとうございます。 ソースの提示を修正いたしました。 裏表の切り替え処理がうまく行っていないのでアルファ値が関係しているのでは?と思っていました。 エラーが出たときにHierarchy上にオブジェクトは残っていました。 オブジェクトの破棄をしたつもりはないのですが、カードを一度非表示にしたときに破棄された扱いとなっているのでしょうか?
bboydaisuke

2020/07/22 15:09

> エラーが出たときにHierarchy上にオブジェクトは残っていました。 Inspector から見える「アサインしたはずの」該当オブジェクトの表示はどうなっていますか?None になっていませんか?
st1890

2020/07/22 15:24

Noneになっている箇所はなさそうです。
bboydaisuke

2020/07/22 15:33

> MissingReferenceException: The object of type 'CanvasGroup' has been destroyed but you are still trying to access it. > Your script should either check if it is null or you should not destroy the object. > Card.SetInvisible () (at Assets/Script/Card.cs:104) エラーは Card.cs:104 で起きてますね。ここでアクセスしているオブジェクトが「既に破棄されたオブジェクト」なのでそれを調べてみてください。
st1890

2020/07/22 23:12

下記はCard.csからの一部抜粋です。 CanGroupが破棄されたことになっているようです。 //透過処理用 public CanvasGroup CanGroup; public void SetInvisible(){ //選択済設定にする this.mIsSelected = true; //アルファ値を0に設定する this.CanGroup.alpha = 0;  //104行目 Debug.Log("SetInvisible OK"); }
bboydaisuke

2020/07/23 04:49

もし最初からシーンに置いてある CanGroup をインスペクタから設定しているがそのオブジェクトはプレハブとして実行中に生成しているなら、そういうことはできないのできちんと見直した方がよいです。とにかくそこで操作しているオブジェクトはもうないので、どうやってそれを取得しているのか、それは SetInvisible のタイミングで失われたのか、それとも Start() の時点でもう null なのか、など「動作を調べる」ことをしないとダメです。「調べる」というのはコードを見ることではなく、Debug.Log() やデバッグ実行を使って動作中に何が起きているのかを「調べる」ということで、それが必要です。
st1890

2020/07/24 07:08

ありがとうございます。 調べて原因を特定できるようにやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問