欢迎来到杨杰的博客

Unity预制体

Unity预制体


技术概述

unity预制体是用来创建和存储一个游戏对象的所有组件,各项属性和子对象。当需要多次重复使用同一个游戏对象时,便可以使用预制体,将该游戏对象设置为预制体。学习该技术的原因在团队项目过程中需要根据房间数量自动创建房间列表,以及棋盘中每个格子的创建。
该技术的难点在于对预制体属性的配置。


技术详述

预制体的创建

首先搭建自己所需要的可能重复使用的游戏对象,搭建完后将其拖进Prefabs文件夹中,预制体便创建完成。

预制体实例化

当创建完预制体之后,我们便要对其进行使用。使用方法分为两种。
一是通过将其直接拖进Scene中,便创建了一个与其组件、属性和子对象都相同的Clone游戏对象。

二是通过c#脚本代码实例化。

 public GameObject gameObject;//声明预制体
    Vector3 a = new Vector3(0, 0, 0); //实例化预制体的position
    Quaternion b = new Quaternion(0, 0, 0, 0);//实例化预制体的rotation
GameObject Sphere = GameObject.Instantiate(gameObject, a, b) as GameObject;//实例化

当然,如果我们要将预制体实例化到制定的位置,只需要获取该位置的position,然后将其作为a参数传递进去便可将预制体实例化到制定的位置。

预制体重写

我们所需要的重复的对象可能并不是千篇一律的相同的游戏对象,例如在房间列表上,每个房间的房间号,人数等等信息都不一样,因此在实例化的过程中需要对实例化的游戏对象进行重写。因为重写的优先级是高于预制体的,实例化的预制体在组件、属性和子对象上会有所不同。

重写的方式也有两种,一是通过Scene界面直接修改预制体实例对象的属性值、组件、子对象等等。

二是通过c#脚本代码对预制体实例化对象进行重写。

 public GameObject gameObject;//声明预制体
    Vector3 a = new Vector3(0, 0, 0); //实例化预制体的position
    Quaternion b = new Quaternion(0, 0, 0, 0);//实例化预制体的rotation
GameObject Sphere = GameObject.Instantiate(gameObject, a, b) as GameObject;//实例化
Sphere.getGetComponent<Text>().text().text="123456";//对预制体实例对象的text组件进行重写

使用流程图


问题和解决过程

问题一

当我们要将预制体实例化到指定的位置时,如果一个个去确定位置(x,y,z),再将该参数传入到实例化函数当中,那么将变得十分繁琐。

解决方案:我们可以预先在指定位置处设置一个游戏对象GameObject,然后获取GameObject的transform组件便可以获取该位置的坐标信息并作为参数传递到实例化函数当中去。使用如下:

 public GameObject gameObject;//声明所指定位置上的游戏对象
 public GameObject prefabs;//声明预制体
GameObject Sphere = GameObject.Instantiate(prefabs, gameObject.transform) as GameObject;//实例化到gameObject对象位置上

问题二

当我们在预制体上添加button组件,并绑定了onClick()事件后,所有的预制体实例的点击事件都会是onClick(),如何去让不同的实例有不同的点击事件

解决方案:在实例化预制体后,重新编写一个事件函数,再将该事件函数与实例的button组件进行绑定


总结

Unity预制体是Unity设计中一个需要经常使用到的技术和功能之一。当去创建、配置和存储好一个游戏对象,并将其设置为预制体之后,就成了一个可以不断重复使用的资源和模板,并且该资源和模板可以在使用过程中根据实际情况进行改写。当需要重复使用一个游戏对象时,便可以使用预制体功能。


参考

Unity 用户手册

Unity预制体创建与实现博客

《unity3d入门到精通》

posted @ 2021-06-28 19:28  MyYe  阅读(5094)  评论(0编辑  收藏  举报