游戏程序设计报告Word格式文档下载.docx
《游戏程序设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《游戏程序设计报告Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
第2章游戏开发工具和关键技术简介
2.1开发工具
本次游戏开发语言使用C#
采用Unity3d4.6游戏引擎开发
代码编写使用VS2012
模型制作采用3dMax2012
2.2关键技术
游戏中设计的关键技术主要有物体的精确碰撞检测,背景动画的循环播放。
精确碰撞检测:
物体的精确碰撞实现方法有很多,在这个游戏中使用的是制作模型来达到精确碰撞的目的。
首先在3dMax中制作出敌人的模型和一个同模型相接近的骨骼,并依附在模型中一起打包成FBX格式的模型,然后在Unity3d中直接导入该模型,就可以直接使用之前制作好的骨骼来做精确碰撞处理,如下图:
背景动画的循环播放:
实现背景的循环播放方法也很多,常见的比如直接使用2张可以前后对接的图片,当一张图片播放完成后直接在后面接入另一张图片,重复此过程,即可达到动画循环的目的。
在这个有些中,我直接使用的Unity3d中的动画系统来制作UV动画,如下图:
第3章游戏程序总体设计
3.1游戏总体流程:
首先玩家进入游戏主界面,进行选择,点击退出则直接退出游戏。
选择挑战模式则进入游戏,游戏失败可以选择继续或者返回主界面,选择生存模式则当声明值耗尽时显示玩家分数并显示回退按钮退回到主界面,选择游戏帮助,则进入帮助界面。
3.2游戏类图:
(1)敌人类图:
游戏中有4种敌人,如上图所示,其中最原始的敌人是Enemy类,其它3中敌人都继承于Enemy,只是重写了移动方法和少量属性。
(2)玩家类图:
玩家类中有MovwTo()方法,该方法实现玩家追随鼠标移动的方法,在手机上即让玩家追随手指移动。
其中的OnTriggerEnter()方法检测碰撞并作出相应的逻辑计算。
(3)子弹类:
子弹类分为玩家子弹和敌人子弹,其中敌人子弹继承于玩家子弹,重新了碰撞检测逻辑,由于Unity3d可直接在面板中设置脚本属性的值,因此每种敌人的子弹类不需要再重新写一个类,只需要依附EnemyRocket脚本后再重新设置值即可。
第4章游戏程序实现与测试
4.1敌人碰撞逻辑的实现:
voidOnTriggerEnter(Colliderother)
{
if(other.tag.CompareTo("
PlayerRocket"
)==0)//如果子弹发生碰撞
Rocketrocket=other.GetComponent<
Rocket>
();
//获取子弹对象的引用
if(rocket!
=null)
m_life-=rocket.power;
//减少生命值
if(m_life<
=0)//敌机生命值用尽就销毁
if(GlobalPramameters.gameModel=="
SurviveModel"
)//如果是生存模式
SurviveModelManage.Instance.AddScore(m_point);
if(SurviveModelManage.Instance.GetScore()-100*GlobalPramameters.lifeAddCount>
=0)
mplayer.m_life+=1;
//增加生命
GlobalPramameters.lifeAddCount+=1;
}
else
GameManager.Instance.AddScore(m_point);
//消灭敌人后增加分数
Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);
//播放爆炸特效
Destroy(this.gameObject);
Player"
)==0&
&
this.gameObject.tag.CompareTo("
Model_Helicopters_Apache"
)!
m_life=0;
bound"
)==0)
4.2终极BOSS的移动实现:
protectedoverridevoidUpdateMove()
m_fireTimer-=Time.deltaTime;
if(m_fireTimer<
m_fireTimer=1;
if(m_player!
Vector3relativePos=m_transform.position-m_player.position;
//敌机位置减去玩家位置,得到一个向量差
Vector3leftPos1=m_transform.position;
//左边发射导弹位置
Vector3leftPos2=m_transform.position;
Vector3rightPos1=m_transform.position;
//右边发射导弹位置
Vector3rightPos2=m_transform.position;
leftPos1.x-=0.9f;
leftPos2.x-=1.3f;
rightPos2.x+=0.9f;
rightPos1.x+=1.2f;
Instantiate(m_rocket,leftPos1,Quaternion.LookRotation(relativePos));
//让子弹朝着玩家飞
Instantiate(m_rocket,leftPos2,Quaternion.LookRotation(relativePos));
Instantiate(m_rocket,rightPos2,Quaternion.LookRotation(relativePos));
Instantiate(m_rocket,rightPos1,Quaternion.LookRotation(relativePos));
//前进:
Z方向直线往下走
floatrx=Mathf.Sin(Time.time-GlobalPramameters.time)*Time.deltaTime*6.0f;
//左右移动
floatrz=0f;
int[]myArray={1,2};
floatelement=myArray[Random.Range(0,myArray.Length)];
if(element%2==0)
rz=Mathf.Sin(Time.time)*Time.deltaTime*(-1.0f);
//上下移动
rz=Mathf.Sin(Time.time)*Time.deltaTime*(1.0f);
m_transform.Translate(newVector3(rx,0,rz));
4.3玩家移动逻辑实现
voidMoveTo()
if(Input.GetMouseButton(0))
Vector3ms=Input.mousePosition;
//获得鼠标屏幕的位置
Rayray=Camera.main.ScreenPointToRay(ms);
//将屏幕位置转为射线
RaycastHithitinfo;
//用来记录射线碰撞信息
booliscast=Physics.Raycast(ray,outhitinfo,1000,m_inputMask);
//产生射线
if(iscast)
m_targetPos=hitinfo.point;
//如果射中目标,记录射线碰撞点
Vector3pos=Vector3.MoveTowards(this.transform.position,m_targetPos,(m_speed+20)*Time.deltaTime);
//获得朝目标移动的位置,第三个参数数移动的最大速度
this.m_transform.position=pos;
//更新当前的位置
4.4玩家碰撞逻辑实现:
voidOnTriggerEnter(Colliderother)
=0&
other.tag.CompareTo("
Quad"
=0)
HelicoptersRocket"
m_life-=2;
m_life-=1;
4.5游戏界面GUI显示逻辑实现:
voidOnGUI()
//游戏暂停
if(Time.timeScale==0)
if(nextLevel)
switch(GlobalPramameters.currentLevel)
case1:
GUI.skin.label.fontSize=50;
//放大字体
GUI.Label(newRect(0,Screen.height*0.2f,Screen.width,60),"
通关成功"
);
GUI.skin.label.fontSize=20;
//进入下一关按钮
if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.4f,100,30),"
进入下一关"
))
Application.LoadLevel("
level_2"
//载入下一关
break;
case2:
level_3"
case3:
挑战终极BOSS"
GlobalPramameters.time=Time.time;
level_4"
default:
GamePause();
m_life=(int)m_player.m_life;
//获得生命值
else//游戏结束
游戏失败"
if(GUI.Button(newRect(Screen.width*0.5f-50,Screen.height*0.5f,100,30),"
返回主菜单"
start"
//读取关卡
m_score=0;
m_life=GlobalPramameters.playerLife;
GlobalPramameters.currentLevel=0;
if(GlobalPramameters.currentLevel==4&
Helicopters_Apache==null)
YOUAREWINNER!
"
GUI.skin.label.fontSize=15;
GUI.Label(newRect(150,5,100,30),"
生命值:
+m_life);
//显示生命值
//显示记录
GUI.skin.label.alignment=TextAnchor.LowerCenter;
GUI.Label(newRect(0,5,Screen.width,30),"
记录:
+m_hisore);
//显示当前得分
GUI.Label(newRect(0,25,Screen.width,30),"
得分:
+m_score);
}
4.6敌人生成逻辑实现:
voidUpdate()
canInstance=false;
if(m_gameModel=="
)
//控制生成不同敌人的时机
currentScore=SurviveModelManage.Instance.GetScore();
if(currentScore>
=350)
canInstance=true;
elseif(currentScore>
=250&
=100&
(this.gameObject.tag.CompareTo("
Enemy"
)==0||this.gameObject.tag.CompareTo("
SuperEnemy"
)==0))
elseif((this.gameObject.tag.CompareTo("
//控制挑战模式下游戏难度
if(GlobalPramameters.currentLevel==3&
this.m_enemy.tag.CompareTo("
Model_Helicopters_Transport"
enemyNumber=25.0f;
elseif(GlobalPramameters.enemyCount>
20)
enemyNumber=5.0f;
10)
enemyNumber=10.0f;
enemyNumber=15.0f;
m_timer-=Time.deltaTime;
if(m_timer<
m_timer=Random.value*enemyNumber;
//Random.value随机生成0.0到1.0的数
m_timer=17;
elseif(m_timer<
4)
m_timer=4;
&
canInstance)
Instantiate(m_enemy,m_transform.position,Quaternion.identity);
elseif(m_gameModel!
="
GlobalPramameters.enemyCount+=1;
第五章收获
在这次游戏设计开发中,使用了Unity3d,VS2012,3dMax等开发工具,涉及到的关键技术有UV动画的制作,物体精确碰撞检测的实现,物体追随鼠标移动,需要改进的地方,游戏背景比较单调,战机类型较少,敌机级别种类太少,战机的功能、子弹种类。
特效等等。
第六章参考文献
【1】Unity3D游戏开发_宣雨松著_人民邮电出版社
【2】Unity3D手机游戏开发金玺曾
著清华大学出版社
【3】3dsmax总动员Modeling人体建模篇(4DVD)作者:
窦项东出版社:
科学出版社
【4】从零开始:
3dsmax基础培训教程(3dsmax7中文版)作者:
詹翔,王海英出版社:
人民邮电出版社
学生学习心得
通过本次游戏开发,加深了我对游戏设计与实现的理解,增强了对理论知识的运用和理解,同时也发现了自己的很多不足之处,学到了自学到一些其他方面的知识。
也锻炼了团队协作能力。
同时要感谢技术好的同学和老师对我们帮助和指导。
学生(签名):
杨鹤
2015年07月04日
诚信承诺
本人郑重声明所呈交的课程报告是本人在指导教师指导下进行的研究工作及取得的研究成果。
据我所知,除了文中特别加以标注的地方外,论文中不包含其他人已经发表或撰写过的研究成果。
与我一同工作的同学对本文研究所做的贡献均已在报告中作了明确的说明并表示谢意。
任课
教师
评语
成绩评定:
任课教师(签名):
年月日