林 剑,张 帅,伍传敏
(三明学院 信息工程学院,福建 三明,365004)
基于目前高端智能手机的发展,触屏手机游戏作为下一代游戏产业链中的新亮点,逐渐成为各大手机制造厂商及动漫游戏公司相互竞争的焦点[1-3]。据调查,目前大众最为喜欢的触屏手机游戏主要有:切水果、捕鱼达人、植物大战僵尸、跑酷、天天爱消除、极品飞车、鳄鱼爱洗澡等[4]。这些游戏的超高人气主要来自游戏容易上手、玩法的趣味性、场景的逼真性及和谐人机交互性等优势。因此在手机游戏的设计方面,首先要考虑良好的人机交互性,如玩家能够轻易地退出游戏,并能够在他们离开的地方继续游戏;其次是游戏画面的逼真性及流畅性,并保证控制要直观、易于掌握;最后是恰当的人工智能,并要求游戏故事情节简单,目标明确,并保证手指与屏幕上手柄的完美匹配。
本文结合三维建模软件Maya进行游戏场景中角色、道具等物品建模,利用Unity3D游戏引擎迅速高效地创建对象、导入外部资源,基于Unity3D触屏事件处理机制,研究快速完成自定义地形场景、模型动态显示及人工智能等关键技术,并进行APK文件的发布,最终完成了Android触屏类手机游戏的开发。
在游戏开发过程中经常需要获得用户的输入过程如触控动作相关的各个参数,按键的情况等。Unity3D在设计平台时专门提供了两个输入对象:Touch和Input对象。通过这两个对象可以方便地获取用户输入的各个参数,包括触控的位置、按下移动的位置、是哪个键等。
现今流行的Android平台和IPhone平台都是基于屏幕触控的,因此Touch输入对象是开发过程中经常遇到的问题,也是较难解决的问题。Touch方法可以方便的获取用户输入的各种参数,用于记录一个手指触摸在屏幕上的状态,变量说明如表1。
表1 Touch方法的变量说明
只有各个变量相互配合才能完成触屏游戏中物体的交互控制,具体交互方法如下:
Joystick类是一个专门处理虚拟摇杆事件的类,内置StartGame函数(用于设置虚拟摇杆的贴图属性及初始位置),ResetJoystick函数(用于重置摇杆所有数据信息,当手指离开触摸屏后,会重置摇杆的所有数据)。Unity3D内置Update函数作为每帧都执行的函数,用来监听玩家是否有触屏操作,并进行相应的处理。在实际应用中应先创建一个Joystick对象并初始化:
然后在Update函数中监听摇杆的位置信息:
其中leftx得到的数据是虚拟摇杆在x轴的位置偏离了初始位置的距离,向左偏离为负值,向右偏离为正值。Lefty得到的数据同理。这样就可以非常方便的得到玩家操作虚拟摇杆的数据信息。
编辑Unity中的地形有3种方法:第一是利用三维建模软件(3DMax,Maya等)建模形成一个游戏世界的完整3D模型后导入;第二是使用Unity3D自带的笔刷工具动态的在地形表面绘制山峰和谷底;第三种方法是导入预先渲染好的灰度图。虽然使用3D软件搭建的游戏环境能够一次性导入并确保所有物品都彼此匹配并精确定位。但是使用Unity3D自带的地形引擎可以高效快速地模拟接近自然的东西或是现实世界中的大陆,并占用移动终端较少的内存资源。
基本上一幅灰度图就是一幅高度图,它使用2D图像来表示3D的高度变化,采用较暗的灰黑色来表示较低的高度,用较亮的灰白色来表示较高的高度。导入的灰度图必须是RAW格式。一旦有了灰度图,就可以将它导入了,Unity会弹出一个对话框显示导入选项,见表2。
表2 导入高度图选项设置
值得注意的是,在对地形高度进行编辑后,还可以地形设置选项中修改细节分辨率(detail resolution)和贴图分辨率(base texture resolution),但开始制作后,再修改这些选项,会带来巨大的问题。即修改任何的分辨率数据会导致依赖于此的所有细节信息全部被删除掉。
手机由于硬件的限制,如果一次性将所有的场景模型全部加载容易造成“卡机”的现象。为了提高内存的使用效率,并快速完成所需要模型的加载,需要使用模型的动态显示技术。通过编写RenderSwitch类获取主角和场景模型的位置信息,通过计算它们之间的距离来判断该模型是否应该被渲染出来。这样手机就只需要渲染出离主角近的模型而不必将场景中所有的模型都渲染出来。提高了游戏运行的流畅度。RenderSwitch类算法如下:
一款游戏的好玩与否很大程度上取决于敌人的人工智能,在此主要阐述触屏类游戏AI中经常用到的自动巡逻算法和自动追踪算法。为了使不同的角色拥有不同的人工智能,会涉及到Unity3D中一些重要常用的类,具体如下表3。
表3 Unity3D中关于AI设计中常用类
当然,不同的游戏有着不同的敌人,其人工智能也不尽相同,本文主要实现当敌人看到玩家时自动追击,否则自动巡逻的敌人智能实现。
首先应该计算出敌人与玩家之间的距离。通过距离判断敌人当前应该进行什么动作。如果距离小于某个值,则判定玩家进入视野,对玩家进行追击。追击的部分代码如下:
transform.rotation=Quaternion.Slerp(transform.rotation,Quaternion.LookRotation(PlayerTarget.transform.position-transform.position),Time.deltaTime*speed);
其中,Quaternion四元数这个类可以很好地将敌人以time.deltatime*speed的速度向当前目标平滑旋转追击。
当距离大于某个值时,则判定玩家不在自己周围,从而进入自动巡逻状态。将以上脚本赋予敌人后,敌人就能够在“看见”玩家的时候自动追击,否则每隔几秒巡逻一个特定的区域。自动巡逻部分算法如下:
Unity的动画API非常强大和全面,它还包含集成了动画编辑器。其中Animation类负责对模型动画剪辑进行播放,组合和混合的所有功能,它从Behavior类派生而来,因此包含我们常看到的一些函数,变量。在Unity中一个给定游戏对象上所有可以使用的动画都会被赋予一个图层,默认为0,优先级高的图层能够覆盖低优先级图层的动画。
通常一个角色都会有一个空闲动画,它会在玩家没做任何事情时播放,同时可能也会有奔跑和攻击动画,一个良好的图层顺序是空闲动画位于图层0,奔跑动画位于图层5,攻击动画位于图层10,这样一来玩家如果进行攻击,攻击动画的优先级就会比奔跑动画高,同时也会阻止空闲动画的播放企图。
要设置图层顺序,需要在动画脚本开始出初始化这段动画,方法如下:
annimation[“此处为要设置的动画名称”].layer=10;
一般情况下,一个良好的图层次序会将空闲动画置为0,将弹跳动画置为5,攻击动画置为10,这样如果玩家进行攻击,攻击动画的优先级会比基本的奔跑动画高,它会覆盖对弹跳和空闲动画的任何播放企图。
在Unity3D中完成游戏设计后,需要导出APK格式完成触屏类手机游戏的发布。本文以Android手机为例进行说明。具体如下:
首先配置JDK和SDK环境,将下载好的JDK文件安装在C:Program FilesJava路径下。安装完毕后,设置环境变量为:
PATH=C:Program?FilesJavajdk1.7.0_40in
CLASSPATH=C:ProgramFilesJavajdk1.7.0_40libdt.jar;C:ProgramFilesJavajdk1.7.0_40\lib ools.jar;
JAVA_HOME=C:Program FilesJavajdk1.7.0_40
然后将解压好的SDK文件放在D盘根目录下,并在path环境变量中添加
D:adt-bundle-windows-x86sdk ools;D:adt-bundle-windows-x86sdkplatform-tools;
最后在Unity3D中打开Unity Preference,设置好android sdk目录为D:adt-bundle-windowsx86,打开File>Build settings,选择平台为Android,完成APK文件的发布。具体游戏实现如图1~图2。
图1 游戏开机界面
图2 游戏运行画面
结合Unity3D游戏引擎实现了触屏类手机游戏的应用实现,讨论了快速完成自定义地形场景、模型动态显示及人工智能等关键技术,设计了模型间的链接与控制,最后完成APK文件的发布,提出了行之有效的技术措施,具有一定的应用价值。
[1]WANG S, MAO Z, ZENG C, et al.A new method of virtual reality based on Unity3D[C]//Geoinformatics, 2010 18th International Conference on IEEE, 2010: 1-5.
[2]CREIGHTON R H.Unity 3D game development by example: Beginner's guide[M].[s.l.]Packt Publishing, 2010.
[3]INDRAPRASTHA A, SHINOZAKI M.The investigation on using Unity3D game engine in urban design study[J].ITB Journal of Information and Communication Technology, 2009,3 (1):1-18.
[4]JIE J, YANG K, HAIHUI S.Research on the 3D game scene optimization of mobile phone based on the Unity 3D engine[C]//Computational and Information Sciences(ICCIS), 2011 International Conference on IEEE, 2011: 875-877.
[5]PENG Q I,LINA Y U,JING W.The research and application of products virtual exhibition technology base on unity 3D[J].Digital Technology and Application, 2010(9):1314-1318.
[6]LABSCHTZ M, KRSL K, AQUINO M, et al.Content creation for a 3D game with Maya and Unity 3D[J].Institute of Computer Graphics and Algorithms, Vienna University of Technology, 2011.
[7]陈洪,马钦,朱德海.基于 unity3d的交互式虚拟农业仿真平台研究[J].农机化研究,2012(3):49.