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

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

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

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

Unity

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

Q&A

1回答

1365閲覧

アイテムをゲットした際、別のアイテムゲット画面が表示される

gariyaro

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2020/10/15 10:00

前提・実現したいこと

Unityで2Dアドベンチャーゲームを制作中の初心者です。言語はC#です。

アイテムの近くに立つと各アイテム毎の説明文が表示され、ボタンを押しアイテムを獲得するとアイテム名、アイテム画像、説明文が表示されたPanelが生成されるようにしたいのですが、同じアイテムの情報しか生成されません。

アイテムはscriptableobjectを使いItemデータを作り、同じくscriptableobjectで作ったItemDataBaseのItemListに各Itemをアタッチして管理しています。
イメージ説明
イメージ説明

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

ゲームが再生されると、GameControllerからItemPrefabに各Itemをアタッチされ生成されます。
インスペクター上ではアイテム名や説明文も正しく表示されているのですが、画面上では別のアイテムデータが表示されます。
ItemDataBaseのリスト(写真2)の登録順を入れ替えると表示されるデータも変更されたのでGameControllerのアイテム生成の方法に何か問題があると考えているのですが、前提となる知識や常識が欠けている可能性も考え相談させていただいた次第です。皆様のお知恵をお借りできればと存じます。

イメージ説明
イメージ説明
イメージ説明
イメージ説明

ソースコード:Item(Scriptableobject)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5 6//ProjectビューのCreateから新しくアイテムが創れる 7//ScriptableObjectを継承したアイテムを生成する為のスクリプト、ゲームオブジェクトに直接アタッチしない 8[CreateAssetMenu(fileName = "New Item", menuName = "ScriptableObject/Create Item")] 9public class Item : ScriptableObject 10{ 11 public enum KindOfItem 12 { 13 Item, 14 GetItem 15 } 16 17 //新規追加時のデータ名 18 //new public string name = "New Item"; 19 20 // アイテムの種類 21 [SerializeField] 22 private KindOfItem kindOfItem; 23 24 // アイテムのアイコン(sprite) 25 public Sprite icon = null; 26 27 // アイテムの名前 28 public string itemName; 29 30 // アイテムの情報 31 public string information; 32 33 public KindOfItem GetKindOfItem() 34 { 35 return kindOfItem; 36 } 37 38 public Sprite GetIcon() 39 { 40 return icon; 41 } 42 public string GetItemName() 43 { 44 return itemName; 45 } 46 public string GetInformation() 47 { 48 return information; 49 } 50 51} 52```### ソースコード:ItemDataBase(Scriptableobject) 53 54```C# 55using System.Collections; 56using System.Collections.Generic; 57using UnityEngine; 58 59//ItemDataBaseはゲームに登場するアイテムの情報をすべて保持しておく為のクラス 60[CreateAssetMenu(fileName = "ItemDataBase", menuName = "CreateItemDataBase")] 61public class ItemDataBase : ScriptableObject 62{ 63 64 [SerializeField] 65 private List<Item> itemLists = new List<Item>(); 66 67 // アイテムリストを返す 68 public List<Item> GetItemLists() 69 { 70 return itemLists; 71 } 72} 73 74```### ソースコード:ItemPrefab(Itemを格納する) 75 76```C# 77using System.Collections; 78using System.Collections.Generic; 79using UnityEngine; 80using UnityEngine.UI; 81 82public class ItemPrefab : MonoBehaviour 83{ 84 public Item item; 85 86 public Image itemImage; 87 [SerializeField] 88 private Text itemName; 89 [SerializeField] 90 private Text itemText; 91 [SerializeField] 92 private Text itemInformation; 93 94 public string Name; 95 public string Iteminfo; 96 97 public GameObject itemPanel; 98 GameObject player; 99 PlayerScript playerScript; 100 GameObject canvas; 101 GameObject ItemText; 102 103 void Start() 104 { 105 SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>(); 106 spriteRenderer.sprite = item.icon; 107 player = GameObject.Find("Player"); 108 playerScript = player.GetComponent<PlayerScript>(); 109 canvas = GameObject.Find("Canvas"); 110 itemName.text = item.itemName; 111 itemText.text = item.information; 112 itemInformation.text = item.information; 113 } 114 115 void Update() 116 { 117 } 118 private void OnTriggerStay2D(Collider2D collision) 119 { 120 if (playerScript.isTalk == true) 121 { 122 FlagManager.Instance.ItemList.Add(item); 123 124 GameObject prefab = (GameObject)Instantiate(itemPanel);//アイテムパネルの生成 125 prefab.transform.SetParent(canvas.transform, false);//ただ生成しても画面に映らないのでCanvasの中に収める 126 127 Text prefab2 = (Text)Instantiate(itemName);//アイテムネームの生成 128 prefab2.transform.SetParent(canvas.transform, false); 129 130 Image prefab3 = (Image)Instantiate(itemImage);//アイテムイメージの生成 131 prefab3.transform.SetParent(canvas.transform, false); 132 133 Text prefab4 = (Text)Instantiate(itemInformation);//アイテム情報の生成 134 prefab4.transform.SetParent(canvas.transform, false); 135 136 playerScript.characterState = PlayerScript.CharacterState.pose;//プレイヤーをポーズ状態に 137 playerScript.isTalk = false; 138 Destroy(gameObject); 139 } 140 } 141 private void OnTriggerEnter2D(Collider2D collision) 142 { 143 Text prefab5 = (Text)Instantiate(itemText);//アイテム説明文を生成して表示 144 prefab5.transform.SetParent(canvas.transform, false); 145 ItemText = GameObject.Find("ItemText(Clone)"); 146 playerScript.isTalk = false; 147 } 148 private void OnTriggerExit2D(Collider2D collision) 149 { Destroy(ItemText); } 150} 151```### ソースコード:GameController(ItemPrefabの生成を管理する) 152 153```C# 154using System.Collections; 155using System.Collections.Generic; 156using UnityEngine; 157 158public class GameController : MonoBehaviour//時間によるアイテムの生成やキャラクターの登場を管理するスクリプト 159{ 160 public ItemDataBase ItemDataBase; 161 [SerializeField] 162 private List<Item> itemLists = new List<Item>(); 163 public GameObject itemPrefab; 164 165 // Start is called before the first frame update 166 void Start() 167 { 168 itemLists = ItemDataBase.GetItemLists(); 169 Instantiate(itemPrefab, new Vector3(-20f, 0f, 0f), Quaternion.identity).GetComponent<ItemPrefab>().item = itemLists[0]; 170 Instantiate(itemPrefab, new Vector3(10f, 0f, 0f), Quaternion.identity).GetComponent<ItemPrefab>().item = itemLists[1]; 171 Instantiate(itemPrefab, new Vector3(20f, 0f, 0f), Quaternion.identity).GetComponent<ItemPrefab>().item = itemLists[2]; 172 Instantiate(itemPrefab, new Vector3(7f, 33f, 0f), Quaternion.identity).GetComponent<ItemPrefab>().item = itemLists[3]; 173 }

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

Unity 2019.4.1f1

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

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

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

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

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

guest

回答1

0

推測ですが以下のような流れになっているのではないかと。

  1. インスタンスが生成される(既にItemPrefabitemには何らかのデータが入っている)
  2. ItemPrefabクラスのStart()が発動し、itemName.text等にデータが入る。
  3. 〜.GetComponent<ItemPrefab>().item = itemLists[1];の部分が実行される。
  4. ItemPrefabitemが変更されるが、その後何もしていないのでitemName.text等の情報が更新されない。

なのでStart()から通常メソッドに変更、Item型の引数を取るようにして
〜.GetComponent<ItemPrefab>().Init(itemLists[1]);
とでもすれば動くのではないでしょうか。

投稿2020/10/16 05:36

sakura_hana

総合スコア11425

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問