张海程,李效伟,郭玮玮,张萌,庄绪姣,车统统
(山东女子学院 信息技术学院,山东 济南 250300)
摘要:Unity3D引擎能够加速网页三维游戏的开发。基于Unity 3D引擎,使用3Ds Max对三维迷宫、赛车、轮胎等模型建模,利用JavaScript进行脚本编程,通过添加碰撞体实现碰撞检测,添加刚体实现重力等物理属性。最后设计并实现了一个能够满足基本交互的网页三维迷宫游戏,为系统专门设计计分、计时系统,记录玩家的得分情况,增强寻宝乐趣。
关键词:Unity3D引擎;三维模型;网页游戏
0引言
随着互联网的发展,网页游戏越来越受到人们的青睐。与其他游戏相比,网页游戏具有跨平台、免安装等优势,但是一般的网页游戏具有游戏画面质量低、用户体验差等缺点,像三维游戏[1]那样达到立体与真实的画面效果是网页游戏设计师一直以来的追求。王峰[2]为了解决这一问题,与二维软件Flash结合,制作出仿三维效果,虽然有很强的立体感,但是,制作精美游戏需要大量图像文件,开发复杂。利用Unity3D引擎开发的网页三维游戏能够有效解决这些问题,并且其具有强大的3D渲染功能,能高度优化图形渲染,大大提高游戏画面效果,增强用户体验。
Unity3D是近年来兴起的三维游戏开发引擎,具有优秀的可视化设计界面和易用的脚本编辑功能,能跨平台发布,对移动设备支持良好,是十分优秀的专业游戏引擎[3]。陈小岚等[4]针对打字游戏存在的竞争性不强、用户体验性差的缺点,基于Unity3D设计了一款多平台网络打字3D游戏,实现了3D效果和跨平台竞争实战。而文献[57]有明显的跨平台困难、交互性差问题,这充分体现了Unity3D作为开发工具的优越性。伍传敏[8]等基于Unity3D进行了FPS游戏的设计与开发,建立逼真的三维实体模型,增加了玩家浏览场景的真实感。郑磊等[9]基于Unity3D进行了网页三维游戏开发,对教育管理系统进行了实现,开发方便。由此可见,Unity3D引擎是一款极有发展前景的三维网页游戏开发工具。
1系统内容及架构
该系统实现对三维迷宫的漫游,并通过控制赛车的移动实现宝藏(轮胎)的收集。使用键盘中的W、S、A、D键控制赛车上、下、左、右移动;使用鼠标控制镜头视角的转换;采用碰撞检测技术,防止赛车穿墙而过,并且通过赛车和轮胎相撞实现收集宝藏的功能;对赛车添加刚体,实现重力等物理属性;利用音频组件,添加背景音乐和音乐特效,渲染游戏气氛;利用粒子系统,设计宝藏收集瞬间的特效,增加玩家寻宝的沉浸感;利用计分、计时系统,记录玩家的得分情况,增强寻宝乐趣。
系统通过游戏场景展示游戏功能,游戏场景中主要有赛车、地面、迷宫、轮胎等,系统架构如图1所示。
通过对系统架构的分析,可将系统分为控制、碰撞检测、数据、特效、声音等模块。
(1)控制:对赛车的控制,使其在场景中漫游寻找宝藏;对相机角度的控制,使其以赛车为中心任意改变视角。
(2)碰撞检测[10]:场景中各个物体之间都会有碰撞检测,如赛车和迷宫之间、赛车和地面之间、赛车和轮胎之间等。
(3)数据:记录收集宝藏的数量和闯关所用的时间,以及最后的总得分。
(4)特效:加入粒子特效,增强游戏的视觉效果。
(5)声音:系统的背景音乐和收集宝藏时碰撞产生的音效。
2游戏在引擎中的实现
2.1场景的设计与实现
Unity3D主要支持fbx格式的三维模型,系统通过3DsMax三维建模软件进行建模,用PhotoShop进行贴图等平面设计。
2.1.1模型建立与导入
本系统共设有2个关卡,场景中有三维迷宫、赛车、宝藏、红旗等模型。用3DsMax对模型建模后,利用其导出fbx格式,注意将贴图一同导出。将导出的fbx文件放入Unity3D中的Assets目录下,找到资源文件后将其设置为Prefabs(预置体),预置体是可以重复使用的游戏对象,所有的预置实例都指向原始预置,修改预置后改动的内容可应用到相关实例上。最后,在Unity3D中搭建迷宫,并将其他模型放到游戏场景中的合适位置。
2.1.2场景的显示
Unity3D内置渲染引擎,在场景中设置照相机和灯光(平行光、点光源等),能将游戏中的场景显示出来。场景设计图如图2所示。
2.1.3场景的漫游
Unity3D引擎内置MonoDevelop编辑器,本系统所用语言是JavaScript和C#。为了实现控制赛车在场景中漫游的功能,需为赛车添加控制移动的JS脚本,并让照相机随赛车一起移动。控制移动的关键代码如下:
if(Input.GetKey(KeyCode.W))
{
this.transform.Translate(Vector3.forward*Time.
deltaTime*-MoveSpeed);
}
if(Input.GetKey(KeyCode.A))
{
this.transform.Translate(Vector3.left*Time.
deltaTime*-MoveSpeed);
}
2.1.4场景视角的转换
对视角移动起主要影响作用的是鼠标移动的快慢与相机上下左右旋转的匹配程度、相机视角的角度控制以及相机的起始角度、方向灵敏度、上下最大视角与鼠标移动快慢(增量)。控制视角移动的关键代码如下:
void Update ()
{
//根据鼠标移动的快慢(增量), 获得相机左右上下旋转的角度(处理X)
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles=new Vector3(-rotationY, rotationX, 0);
}
将代码绑定到摄像机上,即可控制相机视角转换,由于迷宫场景与相机一同移动,所以通过控制鼠标移动可以实现迷宫场景的视角转换。
2.1.5碰撞检测
场景漫游过程中,为防止“穿墙而过”,需给每一个物体添加碰撞检测组件。碰撞体分为不同类型,迷宫场景添加Mesh Collider,赛车、轮胎添加Box Collider。例如图2(b),为防止赛车从地板掉落,需给地面和赛车添加碰撞体。
图形界面事关系统的友好度,在Unity3D中,用GUI类进行图形界面的设计,其提供了许多界面的高级控件,如Label,Button等。界面所用的图片由美工用PhotoShop制作完成。游戏界面如图3所示。
图3(a)是开始界面,设有开始和帮助按钮,点击开始按钮进入游戏场景,点击帮助按钮会展示游戏规则和过关秘诀。图3(b)是恭喜过关界面,会显示获得宝藏数、所用时间和获得总分情况,并设有结束按钮和下一关按钮。系统还设有过关失败界面,只包括结束按钮,并显示获得宝藏数。界面的实现利用JS脚本进行编写,变量放在Update中,开始界面关键代码如下:
GUI.DrawTexture(Rect(0,0,Screen.width,Screen.height),startTexture);
GUI.skin.label.font = customFont;
if(GUI.Button(Rect(0.5*Screen.width-90,0.5*Screen.height+200,130,50),""))
{
Application.LoadLevel("scene");//进入游戏场景
}
2.3宝藏收集功能的实现
本模块实现宝藏的收集功能,其功能都是通过赛车和轮胎的碰撞产生的,碰撞后会使轮胎消失、产生轮胎型号等信息,而且发出粒子特效和声音特效。最后,添加计分和计时功能,碰撞一次分数加一,增强了玩家在游戏中的成就感和真实感。
粒子系统是由形状简单的众多粒子形成的一个不规则的物体,这些粒子具有位置、大小、颜色、透明度、生命周期等属性[11-13]。首先新建一个粒子发射器,设置好粒子的属性,为了编程的方便,将其变为GameObject类型,即先将粒子发射器拖到Hierarchy面板,再拖放到Project面板中。用相同的思路,声音特效的添加也是将音频转化成GameObject类型。关键代码如下所示:
var explosionEnemy_bl:GameObject;//定义音频
var effect : GameObject;//定义粒子特效
function OnCollisionStay(collisionInfo : Collision)
{
Destroy (gameObject);//碰撞后轮胎消失
Instantiate(explosionEnemy_bl,transform.position,transform.rotation);//生成声音
Instantiate(effect,transform.position,transform.
rotation);//生成粒子特效
}
将生成的GameObject类型的粒子发射器和音频分别赋给对应变量,即完成特效的添加。
2.4网页版本的发布
Unity3D引擎支持多平台发布,可发布为Windows单机版、WindowsWeb版、Android、IOS等多个版本。系统通过Unity3D发布为网页版,打开File →Build Settings,添加游戏场景,选中发布的版本。最后,点击Build会生成一个包含html和unity3d格式的可执行文件的文件夹。点击html格式的可执行文件,游戏可以在联网的条件下用Unity Web Player插件在各种浏览器中打开。
网页版发布后,发现UI界面与美工制作的图片相比显示不清晰,解决方法是将图片类型改成Advance,然后去掉generate mip maps,并将Filter Mode改为Point。
3结束语
本系统实现了三维页游的开发。对游戏关卡、粒子系统、声音系统、碰撞检测、计分计时等功能进行了实现,三维游戏场景真实立体,带给玩家一种美好的视觉体验,系统运行流畅,达到设计要求。游戏的交互性方面还比较简单,还需要在交互上做深入的研究。
参考文献
[1] 冯科融,王和兴,连加美,等.基于HTML5的3D多人网页游戏实现方案[J].微型机与应用,2013,32(1):46.
[2] 王峰.基于二维网页游戏的仿三维画面研究[J].艺术教育,2013(4):132133.
[3] 吴少军.网页游戏开发新趋势与新技术漫谈[J].当代教具理论与实践,2012,4(6):175176.
[4] 陈小岚,宋刊.基于Unity3D的多平台网络打字游戏的设计与实现[J].教育信息技术,2015(1):111113.
[5] 温建华,高海峰.一种基于P2P的大规模在线游戏结构[J].计算机应用与软件,2008,25(4):118119.
[6] 张赐,吴健平.基于AE的校园房产三维GIS系统开发与研究[J].计算机技术与发展,2011,21(2):215218.
[7] 李建微,陈新,黄週祥.可扩展的MMORPC游戏框架的设计与实现[J].计算机技术与发展,2012,22(2):15.
[8] 伍传敏,张帅,邱锦明.基于Unity3D的FPS游戏与开发[J].三明学院学报,2012,29(2):3540.
[9] 郑磊,杨旭波,包子建.基于三维网页技术的Unity3D教学管理系统的设计与实现[D].上海:上海交通大学,2013.
[10] 范昭炜,万华根,高曙明.基于流的实时碰撞检测算法[J].软件学报,2004,15(10):15051514.
[11] 陈显军,李心颖,湛永松.GPU支持下基于粒子系统编辑器的特效技术研究[J].工程图学学报,2011(6):7781.
[12] 汪继文,胡文平,金余峰.基于粒子系统的8字动态烟花仿真[J].计算机仿真,2010,27(10):211214.
[13] 李海,汪继文.基于粒子系统的位置可控有声烟花模拟[J].微型机与应用,2013,32(9):3234.