如何在运行时正确使用脚本对象创建项目?

问题描述

在游戏开发方面,我还比较陌生,但是我花了十几个小时来研究如何使用可脚本对象(SO)。

我不知道我的游戏将要包含多少个物品,所以我想尽可能地使物品制作过程自动化,以避免人为错误。我已经读过,使用可脚本编写的对象将信息存储在一个地方对性能有好处:

ItemData.cs

public class ItemData : ScriptableObject
{
    public int itemID;
    new public string name;
    public Sprite sprite = null;
}

接下来,我有一个gameObject,它将所有itemData加载到Awake上的字典中:

ItemDatabase.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的gameObject的函数:

//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脚本上,还有更好的解决方案吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)