当前位置:文档之家› 虚拟现实及数据可视化__Unity课程设计报告 (支康仪,张琦,朱雨婷,石彦飞,张桐)

虚拟现实及数据可视化__Unity课程设计报告 (支康仪,张琦,朱雨婷,石彦飞,张桐)

1东南大学仪器科学与工程学院虚拟现实与数据可视化Unity 课程设计设计名称:TankWar院系名称:仪器科学与工程学院测控技术与仪器小组成员:支康仪22012235石彦飞22012216张桐22012213朱雨婷22012207张琦22012206指导老师:孙立博报告时间:2015 年01月04 日目录1、前言 (3)1.1 作品名称 (3)1.2 作品成员和分工 (3)1.3 指导老师 (3)1.4 作品简介 (3)2、系统方案 (4)2.1 使用说明 (4)2.2 设计方案 (4)2.2.1场景的制作以及坦克模型的导入 (4)2.2.2 坦克移动,子弹效果以及MouseLook的实现 (6)2.2.3 AI的实现 (8)2.2.4 游戏场景切换的实现 (10)3、课程设计总结 (11)4、参考文献 (12)5、附录部分 (12)5.1 小组成员分工 (12)5.2 作品效果图 (13)231、前言1.1 作品名称TankWar1.2 作品成员和分工1.3 指导老师孙立博仪器科学与工程学院1.4 作品简介游戏是娱乐生活的重要部分,对于缓解压力有着极大的作用。

而坦克大战作为我们童年的经典的一款游戏,其已经带给我们难以忘怀的回忆。

通过这学期虚拟现实课程的学习,我们小组将unity 3d 与射击游戏相结合,制作了一款精彩纷呈的3D 坦克大战游戏,整个过程将所学的知识与实践相结合,帮助我们对于unity 3d 的应用有了更深的了解。

我们设计的这款名为TankWar 的3D 坦克大战游戏一共分为三关。

第一关设置的是荒漠场景,给人一种苍凉的感觉,我方坦克和敌方坦克在一望无际的荒漠上激战,实在是让人酣畅淋漓。

第二关设置的是沼泽森林,同样的作战手法不同的环境也让人耳目一新。

最后一关双方坦克开进了人们所生活的城市,在高楼林立中展开一场激战。

三个关卡的难度逐渐增加,梯度合理,让人想挑战且欲罢不能,具体难度设置可从下表看出:42、系统方案2.1 使用说明1)开发环境:Unity 3D 2)操作方法(按键控制)2.2 设计方案2.2.1 场景的建立整个游戏分成三关实现,所以需要绘制三个场景。

第一个场景是荒漠,第二个场景是森林,我们使用上课学过的unity3d 中建立地形的方法,第一关和第二关均是自己绘制的。

最后一关我们想寻求新意,于是从网上下载了一个城市的3d 模型导入建好的场景里边,并通过在建筑物上加cube 来给其中的建筑物赋予了rigidbody 这一物理属性使其可以检测碰撞等。

第一关最后在场景面板中(俯视): 在游戏面板中显示如下:5第二关展示:第三关:以上是我们游戏的三个场景,因为坦克大战并不需要赛道之类的东西,所以其实场景绘制还是比较简单,我们基本上是利用unity3d 自带的资源包,只在第一关中导入了一些岩石模型以及荒漠的纹理图片,当然,第三关也是导入模型并给其添加物理属性。

整个游戏场景的制作到此基本完成。

2.2.2坦克模型的导入敌方坦克和玩家坦克均是通过导入模型建立起来的,这些模型是我们从网站上搜寻的资源。

坦克的构成由几个部分组成,为了实现鼠标控制视角的功能,我们还在坦克中内置了一个摄像头,以及为了实现坦克开前灯的效果我们在坦克中添加了一个点光源。

我们可以从层次面板中看到:6坦克的具体组成部分如下: 玩家坦克:其中炮筒如下: 坦克基座如下:再加上光源,相机,以及连接炮筒和基座的两个cube(为了使得炮筒旋转),最后给坦克模型加上rigidbody 这一物理属性,整个坦克模型就制作完成了。

为了在游戏中能区分敌我,增加游戏的可玩性,敌方坦克与玩家坦克造型略有不同,但是制作和导入方法相似,最后的敌方坦克我们做成如下:完成了玩家坦克的导入后,下面所进行的工作即为给坦克添加脚本来实现复杂的功能。

2.2.2坦克移动,子弹效果以及MouseLook 的实现2.2.2.1坦克的移动移动是坦克作战中最为基础的部分,为了实现这个功能,我们给坦克添加了一个TankMover的7 脚本,其中实现移动的代码如下:this.transform.Rotate(new Vector3(0,Input.GetAxis("Horizontal")* TurnSpeed * Time.deltaTime,0)); this.transform.position += this.transform.forward * Input.GetAxis("Vertical") *Speed* Time.deltaTime;主要Input.GetAxis 这个函数来获取移动或是旋转的方向(响应键盘按下的键值,这一部分在unity 中已经集成好的)并乘以相应的速度和时间,分别控制坦克前进后退以及左右旋转。

其中speed 是我们之前所设定的值,水平方向则旋转,垂直方向则前进后退。

2.2.2.2鼠标控制视角实现这个函数实现的比较复杂,我们参考了unity3d 自带的第一人称控制的相关代码并修改了有关参数。

这里只截取其中关键的一部分来进行简单说明: 主要是通过枚举来实现三种情况的鼠标控制:if (axes == RotationAxes.MouseXAndY)//可以上下左右旋转 { 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); } else if (axes == RotationAxes.MouseX)//只能左右旋转 { transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0); } else //只能上下旋转 { rotationY += Input.GetAxis("Mouse Y") * sensitivityY; rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0); }代码中共枚举了鼠标变化的三种状态,分别给出相应的旋转角度,方向等。

通过获取鼠标变化的方向再乘以相应的灵敏度来得到变化的角度,并通过transform 域操作来更新坦克的状态。

2.2.2.3发弹效果实现本游戏中控制坦克发弹主要通过两个函数WeaponController 和WeaponLauncher 来实现,WeaponLauncher 中又调用了shoot 函数来控制炮弹发射间隔时间以及数量(AI 中敌方坦克是自行发射炮弹的),通过不断对炮弹这一预设进行实例化,当检测到碰撞时给对象造成一定的伤害值,并且炮弹自身会消失,从而形成整个坦克发射炮弹系统。

炮弹实例化部分代码: if (Muzzle) {GameObject muzzle = (GameObject)GameObject.Instantiate (Muzzle, missileposition, missilerotate);muzzle.transform.parent = this.transform; GameObject.Destroy (muzzle, MuzzleLifeTime); if (MissileOuter.Length > 0) {muzzle.transform.parent = MissileOuter [currentOuter].transform; } }8for (int i = 0; i < NumBullet; i++) { if (Missile) {Vector3 spread = new Vector3 (Random.Range (-Spread, Spread), Random.Range (-Spread, Spread), Random.Range (-Spread, Spread)) / 100;Vector3 direction = this.transform.forward + spread;GameObject bullet = (GameObject)Instantiate (Missile, missileposition, missilerotate); if (bullet.GetComponent<DamageBase> ()) {bullet.GetComponent<DamageBase> ().Owner = Owner; } if (bullet.GetComponent<WeaponBase> ()) {bullet.GetComponent<WeaponBase> ().Owner = Owner; bullet.GetComponent<WeaponBase> ().Target = target; } bullet.transform.forward = direction; if (RigidbodyProjectile) { if (bullet.rigidbody) {if (Owner != null && Owner.rigidbody) {bullet.rigidbody.velocity = Owner.rigidbody.velocity; }bullet.rigidbody.AddForce (direction * ForceShoot); } } } }2.2.3AI 实现1)首先我们设置的游戏中敌方坦克是在游戏开始后随机出现在游戏场景的中的随机位置,这就需要给当前的场景添加一个脚本,我们所采取的办法是在场景或者地形中添加一个cube ,并在这个cube 上绑定一个实现敌方坦克会自动出现的功能。

public GameObject ObjectSpawn; //自动出现的对象,可在面板中直接拖进 private float timeSpawnTemp = 0;//游戏的什么时间开始出现public float TimeSpawn = 20; //多长时间出现一个 public float ObjectCount = 0; //出现的数量public int TankAIScale = 20;//坦克的大小 public int Radiun;//出现的范围大小public int spawnerheight = 3;//掉落的高度在这段代码中我们先设置了几个静态的变量,是关于敌方坦克出现的数量,游戏的什么时候开始出现,每个多长时间出现一个,以及坦克的大小,坦克出现的范围和掉落的高度。

相关主题