如何正确加载预制

时间:2019-01-25 08:53:39

标签: c# unity3d

我想通过其名称(和路径)实例化一个Prefab,它来自我的服务器,我的Assets文件夹,并且遇到了一些问题。 我发现这样做的多种方法:

var prefab = Instantiate(Resources.Load("prefabName")) as GameObject;

大多数线程建议这样做,但如here所述,您不应使用它。

var prefab = Instantiate(UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>(path));

这是我发现的第二种方法,但这仅在编辑器内部工作时有效。例如,将项目构建到WebGL会立即引发构建错误。

那么实例化预制件的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

为什么不简单地在MonoBehaviour中添加一个(可序列化的)字段:

[SerializeField] private GameObject myPrefab;

public GameObject MyPrefab;

在检查器中拖动您的预制件,然后在代码中将其拖到下面:

GameObject clone = Instantiate(myPrefab);

此方法的区别在于,预制件已预加载到内存中,即在实例化时从内存(而不是磁盘)读取内容。

答案 1 :(得分:2)

您是否正在将资产导入到已经构建的游戏中?还是您指的是项目中已经存在的资产?

因为如果您想在运行时导入,则可以使用AssetBundles。不幸的是,由于我没有与他们合作的真正经验,因此我无法真正为您提供帮助,但是我读过一些地方,许多移动开发人员都在开发游戏时使用它们来分配资产。

也许Asset Bundle Manual可以帮助您。

如果要实例化已在项目中的预制件,则可以使用Dictionary<string,GameObject>。像这样:

public Dictionary<string, GameObject> prefabDict = new Dictionary<string, GameObject>();


public void SpawnPrefabFromDict(string name)
{
    Instantiate(prefabDict[name]);
}

字符串作为键,然后指向其值-您的预制件!

希望这会有所帮助! 祝你好运!