4.2 预制件prefab资源的应用
在一个项目的开发过程中经常会应用到预制件prefab资源,因为在一个项目中,可能会在某一个场景中同时创建多个相同的游戏对象,如果单一创建不仅会浪费空间和时间,而且在管理上也增大了难度,甚至有些时候这些事情是不可能通过人工完成,这时就需要实例化预制件(prefab)来创建对象。
若要在游戏对象上添加一些具体的属性或是挂载一些在实际开发中要实现的特定功能的脚本时,则需要对创建的各个游戏对象挨个添加,但是若需要创建的相同游戏对象太多时,这些操作就不是人为可以添加的操作,若使用预制件prefab资源,则只需对预制件prefab资源进行相关操作即可,通过实例化创建的游戏对象拥有同样的属性和脚本功能。
4.2.1 预制件prefab资源的创建
在前面的章节里面讲解了Assets资源菜单的具体菜单即各个菜单的功能和用途,在Create菜单下的子菜单下就拥有一个 prefab 菜单,单击这个菜单就会在资源项目列表中创建一个预制件prefab资源。但是此时的预制件prefab只是一个空壳,还需要添加一些具体的游戏对象。下面将对具体的创建过程进行讲解,具体的操作步骤如下。
(1)通过Unity集成开发环境中的菜单创建一个prefab,即单击Assets→Create→prefab菜单,即可在项目资源列表中创建一个prefab,在此将名字改为BallPrefab。
(2)在场景中创建一个球体,即单击GameObject→Create Other→Sphere菜单,即可在游戏组成列表中创建一个Sphere,在此将名字改为Ball。
(3)向项目中导入一个球面纹理图片资源,即单击Assets→Import New Asset...菜单,会立刻弹出一个 Import New Asset对话框,在对话框中找到需要的球面纹理图片资源,单击“Import”按钮即可导入,在项目资源列表中就会出现这个资源文件。
(4)为创建的 Ball 添加刚体属性和球体碰撞者属性,即先选中 Ball,再单击 Component→Physics→Rigidbody 菜单,即可为 Ball 添加刚体属性。若再单击 Component→Physics→Sphere Collider菜单,即可为Ball添加球体碰撞者属性(若该属性已存在,可以跳过这步)。
(5)将导入的球面纹理图片资源添加到创建的Ball上面,这个操作很简单,只要选中纹理图片拖动到创建的Ball上面即可,这样Ball的属性里面就又多了一个纹理图片属性。添加各个属性都将在属性查看器中显示出来,如图4-49所示。
▲图4-49 添加的各个属性
(6)为刚创建的BallPrefab添加真实的游戏对象。这个操作跟第(5)步一样,只要选中游戏组成列表中创建Ball,拖动到项目资源列表中的BallPrefab上即可,此时这个BallPrefab就具有了与Ball一样的属性,如图4-50所示。
▲图4-50 成功创建真实的 BallPrefab
4.2.2 通过prefab资源进而实例化对象
在实际的开发过程中,若要创建大量的相同的游戏对象,就需要使用prefab资源,进而通过脚本编写程序实例化这些游戏对象,这样不仅可以省去创建的大量时间,为各个游戏对象添加相同属性的烦琐操作,而且这样节省了大量的资源,提高了项目的运行效率。
下面就通过一个实例化篮球的小案例来讲解实例化的具体操作过程,具体的步骤如下。
(1)就以上面的那个BallPrefab为例,所以在此就不讲解创建prefab具体操作步骤。
(2)编写脚本,实例化篮球。单击Assets→Create→JavaScript菜单,在项目资源列表中就创建了一个 JavaScript 脚本,在此将脚本的名字改为 BallPrefabScript,双击这个脚本即可进入默认的脚本编辑器,对脚本进行编辑,具体实现如下面的代码片段所示。
代码位置:见随书光盘中源代码/第04章目录下的 Prefab/Assets/PrefabScript/BalPrefabScript.js
1 var i:int ; //声明整型变量i
2 var j:int ; //声明整型变量j
3 var BallPrefab : Rigidbody; //声明刚体BallPrefab
4 var x : float; var y : float; var z : float; //声明初始的X、Y、Z坐标
5 var k : float; var n : int; //声明实例化球的行数
6 var count : int =0; //声明一个计数器
7 var BP: Rigidbody[] ; //声明刚体数组
8 function Start () { //声明Start方法
9 BP=new Rigidbody[10]; //初始化刚体数组
10 count=0; //计数器置0
11 for(i=0;i<=n;i++){ //对变量i进行循环
12 for(var j : int =0;j<i;j++){ //对变量j进行循环
13 //在自定义的坐标位置实例化10球
14 BP[count++]=Instantiate (BallPrefab, Vector3(x-2*k*i+4*j*k,2.0,z-2*1.75*k*i), BallPrefab.rotation);
15 } } }
(3)将编写完的脚本挂载到摄像机上,然后对摄像机脚本属性中的各个变量参数进行合理的设置,单击 Unity 集成开发环境的运行按钮,在场景涉及面板中就会显示出实例化的效果,在游戏预览面板中会显示运行结果,在游戏组成列表中显示实例化的10个BallPrefab,如图4-51所示。
▲图4-51 实例化效果图