为什么我不能直接使用“ Resources.Load”结果?

时间:2020-09-06 03:21:24

标签: unity3d

Unity手册说Resources.Load将请求的资产作为对象返回。我想知道为什么我不能直接使用返回的Object。例如,我有一个Text预制件,我想将其实例添加到层次结构中,但是下面的代码不起作用

Text prefab;
private void Start()
{
    prefab = Resources.Load<Text>("Prefabs/Text");
    GameObject canvas = GameObject.Find("Canvas");
    prefab.transform.SetParent(canvas.transform);
}

我必须首先像下面这样Instantiate返回Resources.Load

Text prefab;
private void Start()
{
    prefab = Resources.Load<Text>("Prefabs/Text");
    GameObject canvas = GameObject.Find("Canvas");
    Text text = Instantiate(prefab);
    text.transform.SetParent(canvas.transform);
}

我不知道Instantiate结果和Resources.Load结果之间有什么区别,Instantiate的作用是什么,以便可以将其返回值添加到层次结构中。

原谅我可怜的英语!

1 个答案:

答案 0 :(得分:0)

要使用方法Instantiate(GameObject),您将编写一个新组件,创建一个GameObject类型的新变量,将该组件附加到GameObject上,然后在检查器中填充该变量。

要使用方法Instantiate(Resource.Load("object path")),您只需要预制的名称/路径。

如果您的游戏中有大量生成的零件(因此编辑器中没有放置游戏对象),这非常有用,如果您想避免使用Resource.Load,则需要一些“数据持有人” -gameobject”放置在几乎空旷的场景中。编辑使我的观点更清楚

如果您有大量不同的预制件,并且您的方法知道要构建的对象的名称,或者只是不想将所有这些预制件拖放到检查器窗口中,这也很有帮助

Resource.Load,从驱动器加载数据。您的游戏可能是从硬盘驱动器上进行的,这意味着要加载硬盘驱动器需要旋转的预制件,放置读取头等。

即使不需要资源,Instantiate本身也会很慢。LoadInstantiate并不是那么快。如果您经常需要(每秒多次),则应该考虑某种对象池1