Unity3D游戏开发课程设计实验报告项目名称 Gold Coin Game班级 11402小组成员唐智梁俊龙薛柯高立存姓名唐智学号 **********1.游戏说明游戏运行画面:游戏目标:收集八个硬币,得到的硬币数量会显示在右上角。
游戏菜单:按esc显示,有三个选项:继续游戏,重新开始和退出游戏。
操作:WASD控制方向,1 2切换武器,r填装弹药,空格space跳跃。
步枪状态下:鼠标右键——瞄准手枪状态下:鼠标右键——消音器2.游戏素材来源:1.开火音效:手枪与步枪开火音效来源于课堂上的实验:Fps游戏中的MachineGun开火音效。
装弹音效:来源于网络。
2.SkyBox,水,Terrain的草地和椰树等来源于课堂上的实验:Survivalland。
3.工厂模型Hangar_Full:来源于网络。
Cube的贴图:来源于网络。
4.步枪和手枪模型及其动画:来源于网络。
5.金币模型,塑料凳模型:使用3dmax软件自制。
6.显示金币数量的CoinGUI的9张图片:采用Windows画图软件绘制。
3.Unity版本:Unity 5.5.2f1 (64-bit)4. 操作步骤1.首先创建环境,Creat Empty——Environment,将课堂上做过的水的预制体Daylight Water放入到其下。
2.创建一个Terrain和三个Directional Light。
3.地形的凸起和凹陷操作界面4地形的贴图操作界面5.设置树木和草地。
7.调整好光线角度,再把工厂预制体拖到小岛上。
效果预览8.创建一个Empty,给它添加Capsule,Mesh Renderer,Characher Controller,和Rigibody。
(MouseLook和CharacterMotor以及Fpsinput均是课堂上使用过的例子,之后会用到)9.将Empty命名为MyFirstPersonController,将tag改为Player。
把主摄像机移动到该目录下。
10.在摄像机main camera下添加如下的Empty:weapon——m4a1、handgun,用来存放武器。
此外,再给camera添加skybox,选取合适的天空盒。
11.weapon添加一个js文件playerweapon,将步枪和手枪的预制体分别加到m4a1和handgun下。
Playerweapon.js主要控制武器的基本操作:开火,换弹和切换武器。
function Update () {if (Input.GetButton ("Fire1")){BroadcastMessage("fire");//对子类发送fire的信息,从而达到调用所有名为fire函数的效果}if (Input.GetButton ("reload")){BroadcastMessage("reload");}if (Input.GetKeyDown("1")) {BroadcastMessage("draw"); //按1时播放动画SelectWeapon(0);}else if (Input.GetKeyDown("2")) {SelectWeapon(1);}}function SelectWeapon (index : int) {for (var i=0;i<transform.childCount;i++) {// Activate the selected weaponif (i == index)transform.GetChild(i).gameObject.SetActive(true);// Deactivate all other weaponselsetransform.GetChild(i).gameObject.SetActive(false); }}//切换武器的函数12.给empty添加m4_preview,该文件主要负责步枪的子弹数量和开火音效播放,以及步枪的装弹。
之后添加audio source,选择开火的子弹发射音效文件。
13.添加一个UI----canvas,加入两个text,用来显示两把武器的子弹数目。
M4_preview的主要函数:function Update () {GameObject.Find("/Canvas/Text").GetComponent(Text).text=" :"+ bulletsLeft+"/∞"; //该函数可以将步枪子弹数量传递给text }function fire () {if (bulletsLeft == 0)return;if (Time.time - fireRate > nextFireTime)nextFireTime = Time.time - Time.deltaTime;// Keep firing until we used up the fire timewhile( nextFireTime < Time.time && bulletsLeft != 0) {GetComponent.<AudioSource>().Play();//每发射一枚子弹,就播放一次开火的音效FireOneShot();nextFireTime += fireRate;}Update (); //实现开枪后刷新text的子弹数量}function FireOneShot () {var direction = transform.TransformDirection(Vector3.forwa rd);var hit : RaycastHit;if (Physics.Raycast (transform.position, direction, hit, r ange)) {// Apply a force to the rigidbody we hitif (hit.rigidbody)hit.rigidbody.AddForceAtPosition(force * direction, hi t.point);if (hitParticles) {hitParticles.transform.position = hit.point;hitParticles.transform.rotation =Quaternion.FromToRotation(Vector3.up, hit.normal); hitParticles.Emit();}// Send a damage message to the hit objecthit.collider.SendMessageUpwards("ApplyDamage",damage,SendMessageOptions.DontRequireReceiver);}bulletsLeft--;m_LastFrameShot = Time.frameCount;enabled = true;// Reload gun in reload Timeif (bulletsLeft == 0)BroadcastMessage("reload");//没有子弹后自动装弹}function reload () {yield new WaitForSeconds(1); //装弹等待时间if (clips > 0) { //弹夹数量大于0时才可装弹clips--;bulletsLeft = bulletsPerClip;}Update (); //装弹完成后更新text显示的子弹数量yield new WaitForSeconds(1);}14.步枪的预制体m4animation,m4.js主要负责步枪的开火、装弹等动画播放。
给它添加一个audio source,选择下载的武器换弹音效。
15.手枪的步骤和步枪类似,就不在阐述,不同处如需要修改开火的速率(fire rate)等参数即可。
16.添加两个武器的贴图到显示弹药的text的左侧,再添加一张背景图,调整好位置后效果如图:17.添加菜单:在canvas中添加一个panel,在panel下添加三个button,分别对应退出,重新开始和继续,再添加一个text,内容为“已暂停”。
18.添加一个empty命名为_GM,给他添加Manager.cs,一个负责菜单的文件。
其主要部分如下:void Start (){UIPanel.gameObject.SetActive(false);isPaused = false;}void Update (){if(Input.GetKeyDown(KeyCode.Escape) && !isPaused)Pause();else if(Input.GetKeyDown(KeyCode.Escape) && isPaused) UnPause();}public void Pause(){isPaused = true;UIPanel.gameObject.SetActive(true);Time.timeScale = 0f;}public void UnPause(){isPaused = false;UIPanel.gameObject.SetActive(false);Time.timeScale = 1f; }public void QuitGame(){Application.Quit();}public void Restart(){Application.LoadLevel(0);}主要负责对应菜单的按钮的功能之后,给三个按钮加上相应的贴图和文字,在OnClick一栏中,选择_GM,在右侧下拉选择之前manager中对应的函数,比如退出游戏的Quit按钮就选择QuitGame。
另外,编辑Panel的image,可以更改菜单的背景图片。
效果如图19.建立cube的预制体:创建一个3d object,建立一个cube,再放在预制体的文件夹perfabs里,再更改cube的贴图为黑色,命名为cube_dead,同样拖入perfabs中。
给预制体cube添加一个Damage Reciver,使它能接收到子弹的伤害,从而从cube转换成cube_dead。
同时,勾选中is kinematic,让这个预制体被子弹击中前不受到里的影响,这样可以把cube悬空而不掉落,而变成cube_dead则会掉落。