Unity3d射击游戏报告

Unity3d射击游戏报告
Unity3d射击游戏报告

Unity3D游戏开发

课程设计实验报告

项目名称 GoldCoinGame

班级 11402

小组成员唐智梁俊龙薛柯高立存

姓名唐智

学号1404240717

1.游戏说明

游戏运行画面:

游戏目标:收集八个硬币,得到的硬币数量会显示在右上角。

游戏菜单:按esc显示,有三个选项:继续游戏,重新开始和退出游戏。

操作:WASD控制方向,12切换武器,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.首先创建环境,CreatEmpty——Environment,将课堂上做过的水的预制体DaylightWater放入到其下。

2.创建一个Terrain和三个DirectionalLight。

3.地形的凸起和凹陷操作界面

4地形的贴图操作界面

5.设置树木和草地。

7.调整好光线角度,再把工厂预制体拖到小岛上。效果预览

8.创建一个Empty,给它添加Capsule,MeshRenderer,CharacherController,

和Rigibody。(MouseLook和CharacterMotor以及Fpsinput均是课堂上使用过的例子,之后会用到)

9.将Empty命名为MyFirstPersonController,将tag改为Player。把主摄像

机移动到该目录下。

10.在摄像机maincamera下添加如下的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

// Activate the selected weapon

if (i == index)

transform.GetChild(i).gameObject.SetActive(true);

// Deactivate all other weapons

else

transform.GetChild(i).gameObject.SetActive(false); }

}//切换武器的函数

12.给empty添加m4_preview,该文件主要负责步枪的子弹数量和开火音效播放,以及步枪的装弹。之后添加audiosource,选择开火的子弹发射音效文件。

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 time

while( nextFireTime < Time.time && bulletsLeft != 0) {

GetComponent.().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 hit

if (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 object

hit.collider.SendMessageUpwards("ApplyDamage",

damage,

SendMessageOptions.DontRequireReceiver);

}

bulletsLeft--;

m_LastFrameShot = Time.frameCount;

enabled = true;

// Reload gun in reload Time

if (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主要负责步枪的开火、装弹等动画播放。给它添加一个audiosource,选择下载的武器换弹音效。

15.手枪的步骤和步枪类似,就不在阐述,不同处如需要修改开火的速率(firerate)等参数即可。

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的预制体:创建一个3dobject,建立一个cube,再放在预制体的文件夹perfabs里,再更改cube的贴图为黑色,命名为cube_dead,同样拖入perfabs中。

给预制体cube添加一个DamageReciver,使它能接收到子弹的伤害,从而从cube 转换成cube_dead。

同时,勾选中iskinematic,让这个预制体被子弹击中前不受到里的影响,这样可以把cube悬空而不掉落,而变成cube_dead则会掉落。

20.把制作的coin模型导入,添加刚体,同样勾选iskinematic,并加入CapsuleCollider,勾选isTrigger,最后关联Coin.cs。

void Update () {

transform.Rotate (new Vector3 (rotationSpeed * Time.de ltaTime, 0, 0));

}

void OnTriggerEnter(Collider col) {

if (col.gameObject.tag == "Player") {

col.gameObject.SendMessage ("itemPickup");

Destroy(gameObject);

}

}

分析:

硬币没被拾取时,会沿着x轴旋转

玩家触碰到coin时,会传递一个信息itemPickup,提示该硬币已经被拾取,之后会销毁该硬币。

21.回到第一人称控制器,给MyFirstPersocontroller添加脚本item,

选择金币拾取音效、拾取贴图。创建并添加提示文字GUItext。

创建一个empty命名为CoinGUI,添加guitexture,选择image为coin0,即没有失去硬币时候的显示图。Coin到Coin8依次对应获得八个硬币的显示图。

22.准星的添加:创建一个empty,添加crosshair脚本,将网上下载的准星贴图添加进来。

大致的步骤就如上所述。

小组成员:唐智

主要负责部分:武器模块和esc菜单模块以及实验报告的编写。

武器的部分是由我制作的,相对于我们课堂上制作的火箭筒和步枪,这个项目里面多了reload这个动作,并且是可以主动按r来reload的(课堂上的项目只能打空弹匣来换弹)。

开始时,我在原来的脚本基础上修改代码,想把调用动画的代码也写进计算子弹fire和reload的代码中,但是出现了很多问题:如动画不能正常播放、或是播放了动画不开火等。

最后,我将这两个部分的脚本分开到两个目标上,解决了这些问题。

第二个小问题,就是装弹后子弹数量没有实时更新到text里面,但是开火后子弹数量会重新刷新。这个问题通过在reload函数末添加了显示子弹数的代码后解决。

这次在原来的游戏基础上新添加了esc菜单这一功能,脚本使用c++编写。

在操作完后要注意的是需要完成File—buildsetting—add openscenes

这样才算是完成,因为Application.LoadLevel(0);这句代码中的0就是代表着我们add的这个场景位于第一位,这样restart按钮才能进入到这个场景的初始阶段,达到重新开始的目的。

相关主题
相关文档
最新文档