1

在游戏开发方面,我相对较新,但我花了十几个小时研究如何使用可编写脚本的对象 (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);
}

问题:

  1. 如上面的 SpawnItem 所示,在运行时创建项目是否被认为是“hacky”?我是否必须手动将每个项目创建为预制件?
  2. 如果使用“资源”被认为是不好的做法,除了手动将每个项目拖到 ItemDatabase 脚本上之外,还有更好的解决方案吗?
4

0 回答 0