1、利用魔术思维优化基于 Unity3D 的立方杀阵游戏摘 要游戏开发者总是容易被现实世界的各种物理逻辑,真实规律所束缚。文章讲述一种新的游戏开发思维,介绍如何利用魔术思维开发游戏,从而使程序在不改变需求的情况下,更有效率,更加灵活,扩展性更高。研究通过对基于 Unity3D 的立方杀阵游戏的优化,证明了这种思维的可行性和有效性。 关键词Unity3D 魔术思维 预制体 中图分类号:P208 文献标识码:A 文章编号:1009-914X(2016)02-0353-02 1 引言 与一般应用不同,游戏中常需模拟现实世界、甚至超现实世界的动作效果,这对游戏开发者提出了更高的要求。例如在射击游戏中,如何
2、为用户提供逼真的射击感受十分重要。在进行游戏开发时,很多难题,不如换一个视角来观察,换一种方式来解决,可能获得意想不到的效果。文章提出一种从魔术思维出发的方式,通过一些伪技巧,把一些真实需求魔术化地呈现给玩家。让游戏开发不仅仅是一种技术,更提升为一种艺术。 2 游戏立方杀阵开发前期遇到的困扰 (1)要让玩家感觉到房间数量巨大,有种身处巨型密室的感觉,然而场景中构建过多房间会导致游戏帧数低于 10 帧。 立方杀阵是从电影异次元杀阵中获取灵感进而改编的独立游戏。根据电影中的设定,该杀阵是一个由 262626=17576 个小立方体房间组成的巨型立方体密室。所以,如果要让玩家可以在密室中像电影一样逃
3、脱,并获得乐趣,显然必须有非常多的立方体房间才可以满足游戏的需求。然而,在 Unity3D 中,经过测试,当立方体房间超过444=64 个房间的时候,还没运行游戏,就已经开始卡频了。64 个房间,即立方体每个方向 4 个房间,无法让玩家感受密室的庞大。 (2)子弹速度过快导致无碰撞穿越。 Unity3D 中,物体的移动速度过快,极大可能导致在碰撞另外的物体时,产生穿越,从而无法发射碰撞检测。根据射击系统的需求,子弹是必须出现的。如果子弹速度不够快,那么玩家的射击体验将会大大下降,游戏沉浸感会大大减少。子弹速度要达到真实世界的子弹速度,又会导致穿越现象,有时候射击了物体但没反应。 3 现实逻辑实
4、现需求 (1)现实逻辑解决需求 1:使玩家体验到身处许多房间的巨型密室。Unity3D 的游戏脚本为基于 Mono 的 Mono 脚本,一个基于.NET Framework 的开源语言,因此程序员可用 C#,JavaScript 等加以编写1。文章将采用 C#语言进行示例。 在游戏世界放置数量足够多的房间。用代码生成场景如下: public void InstantiateAllRoom(int Num,GameObject RoomPrefab) int nowNum=0; /当前房间个数 for(int y=0;y=AllRoom.Length)NowRoomNum=0; /数组序号重置
5、for(int i=0;i /遍历房间数组,看目前该位置是否已经存在房间,如果存在则不可以再次生成房间 if(AllRoomi.name=“+RoomTransform)canInstantiateOneRoom=false;break; if(canInstantiateOneRoom) /生成房间 生成房间代码时间复杂度为:O(AllRoom.Length) 。对比第一种方法, O(AllRoom.Length)远远小于 O(Num3) 。 经过测试,当房间数量为 8 间时,游戏运行对 CPU 占用的时间为每帧 0.1ms,对比前一开发方案减少了 36%。对摄像机渲染值(消耗显存)占有率达
6、到 1.2%左右。对比前一开发方案,减少了 78.8%。很明显,该方案较好的优化了该游戏,使游戏更加顺畅。当生成 8 个房间,测试实际游戏运行的帧数,如图 2 所示: 图 2 中左侧的 Hierarchy 面板中表示游戏场景有 8 个房间,游戏场景输出了当前游戏帧数,可以看到当前情况下, Draw Call 为 8 次,帧数达到 59.9 帧,流畅度极高。 (2)魔术思维实现需求 2:子弹达到真实世界射击体验 魔术思维开发方式:魔术师将女助手四肢呈一个大字绑在一个大转盘上面,在转盘慢速旋转的情况下,魔术师蒙上眼镜,将 10 把飞刀一个个准确的扔到女助手身体旁边的转板上,狠狠的插了进去,丝毫不伤
7、及女助手。 其实,魔术师只是在假装扔飞刀,接下来,事先安装在转盘背面的弹簧装置,从转盘背后反方向弹出一把插在转板上的飞刀。 实例化子弹每次都会产生一次内存损耗。为解决该问题,采用魔术思维,以 Unity3D 里的一种射线替代子弹。玩家射击时,出现一条可控制距离(用于不同枪械射击距离)的射线,而射线只出现一帧,那一帧立刻判断射线是否射中目标,是否触发击中事件,模拟了真实世界子弹的射击速度,避免了检测丢失的现象。射线方案射击功能模块代码如下:public void Fire(float Distance) RaycastHit hit=new RaycastHit() ; /射线发射相关信息 Ca
8、mera camaer=Camera.main; /主摄像机 Vector3 t=camaer.transform.position+camaer.transform.forward*Distance; /射线目标坐标 /由摄像机到终点的方向发射一条射线 Ray ray1 =new Ray(camaer.transform.position,t-camaer.transform.position) ; if(Physics.Raycast(ray1,out hit,Distance) ) /当发射射线时,在开发者界面绘制一条绿色的线 Debug.DrawRay (ray1.origin,t-c
9、amaer.transform.position, Color.green) ; 对于各种模拟子弹飞行时的特效火线,或者击中墙壁等地形时的石灰飞溅效果,都可以在射击事件和击中事件中在对应位置实例化这个效果,AI 射击方面也可以用射线判定。 对两种思维实现射击的效果进行测试,同时运行游戏 20 分钟。在实例化子弹的方案中,即使销毁了子弹物体,由于缓存的作用,游戏内存的占有率一直逐渐增加,20 分钟时达到了 250M 左右。而使用射线方案的情况下,内存占有率一直在 205M 左右浮动。由此可知,随着游戏的持续运行,用射线代替实例化子弹的方案更优。 5 其他问题的魔术思维优化方案 (1)需实现第一人
10、称手拿着物品,但不显示手部的美工模型与动画。把物品模型的 2/3 出现在屏幕左或右下方(表示左右手) ,1/3 隐藏在屏幕下方外界,主角拿着物品走动时,应使物品有频率抖动效果。 (2)场景初始化过于突兀。 一个游戏场景需要初始化许多物体,出现逐渐渲染周围世界的效果,或者主角模型的坐标需要重置等。这些效果会导致玩家看到一些如突然瞬移,一棵树突然出现等奇怪的现象,降低游戏沉浸度。在场景开始时,保留读取界面的 UI 图片或背景,使其与读取界面无缝结合,等待场景物体初始化完成后(一般不会超过 2 秒) ,让玩家按下某个按键来开始游戏,可掩盖一些不应该出现的效果,使游戏平滑过场。 6 总结与展望 通过对
11、立方杀阵一部分游戏模块的分析可知,在合理的情况下,使用魔术思维的游戏开发方式让游戏的程序结构更加灵活,效率更高,为游戏需求的实现增加了更多的考虑方向,更让游戏开发从技术提升为另一种领域的艺术。 但魔术思维并不适应所有的游戏开发需求,某些需求如果需要非常清楚的展示整个效果的实现过程,那么魔术思维这种伪实现方式便无法发挥作用,希望未来能继续改进,使魔术思维的运用更加广泛,完善。 参考文献 1 俞亮,俞文心.基于 Unity 的 Web 游戏设计与实现J.计算机光盘软件与应用,2014(8):225-226. 2 王彩玲,刘瑞香,宋钊.基于 Unity3D 的虚拟校园漫游的设计与实现J. 科技视界,2015,5. 3 Unity Technologies.Unity4.x 从入门到精通M.北京:中国铁道出版社,2011,11. 4 方凯.在 Unity3D 中实现区域触发交互J.科技信息,2012,28. 5 丁妹,胡志秋.虚拟建筑模型场景漫游系统J.信息技术与信息化, 2005,1.