我想通过其名称(和路径)实例化一个Prefab,它来自我的服务器,我的Assets文件夹,并且遇到了一些问题。 我发现这样做的多种方法:
var prefab = Instantiate(Resources.Load("prefabName")) as GameObject;
大多数线程建议这样做,但如here所述,您不应使用它。
var prefab = Instantiate(UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>(path));
这是我发现的第二种方法,但这仅在编辑器内部工作时有效。例如,将项目构建到WebGL会立即引发构建错误。
那么实例化预制件的正确方法是什么?
答案 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]);
}
字符串作为键,然后指向其值-您的预制件!
希望这会有所帮助! 祝你好运!