论文部分内容阅读
摘要:在信息化的时代,随着人们生活水平的提高,人们对于娱乐的方式也越发丰富,而游戏则是一种深受广大人民群众喜愛的娱乐方式,渐渐成为人们生活中必不可少的一部分。本文通过Unity3D中c#脚本技术实现“飞机大战”这一实例,详细阐述开发3D飞机大战的方法和技术。
关键词: Unity3D;飞机大战;c#脚本
1 系统设计
1.1 系统描述
这款游戏主要是太空射击类游戏,在游戏中,玩家可以驾驶自己的战机,通过击败敌人来获得相应的分数,游戏过程中还可以调试飞行速度,敌人是外太空飞碟和宇宙飞船,玩家可以控制飞机向敌机开火,同时躲避伤害,以保证自己的血量安全。撞击敌人或者受到子弹攻击护甲值减一,当护甲值为0时游戏失败,玩家可以选择再来一次或者退出游戏。
2 关键技术实现
2.1 对象资源池化管理
以飞机本身为例,本游戏系统的资源管控方法基于游戏物体工厂管理UI、UI面板与游戏物体的激活与失活。游戏物体工厂拥有一个工厂基类BaseFactory,实现接口 IBaseFactory并在该基类中使用对象池技术,使子弹、怪物、敌机在生成时不必反复创建和销毁对象,只需要从对象池中取出与放回对象便可节省系统资源。
游戏物体工厂拥有一个枚举类型FactoryType,用于区分不同种类的游戏物体工厂。游戏物体工厂拥有三个工厂类GameFactory、UIFactory和UIPanelFactory继承至工厂基类,它们之间的区别是修改了在对象池获取资源时的资源路径。
2.2 系统关键算法实现
2.2.1碰撞检测基本原理
碰撞检测主要是检测两个或多个物体是否相交,可以通过计算两两物体之间的位置关系进行判断。或者可以说碰撞检测主要是计算两个物体在几何空间上的重叠空间的问题。对于二维空间中的碰撞检测来说,计算量不是很大,计算过程不算复杂,因为物体都在一个平面上。但是在三维空间中就不同了,三维空间的碰撞检测要比二维中的碰撞检测复杂的多。虽然同样是由多边形构成的三维物体,但是由于增加了一个维度,使得碰撞检测的计算量大大的增加。
碰撞检测主要检测的是三个问题。第一个问题就是两个或多个物体之间是否发生了碰撞。第二,如果发生了碰撞,那么是在什么时间发生的碰撞、碰撞的持续时间和碰撞结束的时间。第三,如果发生了碰撞,那么碰撞点在什么位置。这三个问题基本上占据了碰撞检测的全部计算量,计算过程也因此变得十分复杂。
2.2.2基于OBB算法的碰撞检测计算
在进行碰撞检测之前需要通过调用AddBoxCollider方法给所检测的刚性物体添加包围盒。其中刚性物体包括飞机、子弹、飞碟、敌机等实际的物体。在此以行动中的飞机为例。把玩家操控的飞机作为A物体,先通过Distance(A,B)方法计算出其他物体与A(飞机)物体距离最近的物体。如果得到的距离小于0,则说明碰撞了。如果大于0则需要利用碰撞检测技术具体计算。当得到的距离大于0时,利用OBB算法计算是否发生碰撞的规则如下所示。
Algorithm:collision detection based on OBB
Input:object A and object B
Output:whether two objects collide or not at any moment
Step1:SA←Get All Separating Axis;
Step2:i←0;
Step3:result←FALSE;
Step4:do{
1) CurrentSA ←SA[i];
2) rA ←Get Projection on CurrentSA of A;
3) rB ←Get Projection on CurrentSA of B;
4) T*L←Get Projection distance on CurrentSA between A and B;
5) If (T*L >rA+rB)
{ return result←FALSE;
i++; }
Else return result ←TRUE;
}while !result
3 游戏策划
3.1 游戏UI
(1)屏幕上会显示主角的装甲以及得分。如果游戏结束,屏幕上会显示“游戏结束”,同时还会显示出“重新开始”按钮。
(2)主角
主角拥有三级装甲,被敌人击中或撞击一次,则损失一次装甲值,当装甲值为0时,游戏结束。
3.2 游戏操作
(1)本游戏将在PC平台上开发,按键盘上的W、S、A、D或上、下、左、右键控制主角上下左右飞行,按空格或鼠标左键射击。
(2) 敌人
游戏中敌人分为初级敌人和高级敌人两种: 初级敌人:装甲较弱,为飞碟类,以撞击主角为主,沿弧线飞行。
高級敌人:装甲较强,为宇宙飞船类,可以发射子弹,后期子弹会越来越快,沿直线飞行。
4 系统实现
游戏有多个功能模块,这里仅详细讲解“游戏开始”模块和“游戏结束”模块。
4.1游戏开始
(1)开始功能的实现
游戏开始,首页显示游戏开始按钮,点击“开始游戏”按钮,进入游戏。
(2)开始按钮的代码:
PublicvoidOnResetButtonClick ()
{SceneManager. LoadScene(“Main”);
4.2游戏结束界面的实现
(1)重新开始按钮
重启按钮主要说的就是在游戏中,你点击“再试一次”按钮,本游戏就会重新开始,但不会记录此次所操作的分数。
PublicvoidOnResetButtonClick ()
{SceneManager.LoadScene(“StartUI" );
(2)分数显示
分数是在游戏结束时保留数据,切换到场景后,游戏可以显示读取的数据,然后对多次的游戏份数进行保存,可以对游戏得数进行查询。
4.3游戏主界面的实现
(1)场景的搭建
Unity包导入到项目中,将资源包作为面板直接拖放到项目中,然后选择所有导入。导入后,选择场景模型,拖放到“层次”面板,然后重置模型的变换组件。
(2)用户的功能实现
需要在资源包中找到角色,把用户主角放在“层次结构”窗格中。
5系统测试
此飞机大战游戏在Unity3D Mono 模拟器上运行,游戏运行平稳,界面简单易懂,操作简单,画面明亮。
6结语
从游戏的开始界面、游戏界面、游戏对象、游戏结束界面等模块开始。使用Unity3D引擎,结合C#开发了一个简单的飞机大战游戏。游戏包括组件安装、碰撞检测和敌方出现位置是关键技术。基本实现了一般的游戏功能,可扩展性也很高。
参考文献:
[1] 宣雨松,编著.Unity3D游戏开发[M].人民邮电出版社.2015
[2]曾雪松,尚光龙。三维虚拟校园漫游动画设计与实现一 以信阳职业技术学院为例[J].福建电脑.2016.
[3]李莉,曾晓燕,李锴,等.基于unity3d的模拟驾驶游戏.计算机产品与流通,2020(9):117-118.
作者简介:
张照乾(1996-),男,汉族,河北邯郸人,硕士,研究方向为计算机科学与技术、图像处理
吕文超(1998-),男,汉族,河北沧州人,硕士,研究方向为计算机技术、深度学习
通信作者:黄猛(1976-),男,汉族,河南省新乡人,硕士,教授,研究方向为GIS 、软件工程、机器学习、深度学习、大数据分析,E-mail:[email protected]
防灾科技学院 河北三河 065201
关键词: Unity3D;飞机大战;c#脚本
1 系统设计
1.1 系统描述
这款游戏主要是太空射击类游戏,在游戏中,玩家可以驾驶自己的战机,通过击败敌人来获得相应的分数,游戏过程中还可以调试飞行速度,敌人是外太空飞碟和宇宙飞船,玩家可以控制飞机向敌机开火,同时躲避伤害,以保证自己的血量安全。撞击敌人或者受到子弹攻击护甲值减一,当护甲值为0时游戏失败,玩家可以选择再来一次或者退出游戏。
2 关键技术实现
2.1 对象资源池化管理
以飞机本身为例,本游戏系统的资源管控方法基于游戏物体工厂管理UI、UI面板与游戏物体的激活与失活。游戏物体工厂拥有一个工厂基类BaseFactory,实现接口 IBaseFactory并在该基类中使用对象池技术,使子弹、怪物、敌机在生成时不必反复创建和销毁对象,只需要从对象池中取出与放回对象便可节省系统资源。
游戏物体工厂拥有一个枚举类型FactoryType,用于区分不同种类的游戏物体工厂。游戏物体工厂拥有三个工厂类GameFactory、UIFactory和UIPanelFactory继承至工厂基类,它们之间的区别是修改了在对象池获取资源时的资源路径。
2.2 系统关键算法实现
2.2.1碰撞检测基本原理
碰撞检测主要是检测两个或多个物体是否相交,可以通过计算两两物体之间的位置关系进行判断。或者可以说碰撞检测主要是计算两个物体在几何空间上的重叠空间的问题。对于二维空间中的碰撞检测来说,计算量不是很大,计算过程不算复杂,因为物体都在一个平面上。但是在三维空间中就不同了,三维空间的碰撞检测要比二维中的碰撞检测复杂的多。虽然同样是由多边形构成的三维物体,但是由于增加了一个维度,使得碰撞检测的计算量大大的增加。
碰撞检测主要检测的是三个问题。第一个问题就是两个或多个物体之间是否发生了碰撞。第二,如果发生了碰撞,那么是在什么时间发生的碰撞、碰撞的持续时间和碰撞结束的时间。第三,如果发生了碰撞,那么碰撞点在什么位置。这三个问题基本上占据了碰撞检测的全部计算量,计算过程也因此变得十分复杂。
2.2.2基于OBB算法的碰撞检测计算
在进行碰撞检测之前需要通过调用AddBoxCollider方法给所检测的刚性物体添加包围盒。其中刚性物体包括飞机、子弹、飞碟、敌机等实际的物体。在此以行动中的飞机为例。把玩家操控的飞机作为A物体,先通过Distance(A,B)方法计算出其他物体与A(飞机)物体距离最近的物体。如果得到的距离小于0,则说明碰撞了。如果大于0则需要利用碰撞检测技术具体计算。当得到的距离大于0时,利用OBB算法计算是否发生碰撞的规则如下所示。
Algorithm:collision detection based on OBB
Input:object A and object B
Output:whether two objects collide or not at any moment
Step1:SA←Get All Separating Axis;
Step2:i←0;
Step3:result←FALSE;
Step4:do{
1) CurrentSA ←SA[i];
2) rA ←Get Projection on CurrentSA of A;
3) rB ←Get Projection on CurrentSA of B;
4) T*L←Get Projection distance on CurrentSA between A and B;
5) If (T*L >rA+rB)
{ return result←FALSE;
i++; }
Else return result ←TRUE;
}while !result
3 游戏策划
3.1 游戏UI
(1)屏幕上会显示主角的装甲以及得分。如果游戏结束,屏幕上会显示“游戏结束”,同时还会显示出“重新开始”按钮。
(2)主角
主角拥有三级装甲,被敌人击中或撞击一次,则损失一次装甲值,当装甲值为0时,游戏结束。
3.2 游戏操作
(1)本游戏将在PC平台上开发,按键盘上的W、S、A、D或上、下、左、右键控制主角上下左右飞行,按空格或鼠标左键射击。
(2) 敌人
游戏中敌人分为初级敌人和高级敌人两种: 初级敌人:装甲较弱,为飞碟类,以撞击主角为主,沿弧线飞行。
高級敌人:装甲较强,为宇宙飞船类,可以发射子弹,后期子弹会越来越快,沿直线飞行。
4 系统实现
游戏有多个功能模块,这里仅详细讲解“游戏开始”模块和“游戏结束”模块。
4.1游戏开始
(1)开始功能的实现
游戏开始,首页显示游戏开始按钮,点击“开始游戏”按钮,进入游戏。
(2)开始按钮的代码:
PublicvoidOnResetButtonClick ()
{SceneManager. LoadScene(“Main”);
4.2游戏结束界面的实现
(1)重新开始按钮
重启按钮主要说的就是在游戏中,你点击“再试一次”按钮,本游戏就会重新开始,但不会记录此次所操作的分数。
PublicvoidOnResetButtonClick ()
{SceneManager.LoadScene(“StartUI" );
(2)分数显示
分数是在游戏结束时保留数据,切换到场景后,游戏可以显示读取的数据,然后对多次的游戏份数进行保存,可以对游戏得数进行查询。
4.3游戏主界面的实现
(1)场景的搭建
Unity包导入到项目中,将资源包作为面板直接拖放到项目中,然后选择所有导入。导入后,选择场景模型,拖放到“层次”面板,然后重置模型的变换组件。
(2)用户的功能实现
需要在资源包中找到角色,把用户主角放在“层次结构”窗格中。
5系统测试
此飞机大战游戏在Unity3D Mono 模拟器上运行,游戏运行平稳,界面简单易懂,操作简单,画面明亮。
6结语
从游戏的开始界面、游戏界面、游戏对象、游戏结束界面等模块开始。使用Unity3D引擎,结合C#开发了一个简单的飞机大战游戏。游戏包括组件安装、碰撞检测和敌方出现位置是关键技术。基本实现了一般的游戏功能,可扩展性也很高。
参考文献:
[1] 宣雨松,编著.Unity3D游戏开发[M].人民邮电出版社.2015
[2]曾雪松,尚光龙。三维虚拟校园漫游动画设计与实现一 以信阳职业技术学院为例[J].福建电脑.2016.
[3]李莉,曾晓燕,李锴,等.基于unity3d的模拟驾驶游戏.计算机产品与流通,2020(9):117-118.
作者简介:
张照乾(1996-),男,汉族,河北邯郸人,硕士,研究方向为计算机科学与技术、图像处理
吕文超(1998-),男,汉族,河北沧州人,硕士,研究方向为计算机技术、深度学习
通信作者:黄猛(1976-),男,汉族,河南省新乡人,硕士,教授,研究方向为GIS 、软件工程、机器学习、深度学习、大数据分析,E-mail:[email protected]
防灾科技学院 河北三河 065201