在游戏开发方面,我相对较新,但我花了十几个小时研究如何使用可编写脚本的对象 (SO)。
我不知道我的游戏会有多少物品,所以我想尽可能地自动化物品制作过程以避免人为错误。我已经读过使用 Scriptable Objects 将信息存储在一个地方对性能有好处:
项目数据.cs
public class ItemData : ScriptableObject
{
public int itemID;
new public string name;
public Sprite sprite = null;
}
接下来,我有一个将所有 itemData 加载到 Awake 字典中的 gameObject:
项目数据库.cs
private Dictionary<int, ItemData> itemDB = new Dictionary<int, ItemData>();
void Awake()
{
LoadItems();
}
private void LoadItems()
{
//Load all itemData
ItemData[] itemData = Resources.LoadAll<ItemData>(itemDirectoryPath);
for(int i = 0; i < itemData.Length; i++)
{
//Set sprite of itemData, to avoid doing it manually
itemData[i] = SetSprite(itemData[i]);
//Add itemData to dataBase
itemDB[itemData[i].itemID] = itemData[i];
}
}
最后,我有一个在运行时创建指定 itemID 的游戏对象的函数:
//Create new gameobject at location
public void SpawnItem(int itemID, float x, float y)
{
//Get itemData
ItemData itemData = getItemData(itemID);
//Create new gameObject
GameObject gameObject = new GameObject();
//Set name of gameObject, add Item Script, and set position
gameObject.name = itemData.name;
gameObject.AddComponent<Item>().itemData = itemData;
gameObject.transform.position = new Vector3(x, y, 0);
}
问题:
- 如上面的 SpawnItem 所示,在运行时创建项目是否被认为是“hacky”?我是否必须手动将每个项目创建为预制件?
- 如果使用“资源”被认为是不好的做法,除了手动将每个项目拖到 ItemDatabase 脚本上之外,还有更好的解决方案吗?