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

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

ただいまの
回答率

87.61%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,025

score 3

前提・実現したいこと

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

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

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

発生している問題

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

該当のソースコード

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

public void searchRoom(){
    selectedGameObject = null;
    ray = mainCamera.ScreenPointToRay(Input.mousePosition);
    if(Physics.Raycast(ray, out hit, 10000000, 1 << 10)){

        selectedGameObject = hit.collider.gameObject;
        itemList.add(selectedGameObject.name);//実行されていない?
        **Destroy(selectedGameObject);**//この部分は実行される

    }
}
public void add(string item_name){

        for(int i=0; i<btnList.Count; i++){
            string im_name = btnList[i].GetComponent<Image>().sprite.name;
            if(im_name == emptySymbol){
                btnList[i].GetComponent<Image>().sprite = Resources.Load("Image/" + item_name, typeof(Sprite)) as Sprite;
                break;
            }
        }

    }

試したこと

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

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

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

Unity 2019.3.15f1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

提示されている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/26 19:27

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

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • Unity初心者 脱出ゲームのアイテム欄実装で、アイテムを取ってもアイテム欄に反映されない