前提・実現したいこと
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。