unity3D游戏设计期末报告(精选3篇)
一、游戏策划简介(游戏类型、游戏主题、游戏故事简要概述)
1、游戏类型:
个人冒险类游戏
2、游戏主题:
救出Alice的妹妹
3、游戏故事简要:
Alice的妹妹被困在了房子里,Alice请求冒险家帮她把妹妹救出来,冒险家在岛上收集够了足够的能源终于打开房门救出了妹妹。
二、游戏交互方式(玩法、如何操作、游戏规则)
1、玩法
玩家要控制冒险家在岛上的各个地方收集能源,与NPC对话可以获得提示,收集够四个能源之后打开房门救出妹妹赢得胜利。
2、如何操作
WASD控制冒险家上下左右移动,空格键跳跃,X键可以搬动石块。
3、游戏规则
1、必须收集四个能源块才能打开房门。
2、必须在靶场得到400分才能得到能源块。
3、必须搬走石块才能得到能源块。
4、玩家的活动范围不能超出小岛之外。
5、必须救出妹妹才能赢得胜利
三、游戏工程环境(unity版本、外置插件说明、外部资源包)
1、unity版本
Windows版本:Unity3d 5.5.0f3
2、外置插件说明
无
3、外部资源包
1、背景音乐: Pure World
2、游戏界面上的图片
3、神殿的FBX资源包,石门的资源包,房间以及人物模型的资源包
四、游戏场景管理(场景关系)
1、场景关系
1、游戏开始界面的场景
2、游戏玩法介绍的场景
3、游戏游玩的场景
4、关系:游戏开始界面可以进入游戏玩法介绍的场景和游戏过程的场景,游戏胜利之后自动跳转到游戏开始界面的场景
五、功能模块:(实现过程描述)GUI 玩家(摄像机)控制 敌人的生成、敌人的控制……
1、主要的Gui: 人物对话的gui:人物对话时显示背景图片和对话内容,背景图片和对话内容的添加通过代码添加,创建两个public变量,然后从角色位置向NPC发射一条经过鼠标位置的射线,如果击中NPC 则进入到对话状态,显示对话内容和背景图片。
具体代码如下:
效果图:
2打靶处gui的实现:打靶处的GUI是通过人物接触到垫子的触发器出现的,当人物站在垫子触发器的范围之内可以射击靶子,建立三个public变量,分别存放准星,得分以及分数的GUI,然后判断人物是否接触到垫子,如果接触到则显示GUI并且可以发射小球,小球是提前存放的预置对象。具体代码如下: 能源的gui:能源的GUI需要使用动态材质,因为人物每收集一个电池GUI都要发生改变,这段代码放在人物身上,提前设置好需要改变的数量以及GUI图片,再捡到电池的时候依次显示。关键代码如下:
4游戏开始的GUI界面:游戏开始界面的GUI显示是先创建了一个空对象,在空对象上添加了GUItext组件,然后写代码,把图片转换成GUI再拖到代码上。、玩家:
Unity自带的第一人称视角
3、摄像机:
一共2个摄像机,一个主摄像机,一个第一人称的摄像机,玩的时候是以第一人称为主。npc:
Alice:委托玩家任务的NPC,请求玩家救出被困在房子里的妹妹
Amy:被困在房子里的Alice的妹妹,当玩家接触到Amy时则判断游戏胜利。Bob:给予玩家提示的NPC,告诉玩家哪里可以得到能源。背景音乐:
在主摄像机上添加
这俩个组件。添加背景音乐
文件。
六、总结(在制作过程出现的问题、学习心得)
1、出现的问题:
1、和Bob说话时,改变鼠标样式之后改变不回来。
2、模型导入时出现的一些贴图丢失。
3、导出时鼠标样式错误,因为之前用的是GUI格式的,改变成Cursor格式后解决了这个问题。
4、还有许多小问题经过努力得以解决。
2、学习心得
以下是对自己在学习unity中所领悟到的新知识的一些体会:
关于摄影机控制,如果场景中有多架摄影机,那么如何确定第一打开时间所显示的摄影机,就需要设置Camera属性中的Depth数值,数值越大的摄影机越优先显示。
加载游戏关卡, 即 切换游戏场景Sence Application.LoadLevel(“GameSence”);销毁游戏对象
Destroy(this.gameObject);
1 总体设计
起初设计飞机射击游戏灵感来源于微信的“打飞机”游戏,在微信上好友一起竞技比拼所获得的分数,这里还包含网络通信设计,本文不涉及。单机的飞机射击游戏要考虑很多因素,比如积分,一些玩法上和界面上的设计等方面。界面上设计包括使用不同的飞机、子弹要素,几种爆炸效果,碰撞奖励物品效果等。玩法上包括子弹奖励和TNT炸弹奖励,这两种将奖励物品随机出现,一种是子弹的奖励,将原本中间一路子弹变成侧翼的两路子弹;另一种则是威力强大的TNT炸弹奖励,能够清空屏幕内所有的敌机。游戏失败的情况设计,敌机与玩家控制的飞机产生碰撞后进入失败画面。敌机设计上,敌机不产生子弹,玩家只需要躲避屏幕上方下落的敌机即可。子弹的奖励是有固定的持续时间,TNT炸弹奖励可以储存累加,点击右下角的炸弹的小图标使用。游戏的操作是通过手指控制主角飞机移动,玩家躲避敌机并可以接受在敌机中降落的奖励物品。子弹是跟随主角的移动而移动,所以只需要把自身飞机(即是子弹的轨迹)瞄准到敌机即可击落敌机,设计得尽量操作简单些。
开发工具使用Unity3D,平台为Android操作系统。利用Unity的Level功能,预设计游戏提供三种关卡,第一种叫做经典模式,即普通的飞机游戏。第二种是疯狂模式,敌机下落的速率以及血量都有提升,同样玩家控制的飞机发出的子弹威力也更大。第三种是换机模式,玩家控制的飞机换了模型,换了模型之后的飞机,在参数上,设置了威力更大的子弹(子弹出现的速率高),奖励物品的威力也同时加强。
2 游戏对象
2.1 游戏背景与主角飞行效果
整个游戏的背景产用两张贴图的叠加。采用代码控制两张同样的贴图交替移动,实现背景的移动,导入飞机后就能够产生飞机移动的效果。关键代码包括,要在外部定义公有变量设置移动的速度,这里必须要注意是要设置为静态变量,否则运行程序会报错。关键代码如下。
其中,8.52f是由背景图片的高像素决定的,图片高为852像素。
飞机的飞行,单张的飞机素材是不行的。现在已经实现了背景的移动,以背景为参照物,飞机已经在飞行。现在要产生飞机的飞行效果。使用两张不同飞机尾部燃烧效果,首先定义精灵图组,键入以下关键代码。然后在Inspector面板中进行选择贴图,即能实现飞机喷气飞行效果。完成效果如图1所示。
2.2 敌机的产生
上面已经实现了主角飞机的飞行移动,接下来需要在屏幕内随机产生敌机。敌机在屏幕上方自动生成,移动到屏幕下方之后重新定位到屏幕上方,总数量固定从而节约游戏运行内存。在Unity3D中建立一个空的Object,由它来随机产生敌机。在随机产生敌机之前,导入敌机的预制(Prefabs),直接从素材图片(Images)文件中拖动至Hierarchy面板中。Spawn是新建的空的Object。在其中绑定代码,需要定义各类不同的敌机出现速率,定义过程如图2所示。
public float enemy0Rate = 1.5f;//定义一种敌机出现的速率
同时,需要设置奖励物品的出现速率。有两种不同的奖励物品,因为威力不同,出现的速率也不一样。
public float award Type0Rate = 8f;
定义好之后,需要注意随机产生的敌机或者奖励物品,需要在超出一定范围之后消失,不然产生的物体一直会存在,会占用内存。敌机定义的参数如图2所示。
以上代码表示当超过某个位置,敌机就应该消失。
2.3 子弹的发射
子弹在Unity3D设定为预制。将它们拖到主角(hero)的对象下,即为hero的子对象。调整好他们的位置,正好在左右以及中间。接下来给子弹绑定代码。让子弹能够按照给定的速度自动向上升。非常简单,只需要给一个速度即可以实现
public float rate =2f;
和敌机一样,需要在超出屏幕范围之后使子弹消失。
3 碰撞与控制效果
3.1 子弹与敌机发生碰撞
在碰撞之前,要给需要碰撞的物体加上刚体,也就是collid-er。给敌机的预制,主角的预制以及奖励物品的预制都添加上了Polygon Collider 2D。给子弹加上Box Collider2D。给子弹以及敌机以及主角hero加上刚体之后,就可以通过代码实现碰撞了。一定要给需要碰撞的物体加上刚体,否则将不会发生碰撞。
检测碰撞设置时首先要设置标签(Tag),要为需要碰撞的物体设置标签,标签是可以重复的使用的,即不同的物体可以使用同一个标签。那就给同一类物体标上同一个标签,比如给敌机全都设置为”Emeny”。这样一来就可以判断是否碰撞到了敌机。同样的,主角碰撞奖励物品,子弹碰撞敌机,敌机碰撞主角,都是同样的方法。在这里列举主角碰撞奖励物品的代码:
上述代码中的tag=="Award",就是找到“Award”标签。
3.2 主角的控制
游戏是基于Android平台开发的手机游戏,所以采用触屏方式控制主角飞机,玩家通过手指的操控就可以实现飞机的移动。在unity软件中,可以编写控制代码控制鼠标的移动,导出成Android平台相当于在手机上手指移动控制飞机。
直接使用check Position,检测鼠标(或者是手指)的位置。要保证的飞机不飞出屏幕外部,即在x,y轴上,正负都不超过屏幕的宽度。主角的飞机的像素为100*114,在unity中屏幕的宽和长为480*852。拖动主角的飞机,如图7 中,在position中能检测x和y轴,拖动到屏幕边缘,发现position中x为正负1.8,而上下移动的时候,发现y为正负3.4。因此在代码中书写鼠标(或手指)移动的范围左右是1.8f,上下则是3.4f。主角坐标控制的设置如图3所示。
4 结束语
通过Unity的Building功能导出游戏。在Build Setting中设定选项后导出APK文件,通过手机助手拷贝到Android手机上,安装后运行,经测试可以顺利玩起来无问题,测试效果如图4所示。制作过程中除了主要的unity之外,使用Photoshop,3DS Max制作素材,使用C#语言代码实现控制,还可以使用视频软件片头片尾导出成apk格式,难点在于如何在unity中播放帧动画(即在游戏中的敌机爆炸死亡动画),如何使物体进行碰撞(collider),是否考虑重力(Is Trigger)以及判断碰撞之后进行的一系列操作等等。
总结整个设计过程,使用unity3D制作飞行类游戏,可以很方便地包括设计敌机的碰撞、飞行速度,碰撞触发的效果,使用产卵器(spawn)随机产生敌机,并控制敌机出现的速率。游戏的操作通过手机触碰屏幕,跟随手指移动方向移动敌机。飞机主角的可以通过手指点选移动并操控,同时自动发射子弹。游戏物体之间的碰撞时通过坐标检测,一旦发生碰撞便出发C#代码的所写的效果。限于本文篇幅,游戏其他部分如计分代码实现、片头片尾动画实现等将在以后逐步完善。
参考文献
[1]李发陵.软件工程[M].北京:清华大学出版社,2013:212.
[2]Ryan Henson Creighton.Unity 3.x游戏开发实例[M].师蓉,译.北京:人民邮电出版社,2013:324.
[3]周德云.Flash动画制作与应用[M].北京:人民邮电出版社,2012:352.
[4]吴亚峰.Android3D游戏案例开发大全[M].北京:人民邮电出版社,2013:648.
已有好些天没写什么了,今天想起来该写点东西了。这次我所介绍的内容主要是为了配合我前面所写的角色运动章,那就是动画。这是一个很复杂的概念,今天,我就把我所理解的有关动画方面的观点跟大家说说,不对的地方请大家指感谢。
老实说,我学Unity时,角色控制真的是一个难点,尤其是动画方面。想要在Unity中控制好一个角色且让这个角不是一个简单的问题,需要我们深入理解其原理。只有这样,我们才有能力写一套精湛的角色控制脚本。Unity里面的动画(也许是我的程度不够吧),我们不要期望自己不用将Unity动画系统的一些原理搞清楚就能够写出一套很棒的角色控制脚蠢的。仅仅只是角色移动就播放跑步的动画,角色停下来就播放站立的动画,具有这种想法的程序员应该注意一下了。
那么怎么开始呢?我认为我们必须了解一些基本的概念。首先我们来了解一些基本的知识。首先是动画的导入。相信读本帖之前就已经对动画的导入有一定的了解了,这里我可能会从头开始讲解,因为个人程度不同嘛。一般角色动画是在三好了之后,再导入到unity3d中去的,且文件格式一般是*.FBX。Unity3D中导入角色动画的方式主要有两种,这两种方
1.分割动画。美术在三维软件中对角色的动作设计完成之后将所有动画集中在一个FBX文件上。我们只需知道其制的个数与其对应的帧数就可以对存储在这个FBX文件上的动画进行准确的分割。详细过程官方文档上写的很清楚,我们只的执行就行。但是要注意一点,我们可以在分割动画的时候会遇到这样一个选项:WrapMode,图如下:
这个WrapMode(循环模式)很重要,默认状态下系统选择的是Default,你可以调节其为其他选项,比如Loop利用脚本来动态的操作它。关于其用法,我们会在后面的代码中得以体现。
2.多重动画文件。这是一个很方便的动画导入方法。在项目中,美术有可能将动画数据与模型分开制成FBX文件,只需找到动画的FBX模型,对它们以一个通用的方式命名即可。即“模型名@动画名”,例如一个模型的名字叫做gam,并且个名为“idle”的动画的FBX文件,那么我们可以将这个FBX模型的名字命名为:
“gam@idle”。需要注意的是这个根模型中的各个动画的循环模式是Default,而且在Inspector面板中无法修改中修改,有点坑吧。而且方式二中的文件占用大小对于方式一来说确实增大不少,这对于移动设备类游戏来说确实是一件必望读者务必注意一下。
了解完这些之后,我们该重点的谈一谈Unity里面的与动画相关的API了,重点有以下三个:Animation,AnimationClip,AnimationState。这次我们先看一下Animation这个类,我估计这次还讲不完,如果是这样讲得多一点吧。
Animation,官方是这样介绍的:The animaiton component is used play back animations.翻译过来就是:被用来播放动画集合的。说到这里,谈到了组件,对没错,这个类对应的就是我们的Animation组件。我们将Project面个FBX模型拖拽到Hierarchy面板中,你会在其对应的Inspector面板中发现其被自动添加了一个Animation组件,只段的数量默认为0。你可以调节这个动画的Size,然后从Project面板中找到相应的动画片段,此动画片段截图如下:
动画片段,即AnimationClip,实际就是上图中的那个白色右下角有个圆形的idle文件。你可以将这个动画片Animation组件中的Animations下面,前提是其Size不为0,如下图:
下面我们来深入了解一下这个组件在脚本中的运用,首先我们看一下这个类的变量:
第一个变量是指的这个Animation组件的默认播放的动画片段。第二个指的是该动画组件中默认的动画片段是时自动播放。第三个变量很重要,我们可以用脚本来控制所有动画片段的循环状态,比如我们可以这样写 :
animation.wrapMode = WrapMode.Loop;注意,小写的animation指的是该脚本附着的GameObject上组件。这句代码的功能是将该GameObject身上所有的动画片段的播放方式设置为循环播放。且可以再后续的脚本中进行那么我们有必要了解一下这个变量的类型:WrapMode。我截了一个图,如下:
WrapMode主要是用来对动画片段的播放模式来进行修改的,这五个变量代表了5中播放模式。第一个Once,这样的:当这个动画片段播放到了结尾,如果程序没有修改它的wrapMode,那么这个动画片段将会自动停止播放,而且帧数被重置为第一帧,也就是该动画片段的开头。此播放方式可以应用在射击类动画片段的wrapMode中。第二个是Loo比较熟悉了吧。如果程序没有修改它的wrapMode,该动画片段播放完最后一帧之后并不会停止,而会回到第一帧并重复前的动画状态的改变。第三个变量是PingPong,意思是当当前动画片段播放完最后一帧之后,如果程序没有修改它的wra机的在第一帧与最后一帧之间来回播放。第四个变量我们之前遇到过,在上面的动画导入方式中,如果是以分割动画的导入认每个动画片段的wrapMode为WrapMode.Default,即读取默认的设置,不过可以在Inspetor面板中修改。但是如果件的导入方式,那Unity连给你在Inspector中修改的机会都不给你,此时你只能在脚本中进行动态修改其wrapMode。ClampForever。如果当前播放的动画的wrapMode的值为WrapMode.ClampForever,那么当这个动画片段播放完最后程序没有修改它的wrapMode,那么它将会一直播放这个动画状态的最后一帧。除此之外,我们还可以在官方的Charact工程中发现这样一个变量:WrapMode.Clamp,后来经我验证,发现这个变量就是WrapMode.Once。如果读者不信的话个角色。加入这个角色具有名为“idle”(其他也行)的动画片段,那么我们可以写这样一个脚本来验证一下我们的猜想:
using UnityEngine;using System.Collections;
public class TestWrapMode : MonoBehaviour {
// Use this for initialization
void Start(){
animation.Stop();//禁用Animaton组件中的Play Automatically。
animation[“idle”].wrapMode = WrapMode.Clamp;//设置名为idle的动画片段的wrapMode属性为WrapM
}
// Update is called once per frame
void Update(){
if(animation.IsPlaying(“idle”)){//如果当前有播放idle动画那么就执行下面
Debug.Log(animation[“idle”].wrapMode);
}
if(Input.GetKeyDown(KeyCode.A)){
animation.CrossFade(“idle”);//淡入淡出名为idle的动画。
}
} }
整个脚本非常简单。我们将这个脚本绑定在我们准备好的角色身上,当我们按下“A”键时,会在Console上打wrapMode属性,那么该属性会是什么呢?
果然是Once,哎,奇怪了,不是有一个Once吗?怎么还要加个Clamp呢?估计是当时设计API时出现的一些吧。不必管它,我们只需知道这个Clamp到底属于那种效果就行了。
好了,WrapMode这个类介绍完了,下面我们该继续介绍Animation这个类。读者可能觉得我应该结合具体工知识,其实不然,如果你连最基本的概念都半生不熟的话,就不要指望写出好的控制脚本。接下来我尽量挑选一些重要的属行讲解。
类:Animation
属性:
isPlaying
角色此时是否在播放动画?
this[string name]
这个属性非常重要,他的返回值类型是AnimationState,我们叫他动画状态。
剩下的几个变量一般很少用到,读者感兴趣的话自己可以研究一下,比如animatePhysics,是用来结合运动学culling Type这个属性
你可以在Inspector面板中的Animation组件中看到,有几个选项可选,那几个选项这里我也就不多说了,接下来我们来看几个重要的函数:
1.Stop()
顾名思义,就是停止所有当前正在播放的动画。
2.Rewind(string AnimationName)
导播名为AnimationName的动画片段。
3.Sample()
在当前状态对动画进行采样,说实话,这个函数我还真没用过。
4.IsPlaying(string AnimaitonName)
这个函数的拼写和上面讲到的isPlaying属性是一样的,只是该函数的首字母是大写的。如果当前正在播放名为Ani的动画,那么此函数则返回***e,否则为false。这是一个非常重要的函数。我至今没发现Unity里面的动画相关的类中有属性能够取得当前正在播放的动画名称,后来我才发现这个是得不到的,后面我会说明原因的。
5.Play(string AnimationName)
没有任何混合的播放名为AnimationName的动画片段。老实说,现在的动画如果不混合,真的没什么看头,所以我们也不用。
6.CrossFade(string animation , float time , PlayMode mode)
这个函数我们得注意了,它具有淡入名为animation的动画并淡出当前正在播放的动画的效果,这种效果真的很棒动画播放更为平滑。并且这个函数还有两个重载的方法。比如我们角色的Animation组件中有一个名为“Walk”的动画片段要淡如这个动画片段就有一下三种
写法:
1.animation.CrossFade(“Walk”);以默认方式淡入名为“Walk”的动画,2.animation.CrossFade(“Walk”,0.3f);在0.3秒左右淡入名为“Walk”的动画;
3.animation.CrossFade(“Walk”,0.3f,PlayMode.StopsameLayer)这句代码与上句是一样的,只是第二句省数。这个参数的类型为PlayMode,里面有两个属性:PlayMode.StopSameLayer,StopAll,第一个属性表示停止同一层数中没有此参数时,默认用的就是这个属性;第二个属性表示停止所有的动画。
【unity3D游戏设计期末报告】推荐阅读:
unity3d知识点总结01-01
《英语课堂游戏设计研究》开题报告02-13
拔河游戏机课程设计实验报告09-08
幼儿游戏方案设计幼儿园游戏12-28
3D游戏设计09-29
年会游戏设计01-08
字体设计游戏01-10
游戏设计职位简历02-15
初中体育游戏化教学中游戏设计的方法论文01-30
游戏设计简历自我评价06-06