【问题标题】:How to load prefab properly如何正确加载预制件
【发布时间】:2019-03-22 08:05:06
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 如您所见,第二种方法使用“UnityEditor”作为资产来源。这是有道理的,它在编辑器之外不起作用。

标签: c# unity3d


【解决方案1】:

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

[SerializeField] private GameObject myPrefab;

public GameObject MyPrefab;

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

GameObject clone = Instantiate(myPrefab);

这种方法的不同之处在于您的预制件是预加载在内存中的,即当您实例化时,您从内存(而不是磁盘)读取。

【讨论】:

  • 问题是,prefabs 的名字来自服务器,所以 Unity 在运行时不会知道它的名字。
  • 网络方面的事情我帮不上什么忙。只是一个我没有任何实际经验的想法:也许预加载所有预制件(或更好的加载/卸载仅包含当前可能选项的捆绑包),然后有一些系统从服务器获取名称并返回当前预制件参考。或者干脆使用你的第一种方法。它再次归结为内存/性能权衡。
  • 服务器的东西很简单,这不是问题。我所需要的只是按其名称加载预制件的正确方法。
【解决方案2】:

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

因为如果您想在运行时导入,您可以使用 AssetBundles。不幸的是,我无法真正帮助您,因为我没有与他们合作的实际经验,但我在某处读到许多移动开发者使用它们在游戏发布时分发他们的资产。

也许Asset Bundle Manual 可以帮助您。

如果您想实例化已经在您的项目中的预制件,您可以使用Dictionary&lt;string,GameObject&gt;。像这样:

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


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

字符串作为键然后指向它的值——你的预制件!

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

【讨论】:

  • 但是当我作为 WebGL 运行时如何获取 GameObject?
  • 我不太确定您所说的“获取游戏对象”是什么意思。能详细解释一下吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多