Unity5学习心得-Gameplay

来源:互联网 发布:彩票号码组合软件 编辑:程序博客网 时间:2024/06/05 09:57

Unity5学习心得-Gameplay

场景 Scene

一个场景就是一个独立的关卡,会有自己的主摄像机、环境等。
一个新的项目打开的时候会有一个无标题未保存的场景,里面包含一些默认的物件,一个摄像机和一个方向光。根据创建的项目是2D的还是3D的,摄像机会是透视投影或者是正交投影(这个也可以随时切换)。
目前Unity已经支持同时编辑多个场景。

GameObject

游戏中的所有东西都是GameObject,GameObject是Unity中最基本的object,它是一个容器,可以包含各种各样的组件,也就是这些组件使得GameObject称为一个character或者一个light等等。Unity提供各种组件,开发者也可以通过script写自己的组件。
一个GameObject默认会包含一个transform组件(用于设置位置、rotation和scale,这三个值是相对于transform组件的父节点,如果没有父节点,那么就是在世界坐标系),这个组件是不能被删掉的。其他组件可以通过编辑器被挂在GameObject上。
比如一盏灯就是将一个light组件挂在一个GameObject上。
再比如cube就有一个mesh组件,一个mesh render组件(用于在mesh的表面绘制东西),以及一个box的碰撞体组件。
还可以通过脚本来控制GameObject。

Component

一些组件搭配使用比较好,比如rigidbody通过NV的phyx控制transform,然后通过collider控制碰撞。
一些组件必须依赖于其他组件,比如Hinge joint组件只有在有Rigidbody的时候才工作。
组件的属性分为引用和值,可以在编辑游戏的时候在编辑器中修改,也可以在游戏运行的时候通过script修改。组件的引用属性可以指定为其他组件、GameObject或者Asset,关于如何编辑组件属性,可以查看文档编辑属性。
针对Component有一些命令,比如Reset类似于ctrl+z,回退一步的意思。Remove的话如果不小心删除了被依靠的组件,则会出现warning。Move Up/Down针对图片效果组件非常有用,决定了什么图片在前什么图片在后。Copy/Paste只能用于相同类型的组件之间复制粘贴。
在play mode时候,可以修改组件属性来进行测试,然后当退出play mode的时候,属性会恢复到运行play mode之前的值。
可以通过script来创建组件,开发者定义该组件可用于修改的属性。使用脚本,需要参照脚本教程。

Deactivating

GameObject可以通过其activeSelf属性临时从场景中删除,方法是通过脚本,或者直接操作编辑器的activation checkbox。
当一个父object被deactivated,那么其子object的activeSelf属性就会被忽略,而以父object的activeSelf属性为准。
所以这里的删除是真的删除了,不是简单的不显示(保留碰撞),因为碰撞也是object的子component。
还有需要注意的是当父object被deactivated的时候,子object的activeSelf属性只是被忽略,而并非被改变,所以当父object reactivated之后,子object还是根据自己的原先的activeSelf属性来决定自己是存在还是不存在。
总而言之,如果开发者不能感觉object的activeself属性来判断其是否存在(因为可能会被父object的activeself属性影响),而应该通过其activeInHierarchy属性判断(该属性考虑了父object的activeself属性的影响)。
这种把父object deactivated,会把子object的activeSelf属性屏蔽掉的机制是从Unity4.0开始有的。在之前是通过SetActiveRecursively函数,这个函数会修改某个object的activeSelf属性,但是和刚才机制不同的是,它会同时把所有子object的activeSelf属性一并修改了,而不会保存子object activeSelf属性的原值。目前该函数还在unity中,但是不被建议使用,当然如果确实需要批量修改某object及其所有子object的activeSelf属性,又不需要保留复原原值的功能的话,可以使用这个函数。

Tags

每个GameObject都可以拥有一个tag,用处是给GameObject分类,这样就可以从脚本中轻松的找到某个tag对应的所有GameObject。查找函数为GameObject.FindWithTag()。
Unity提供一些build-in tag,当然也可以自己创建tag。

Static GameObjects

如果知道某个GameObject是static,那么就可以对其进行优化,比如如果知道它位置不会变化,那么就可以对其进行预计算,再比如绘制的时候,也可以将多个static object合并成一个进行绘制。
GameObject的static属性是针对多个系统的,可以设置使其不static,也可以设置使其对所有系统static,也可以设置使其针对某个或者某几个系统static。
有如下系统:
1. Lightmapping 场景中的光照
2. Occluder and Occludee遮挡 从固定的摄像机位置,拍摄基于可见物体的渲染优化
3. Batching 把某几个物体合并成一个物体去渲染
4. Navigation 使得角色越过场景中的障碍物
5. Off-mesh Links 导航系统制作的场景中不连续的区域之间的联系
6. Reflection Probes 对其所有方向的环境拍摄一个球形照片

Perfabs

游戏中经常会出现同一个角色、物件等会使用多次的情况,针对这种情况,如果对场景中的GameObject使用复制粘贴当然也可以,但是如果复制粘贴之后,需要修改某个属性,那么就只能一个一个去修改,无法批量修改了。
所以就有了Perfabs这种东西,可以将一个GameObject包括其属性和子component一起打包成一个perfabs,然后这个perfabs就可以作为一个模板,用于在场景中创建新的instance。然后当对perfabs进行修改的时候,会立即影响到所有instance。当然开发者也可以单独修改某个instance的属性,然后再在perfab中修改对应属性,就不会影响到该instance了。
创建perfab的方法就是先通过编辑器创建一个perfab,然后把scene中的一个gameobject拖到perfab上,那么就创建好了,如果把别的gameobject再拖到这个perfab上,会把原来的gameobject覆盖掉。
需要注意的是,在instance上,有3个perfab没有的按钮,第一个是select,用于定位instance对应的perfab;第二个是apply,会将该instance的所有修改(除了Position和Rotation),应用到perfab上,更新所有(除了对应属性已经有修改的别的instance)的instance;第三个是revert,就是把当前instance的所有更改,回退到perfab默认的值。
开发者可以在运行时通过脚本 针对某个perfab创建instance。使用的函数是Instantiate。举个例子,可以在以下几种情况使用这种方法:
1. 创建多个相同物件的时候,比如在场景中创建许多树木
2. 运行的时候,每次操作,生成一个新的相同的物件的时候,比如:发射子弹
3. 当物体销毁的时候,比如飞机坠落,那么做两个版本的飞机,第一个飞机使用简单的模型,不需要很多三角形等细节,这样在正常飞行的时候,绘制的效率会比较高,第二个飞机是碎片状的,可以再加上一些烟雾等特效,用于飞机坠毁的时候。当飞机正常飞行的时候使用第一个飞机,坠毁的时候立即替换成第二个飞机。这样就需要两个perfab进行替换操作。


0 0