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

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

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

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

Unity

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

Q&A

解決済

1回答

2467閲覧

Unity初心者 脱出ゲームのアイテム欄実装で、アイテムを取ってもアイテム欄に反映されない

pppooo

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/25 19:59

前提・実現したいこと

類似の質問などを検索しても解決しなかったため、質問させていただきたいです。

http://teriyaki398.hatenablog.com/entry/2018/10/09/124336

上記のサイトを参考に、脱出ゲームを作ろうと考え、アイテム欄の実装を進めています。

発生している問題

記載の通りに手順を進めたのですが、最後の手順で、オブジェクトをクリックしても削除はされるのですがアイテム欄が全く更新されません。
参考元のサイトでは、オブジェクトをクリックするとクリックしたオブジェクトの名称を参照し、Resourcesフォルダ内から同名の画像ファイルを持ってきてButtonのSpriteを置き換えてくれる、ということになっているのですが、それが正しく行われません。

該当のソースコード

詳しくは参考元のサイトを参照していただきたいのですが、アイテムをクリックして取得することに大きく関係しているスクリプトは以下です。

C#

1public void searchRoom(){ 2 selectedGameObject = null; 3 ray = mainCamera.ScreenPointToRay(Input.mousePosition); 4 if(Physics.Raycast(ray, out hit, 10000000, 1 << 10)){ 5 6 selectedGameObject = hit.collider.gameObject; 7 itemList.add(selectedGameObject.name);//実行されていない? 8 **Destroy(selectedGameObject);**//この部分は実行される 9 10 } 11}

C#

1public void add(string item_name){ 2 3 for(int i=0; i<btnList.Count; i++){ 4 string im_name = btnList[i].GetComponent<Image>().sprite.name; 5 if(im_name == emptySymbol){ 6 btnList[i].GetComponent<Image>().sprite = Resources.Load("Image/" + item_name, typeof(Sprite)) as Sprite; 7 break; 8 } 9 } 10 11 }

試したこと

オブジェクトの名称と、Resources/Imageフォルダ内のSpriteの名称はしっかり一致させています。大文字と小文字なども確認しました。
参考元のサイトとはunityのバージョンが違うので、それが原因なのでしょうか(現在では使用できない記述がある、など)
クラスをうまく機能させられていないか、あるいはResources/Imageフォルダをうまく参照できていないかと考え、該当ワードで検索を繰り返しましたが解決には至りませんでした。

もし解決方法もしくは代替案などご存知の方がいましたら、知恵を貸していただきたく思います。
よろしくお願いいたします。

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

Unity 2019.3.15f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示されているaddの処理に問題があるようには見えないので、それより前のデザイナーでの作業に問題があるのではないでしょうか。以下、リンク先のページのコードも考慮に入れて対策を述べます。

(1) btnListに登録されている要素の数を確認する。
addの先頭(for文より前)にDebug.LogbtnList.Countを表示させ、Consoleに表示されるログを確認する。たとえば、
Debug.Log($"Count -> {btnList.Count}";とか。打つのが面倒ならDebug.Log(btnList.Count);でもいい。

もし、btnList.Countの値が0になっていれば、for文は一度も実行されないので画像が追加されないし、btnList.Countの値が0でなければ、原因はfor文の中の処理にあることがわかる。

(2) butList.Countの値しだいで変わる次の確認を行なう

(a) btnList.Countの値が0の場合
bntListに要素を追加している処理を確認する。

シングルトンを生成するItemList()の内容を見ると、GameObject.Findで見つけたオブジェクトをbtnListに追加するwhile文がある。オブジェクト名を "Button (0)", "Button (1)", ... と順に探しているので、実際のボタンのオブジェクト名がこの形式になっているか確かめる。

リンク先のページには、

今後のために、番号のついていないボタンButtonの名前をButton (0)に変えておく。

と書いてある。"Button (0)"が存在しないと、Findnullを返すので、それ以降のボタンもすべて追加されない。コピーでボタンを作成した場合、最初のボタンの名前は"Button (0)"ではなく"Button"なので、手作業で修正する必要がある。

(b) btnList.Countの値が0以外の場合
ボタンに「割り当てなしの画像」を初期値として割り当てているか確認する。

addのfor文の中を見ると、btnList[i].GetComponent<Image>().sprite.nameが、"no_image"と等しい場合、そのボタンの画像をアイテムのものに変更する処理を行なっている。
ということは、すべてのボタンの画像は、初期値として"no_image"(割り当てなしの画像)に設定しておかないといけない。
コードにはそれをしている部分が見あたらないので、リンク先の人はデザイナー画面でそれを行なっているはずで、よくよく読むと、

全てのボタンのテキストを消し、画像を変更してそれっぽくした。

と書いてある部分がそれに該当する。

投稿2020/06/25 21:13

編集2020/06/25 21:15
Daregada

総合スコア11990

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

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

pppooo

2020/06/26 10:27

btnList.Countの値が0であったので、ボタンのオブジェクトを確認したところ、"Button"を"Button (0)"に修正する際に、"Button(0)"と半角スペースを欠いた形になっていました。これを修正すると問題なく参考元の記事の通りに動作しました。 Debug.Logを用いた原因の箇所の特定方法など、大変分かりやすい解説を本当にありがとうございました。とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問