- Unity 3D\2D手机游戏开发:从学习到产品(第4版)
- 金玺曾
- 829字
- 2023-09-26 17:09:10
1.7 读取资源和实例化
1.7.1 在脚本中创建一个Game Object
Unity中最基本的游戏元素是Game Object,在脚本中创建一个Game Object非常简单,只需要使用关键字new即可。
GameObject go = new GameObject("Game Object Name");
使用new的方式非常直接,但在Unity中只允许对一个空的Game Object使用关键字new进行创建,对于Prefab或模型等资源,读取和创建资源的方式更复杂一些。
1.7.2 通过序列化方式引用资源
一种读取资源的方式是,将引用资源的变量设为public,这样在编辑器中可以直接将该变量与资源进行关联,在实例化的时候不能使用new,而是使用Instantiate函数进行实例化,也就是对资源的复制,使用Destroy函数对资源进行删除。
这种引用资源方式的好处是资源管理由Unity来完成,坏处是比较依赖编辑器的设置。注意,在使用Destroy删除实例的时候会引起垃圾回收,对性能有一定影响,解决的方案是使用对象池减少资源的销毁和实例的重新创建,在本书后面的例子中会涉及到。
1.7.3 通过IO方式读取资源
在Unity中不能直接使用C#标准库中的IO函数读取Unity所需要的资源,而是必须将资源放入名为Resources的文件夹中,Unity允许有多个Resources文件夹且可以存放在工程中的不同位置,如图1-27所示。
图1-27 资源文件夹
下面的示例,先使用Resources.Load由Resources目录读取资源,再使用Instantiate实例化资源。
注意读取不同类型的资源,调用Load函数时要声明正确的类型,下面是一些示例:
GameObject go = Resources.Load<GameObject>("prefab名称"); Texture texture = Resources.Load<Texture>("贴图名称"); Sprite sprite = Resources.Load<Sprite>("sprite名称"); AudioClip clip = Resources.Load<AudioClip>("音效文件名称");
Resources.Load属于IO操作,对性能有较大的影响,最好将这类操作放到初始化或对性能要求不高的地方执行,不要在主逻辑循环中调用该函数。
Resources文件夹中的资源最后会被打包成一个专门的资源文件,Unity游戏启动时需要对该文件进行解析和管理,因此包含的资源越多,编译和启动Unity游戏的时间越长,通常不建议将体积较大的资源放入Resources目录中。基于这些特点,我们会发现由Resources读取资源的方式并不是特别可靠,但该种方式使用简单,适合快速实现和调试。
Unity还有另一种动态加载资源的方式,需要将资源制作成一种叫Asset Bundle的数据包,然后可以从网络或本地读取,这种方式的实现过程相对复杂,但很多时候不得不使用该种方式,在本书介绍关于Android开发的章节会有详细介绍。