XXXX大学本科生毕业论文(设计)开题报告
1
2
3
5
6
第二篇:基于Unity在Android平台上开发游戏的方法
GAMEPROGRAM
游戏编程
基于Unity在Android平台上开发游戏的方法
陶阳
摘要:Unity是一款3D跨平台的游戏引擎,基于该引擎可以很方便地开发出适用于多种平台的
游戏。在介绍Unity引擎的基础上,以开发适用于Android平台的《玩转地球》游戏为例,给出了一种基于Unity的游戏开发的一般方法。在此基础上,游戏开发人员可以展开进一步研究,开发出可发布在基于Android平台的多种终端设备上的游戏。关键词:Unity游戏引擎,游戏开发,玩转地球,Android平台
1引言
Unity是一款标准的商业游戏引擎。Unity引擎的功能非常
(另外一个例子是SecondLife也采用了Mono作为脚本引擎,
C#作为脚本语言)。在游戏引擎中的应用也促使了Mono自身
的进步,包括Mono,Simd等,使得Mono或者说托管代码更适合于游戏开发。
强大,其中一个显著特点就是跨平台游戏开发。Unity是一款支持跨平台开发的3D游戏开发工具,生成的游戏可以导出到包括iOS、Android、PS3、Wii、XBox360在内的众多平台。跨平台开发无疑为开发者节省了大量时间。平台之间的差异会直接影响到开发进度,比如屏幕尺寸、操作方式、硬件条件等的不同会给开发者造成巨大的麻烦,因为在不同的平台中开发者需要花更多时间去做平台之间的移植开发,而将大量时间浪费在这上面并不值得。Unity几乎为开发者完美地解决了这一难题,将大幅度减少移植过程中一些不必要的麻烦。作为游戏引擎,它最大的优势就是可以让美工和编码员在统一的环境中协调工作,是一款用户友好、方便快捷的开发工具。而且,Unity游戏引擎和开发工具支持JavaScript和C#脚本语言,还可同时支持iPhone和Android平台的游戏开发,因此也是广大手机游戏开发商的首选武器。
但是,Unity引擎是较新的游戏开发工具,可供学习的资料比较少,因此,这里以完成一个简单的《玩转地球》游戏为例,提出一种基于Unity的面向Android平台的游戏开发的一般方法,以供Unity引擎的爱好者和初学者学习参考。
Unity简单的界面、友好的开发环境以及对所有流行游戏
平台的广泛支持,使得它对于新的开发人员或是那些希望使用一个简单、高效并且友好的游戏引擎来创建游戏的人来说是完美的。Unity可部署在MacOS或Windows操作系统中,在这两个操作系统中,除了客户端操作习惯与界面有些差异以外,引擎自身的功能没有任何区别。
Unity引擎官方的下载地址为http://unity3d.com/unity/download/。目前,Unity官方的最新版本为Unity3.5.5,还在不
断地升级中。Unity的下载与安装比较简单,只要根据步骤进行就可以顺利完成这个过程。这里不再赘述了。
安装完Unity后,打开,首先看到的就是Unity的编辑器界面。在MacOS与Windows下,Unity的界面非常相似,并且它们之间的功能也都完全一样,包括制作游戏的方法、脚本的编写以及打包的过程等。它们之间唯一的一点小区别就是导航菜单栏的位置不太一样,但是导航菜单栏中的选项与功能都是完全一样的。所以,无论在MacOS中使用Unity,还是在
Windows中使用Unity,其开发过程完全一样的。
这里以Windows中使用Unity。运行Unity为例,系统启动后,出现的就是Unity的编辑器主界面,如图1所示。默认情况下,打开游戏工程后,场景视图与游戏视图中是不存在任何游戏资源的,需要打开当前游戏对应的某个场景文件。图1就是打开了AngryBots场景文件之后的结果。Unity的启动离不开
2Unity引擎简介
Unity是一个3D游戏开发工具和游戏引擎套件,其中包括
了图形、音频、物理、网络等多方面的引擎支持,并且有一个非常强大的编辑器来整合这一切。原本是一个针对Mac、
Windows和Linux的游戏开发套件,后来发展到也能够在iPhone和Wii上部署,或者在Web上、Android系统上部署。Unity使用了Mono作为脚本引擎的虚拟机,并以C#或者一种
类似JavaScript的语言为脚本语言。这在游戏引擎中并不多见
Project,图1所示的就是Unity的一个例子工程(AngryBots)。Unity每次启动运行,会打开上次打开的工程文件,如果要新
建或打开其他的工程文件,可以在文件菜单中去选择相应的子菜单。
2012.19
电脑编程技巧与维护
73
实用第一智慧密集
板中查看物体时,每一个组件都有它自己的小标题栏。例如,每一个物体都包含变换组件(TransformComponent)。每个组件的参数和设置都可以在检视面板中修改。
游戏制作完毕后,需要进行平台打包才能最终发布。在
Windows下打包与运行是比较简单的。首先,在Unity导航菜
单栏中选择“File”→“BuildSettings”菜单项,此时打开
BuildSettings对话框,如图2所示。在打包游戏平台中有多种
格式可供选择。当选择某个发布平台后,点击SwitchPlatform,然后可以选择PlayerSettings进行相关的参数设置。一旦选择完成,点击右下角的“BuildandRun”按钮,即可在Windows下创建自己的项目了。
图1
Unity编辑环境主界面
在主界面上,有几个比较主要的Tab窗口,这里作个简要的介绍。中间部分是游戏Game窗口和场景Scene窗口,前者是游戏窗口,就是游戏运行时的初始摄像机窗口,后者是编辑状态下当前的场景Scene对应的窗口,可以在该窗口中选择对象,然后进行编辑。
图1中左边下面是层次(Hierarchy)
窗口。层次视图
(Hierarchy)将显示当前打开的.unity场景文件(SceneFile)中
的所有物体。它用于选择并成组物体。当从场景中添加或删除一个物体时,它将在层次中显示或消失。如果不能在场景视图中同时看到所有物体,可以使用层次来选择并检视它们。Unity使用一个称为父化(Parenting)的概念。任何物体都可以成为另一个物体的父或子。一个子物体可以从它的父物体继承移动和旋转。Parenting对于组织场景、角色、接口元素或者保持场景整洁有很大的用处。单击一个物体并将其拖动到另一个物体上可以建立父子关系。将会看到一个三角显示在新的父物体的左边,现在可以展开或折叠父以便在层次中查看它的子物体,而不会影响游戏。
图1的中间下方是工程视图(ProjectView)。当创建一个工程时,将生成一组文件夹。其中之一被称为资源(Assets)文件夹。在工程视图(ProjectView)中可以查看资源文件夹。如果打开过资源文件夹,将发现所有的项都将出现在工程视图中。不同的是在工程视图中,将创建并将物体连接在一起。这些关系将存储在工程文件夹的其他位置。从工程视图中移动资源将维持并更新文件之间的联系。从Finder中移除资源将断开联系。因此,应该只使用Finder来将文件添加到资源文件夹。任何其他对资源的操作都应该在工程视图中进行。
图1中的右边部分是检视面板(Inspector),当在场景窗口、层次窗口或工程视图中选中或编辑对象时,检视面板(Inspector)就会显示当前选中物体的基本信息,也显示它所包含的组件(Component)和组件的属性。它是用来设置场景中物体属性的地方。当创建一个好玩的游戏时,将在检视面板上做大量的工作。每一个物体都包含许多不同的组件。当在检视面
图3
游戏中的地球模型与纹理素材
首先,准备游戏所需素材。游戏素材就是开发游戏所需要的模型、纹理、图片等。这里主要是地球的模型和纹理图片。模型比较简单,可以自己在Unity中建模,然后贴上纹理图片即可。如图3所示。然后,将地球模型在Unity中设置为预设类型(prefab)。
图2
Unity打包发布设置窗口
3《玩转地球》游戏的设计与实现
《玩转地球》游戏是一个简单的小游戏,它的一般思路是:
游戏玩家控制触摸屏幕,控制游戏中的一个“地球”转动(自转或绕转),在一分钟内,如果被控制的“地球”与游戏中的另外一个“星球”相撞,则玩家赢,游戏结束,否则游戏失败。这个游戏的思路很简单,重在介绍游戏开发的一般方法。
74
2012.19
电脑编程技巧与维护
GAMEPROGRAM
游戏编程
{
t=transform.GetComponent(TextMesh);if(Time.time>rate){
if(flag){
t.font.material.color=Color.white;flag=false;}else{
t.font.material.color=Color.red;
flag=true;}
rate+=1;
}
if(Input.GetKey(KeyCode.Escape)){Application.LoadLevel(0);}}
//myFont.js#pragmastrict
privatevarflag:boolean=false;privatevarrate:float=1;privatevart:TextMesh;functionUpdate(){
t=transform.GetComponent(TextMesh);if(Time.time>rate){
if(flag){
t.font.material.color=Color.yellow;flag=false;}else{
t.font.material.color=Color.green;
flag=true;}
rate+=1;
}
if(Input.GetKey(KeyCode.Escape)){Application.LoadLevel(0);}主要功能还是在主场景playearth中完成的。其中有两个主要的脚本,具体是gui.cs和rotate.cs,分别附加到场景中的主摄像机和地球模型上。这是两个C#实现的脚本,具体的实现
其次,设计游戏算法。游戏设计有3个状态:游戏运行状态、失败状态、成功状态。每个状态设计为一个单独的场景(scene)。为了控制游戏的启动与停止,在主界面上添加一个按钮start,游戏启动之后,开始一分钟倒计时,该按钮变为
stop。如果点击stop按钮,游戏停止,回到启动之前状态,倒
计时计数器清零。在游戏启动后的一分钟内,用户玩家通过触摸来控制游戏中的地球自转或绕转。综上所述,游戏设计中,需要设计3个场景(scene)和3个脚本(script)。3个场景分别是failure、win和playearth。3个脚本命名为Clock、Gui和
rotate。Clock作为时钟脚本,控制游戏的时间,即控制游戏一
分钟倒计时的显示。Gui是用户界面控制脚本,如果在Gui中实现时钟的倒计时显示,就不需要Clock脚本了。Gui脚本中还包括对用户按钮的控制,比如start按钮和stop按钮。Rotate脚本主要用来控制地球模型的旋转,左右旋转。在设计时,让地球绕略偏的中心轴旋转,这样地球在自转的同时,可能会根据中心轴的位置不同,自动绕转,增加了游戏的趣味性。场景和脚本在工程窗口中的设计如图4所示。
图4场景与脚本的设计
第三,编码实现游戏算法。根据以上的设计,实现3个场景。Win场景和failure场景的实现比较简单,在主场景中截图,然后标示成功或失败即可。实现后的win场景和failure场景如图5所示,其中的成功与失败的文字可以闪烁(红色与白色交替,或黄色与白红色交替)以提示游戏结果。
图5win场景和failure场景
文字闪烁显示功能实现的脚本代码分别为FailFont.js和
代码如下:
myFont.js,附加给场景的中文本,可以在MonoDevelop中编
辑、查看,具体实现如下:
//FailFont.js#pragmastrict
privatevarflag:boolean=false;privatevarrate:float=1;privatevart:TextMesh;
//gui.cs
usingUnityEngine;
usingSystem.Collections;
publicclassgui:MonoBehaviour{privateboolstarted;publicintstopTime;publicintendTime;publicintcurrentTime;
2012.19
电脑编程技巧与维护
75
实用第一智慧密集
publicintsecond;publicintminute;
privatestringprintTime;
privatestringstringEndTime;privateGUIStylestyle;privatestringbuttonText;
publicGameObjectearthprefab;voidStart(){startTime=60;
started=false;
buttonText="Start";stopTime=0;}
voidOnGUI(){
varcolor=newColor(0.6f,0.1f,0.5f,1f);//文字颜色if(buttonText=="Start")
if(GUI.Button(newRect(6,6,80,20),buttonText)){
startTime=60;started=true;
buttonText="Stop";
stopTime=Mathf.CeilToInt(Time.fixedTime);Instantiate(earthprefab,newVector3(5-Random.value*10,transform.position.y,transform.position.z+5+Random.value*20),Quaternion.identity);
}
if(buttonText=="Stop")
if(GUI.Button(newRect(6,6,80,20),buttonText)){
Application.LoadLevel(0);
stopTime=Mathf.CeilToInt(Time.time);started=false;
buttonText="Start";}
GUI.color=color;
if(started)GUI.Label(newRect(100,8,200,200),"Timeleft:"+stringEndTime);
}
voidUpdate(){
if(started){
endTime=startTime-currentTime;
second=endTime%60;minute=endTime/60;
currentTime=Mathf.CeilToInt(Time.fixedTime-stopTime);
if(second<10){printTime=":0";}else{printTime=":";}
stringEndTime="00:0"+minute+printTime+second;
//print("00:0"+minute+printTime+second);
print(stringEndTime);if(endTime<0)
{
endTime=0;
Application.LoadLevel(1);started=false;
buttonText="Start";}}}
}
//rotate.cs
usingUnityEngine;
usingSystem.Collections;
publicclassrotate:MonoBehaviour{privateboolflag;privatefloatspeed;privatefloatlowspeed;privatefloatrotationSpeed;publicCameracamera;
publicfloatviewSpeed=0.7f;
publicfloatscrollWheelSpeed=2.0f;//UsethisforinitializationvoidStart(){
flag=true;speed=0.0f;
rotationSpeed=0.0f;lowspeed=0.988f;}
//UpdateiscalledonceperframevoidUpdate(){
speed=speed-Input.GetAxis("Horizontal");
rotationSpeed=rotationSpeed+Input.GetAxis("
Vertical")*0.01f;
if(Input.GetMouseButton(0)){
//speed=speed+0.1f;
this.camera.transform.RotateAround(camera.transform.position,Vector3.up,viewSpeed);
}else
if(Input.GetMouseButton(1)){
//speed=speed-0.1f;
this.camera.transform.RotateAround(camera.
transform.position,Vector3.up,-viewSpeed);
}else
{
speed=speed*lowspeed;
rotationSpeed=rotationSpeed*lowspeed;
}
76
2012.19
电脑编程技巧与维护
GAMEPROGRAM
游戏编程
然后,设置PlayerSettings,在Unity中切换到了游戏玩家设置的窗口。如图8所示,根据需要设置相应的参数。这些参数就是安装到Android平台上的一些参数设置,也包括游戏玩家在Android平台上游戏运行时的参数设置。设置参数完成之后,就可以点击图7中的生成Build按钮了,即可得到打包后的可发布的apk文件,拷贝或下载到Android平台的设备上,安装到基于Android平台的终端设备上即可。在实际终端上运行的结果是一样的,这里不再赘述。至此,整个游戏开发完成。
按返回键退出程序
if(Input.GetKey(KeyCode.Escape)){Application.Quit();}if(flag){
transform.RotateAround(transform.position,Vector3.up,speed);
if(transform.position.z>50.0f||transform.position.z<-12.6f){
rotationSpeed=rotationSpeed*lowspeed;
}
transform.Translate(0,0,rotationSpeed);}
floatval=Input.GetAxis("MouseScrollWheel");if(val!=0){
val*=scrollWheelSpeed;floatyPos=val;
floatzPos=-val;
camera.transform.Translate(0,yPos,zPos);}}
voidOnTriggerEnter(Colliderobj){
Application.LoadLevel(2);}}
第四,游戏的测试运行。程序算法实现之后,就是游戏的测试与运行了。在游戏game窗口中观察游戏运行结果,如图6所示。
图8游戏玩家参数的设置
4结语
基于Unity游戏开发是比较方便快捷的。以一个简单的例
子进行了说明,不但例示了Javascript脚本的实现方法,而且也给出了具体的C#实现方法。例子简单,但体现了面向
Android平台的基于Unity的游戏开发的一般方法。当然,游戏
开发技术还是比较复杂的,也会遇到很多难题。更全面更复杂的功能设计与游戏开发实现还需要进一步展开研究。
图6
游戏运行结果
最后,游戏的打包与发布。在Unity中打开菜单,找到
参考文献
[1]UnityManual.http://unity3d.com/support/documentation/Manual/
index.html,2012.
[2]ReferenceManual.http://unity3d.com/support/documentation/Com
ponents/index.html,2012.
[3]Scripting.http://unity3d.com/support/documentation/ScriptRefer
ence/index.html,2012.
[4]宣雨松.Unity3D游戏开发.人民邮电出版社,2012.[5]
(美)米歇尔·梅纳德(MichelleMenard),著,史晓明,李强,译.游戏开发技术系列丛书:Unity游戏开发实战.机械工业出版社,2012.
BuildSettings,在发布设置窗口中设置游戏打包生成的参数。将3个场景都包含进去,切换到Android发布平台,如图7所示。
[6]吴亚峰,苏亚光.Android2.0游戏开发实战宝典,2010.
(收稿日期:2012-08-05)
图7
游戏发布设置窗口
2012.19
电脑编程技巧与维护
77