Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(下)

这部分内容关注的是游戏性的提升,包括音效、计分等功能的实现。
传送门:
太空射击(Space Shooter)流程介绍与代码分析(下)

11.添加音效
音效分配3种,爆炸音效、发射子弹音效和背景音效。其中爆炸音效将音频文件直接拖入爆炸素材中即可,如下所示。


对于背景音效文件,我们可以拖入GameController,并勾选loop,这样在游戏开始时即可自动循环播放。


而发射子弹的音效,在PlayerControl中实现,打开代码文件。添加定义和实现代码

    public AudioClip weaponFire;    //添加音效
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) &&Time.time > nextFireTime)
        if (Input.GetButton ("Fire1")&&Time.time > nextFireTime)
        {
            audio.PlayOneShot(weaponFire);    //播放音效
            nextFireTime = Time.time + fireRate;
            Instantiate    //shooting function
                (
                bullet,
                bulletPosition.transform.position,
                bulletPosition.transform.rotation
                    );
        }
    }
}
即可,之后将音效拖入其中即可实现。


此时,需向Playership中添加一个AudioSource,否则会报错。
12.销毁爆炸效果及计分功能
在之前的进度中,我们实现了大部分游戏功能,但是无法消除爆炸效果,如下所示。


本部分就介绍如何解决这一问题。
新建一个脚本,DestroyExplosion,写入
using UnityEngine;
using System.Collections;
public class DestroyExplosion : MonoBehaviour {
    public float lifetime;
    void Start () {
        Destroy (this.gameObject, lifetime);
    }
}
即可

之后将这一脚本拖入各个爆炸效果中,如下所示即可。


分数显示:
在4.6.9中不能像教程那样添加GUIText,因此使用一个替代的Text,来代替。GameObject——>UI——>Text添加即可。GUIText的定义与Text差不多。
例如:public GUIText scoreText  与public Text ScoreText对应即可,调用函数等操作方法是一样的。


在GameController中要构建累加分数的函数,并在外部进行调用。
其定义与累加函数如下。
    private int score;
    public void AddScore(int v)
    {
        score += v;
        scoreText.text = "Score:  " + score;
    }
即可。
分数添加完毕后,就有了一个问题,在哪个外部函数进行调用呢?只有在子弹击中陨石之后才能进行加分,因此我们在DestroyByContact中的陨石爆炸处进行调用。
  1. 在DestroyByContact中,我们新建一个GameController对象gameController,之后通过gameController调用加分函数。
  2. 在void Start()中添加一个GameObject对象gameControllerObject,将Hierarchy中的GameControl的Tag设置一下,作为查找标记,如下图所示。
  3. 如果gameControllerObject找到GameControl的Tag,将gameControllerObject.GetComponent<GameController>()赋给gameController,此时gameController即可调用GameControl中的函数。
  4. 用gameController调用AddScore函数,完成分数的添加。
上述流程变量名相似,多理解几遍即可,这也是一种常用的使用“Tag”调用函数的方法。DestroyByContact的代码如下。


using UnityEngine;
using System.Collections;
public class DestroyByCotact : MonoBehaviour {
    
    public GameObject explosion;
    public GameObject playerExplosion;
    private GameController gameController;    //步骤1,新建GameController对象
    public int score = 10;
    void Start()
    {
        GameObject gameControllerObject = GameObject.FindWithTag ("GameController");    //步骤2,查找GameControl
        if (gameControllerObject != null)
        {
            gameController = gameControllerObject.GetComponent<GameController>();    //步骤3,若步骤2查找到,赋值给gameController
        }
        if (gameControllerObject == null)
        {
            Debug.Log("could not find the gamecontroller");
        }
    }
    void OnTriggerEnter (Collider other)
    {
        if (other.gameObject.tag == "Boundary")     //if other.gameObject belongs to "Boundary",do nothing.
        {
            return;
        }
        if (other.gameObject.tag == "Player")     //if other.gameObject belongs to "Player",destroy the playership.
        {
            Instantiate (playerExplosion, this.transform.position, this.transform.rotation);
            gameController.GameOver();
        }
        Destroy (other.gameObject);
        gameController.AddScore (score);    //步骤4,进行加分
        Destroy (this.gameObject);
        Instantiate (explosion, this.transform.position, this.transform.rotation);    //destroy the asteriod
    }
}
13.GameOver之后的操作
游戏结束后的操作包括以下几个:
  1. 陨石不再产生
  2. 显示游戏结束
  3. 按某个键重新开始游戏。
本节主要介绍这几个功能的实现。
在GameControl中新建一个bool值,用以判断游戏是否结束,并添加两个文本用以实现游戏结束与重新开始的提示(即2、3的操作),定义与函数实现如下。
    private bool gameOver = false;
    public void GameOver()
    {
        gameOver = true;
        gameOverText.text = "Game Over!";
        helpText.text = "Press 'R' to Restart";
    }
之后实现陨石不再产生的操作(即1),在产生陨石函数中添加判断语句并break,如下
    IEnumerator SpawnWave()
    {
        yield return new WaitForSeconds(gameStartTime);
        while (true)
        {
            for (int i=0; i<10; i++)
            {
                Spawn ();
                yield return new WaitForSeconds (waitTime);
            }
            yield return new WaitForSeconds(waveTime);
            if(gameOver) break;    //若结束,则break
        }
    }
函数定义实现后,需要确定何时调用GameOver,我们可以在DestroyByContact中的飞机爆炸中进行调用。代码如下
if (other.gameObject.tag == "Player")     
        {
            Instantiate (playerExplosion, this.transform.position, this.transform.rotation);
            gameController.GameOver();    //12节已经建立了Tag的关系,因此 gameController可以直接调用GameContrl中的GameOver函数
        }
对于重新开始游戏,我们可以在GameControl中用Update函数进行实现,代码如下
    void Update () {
        if (gameOver && Input.GetKeyDown (KeyCode.R))
        {
            Application.LoadLevel(Application.loadedLevel);    //重新加载游戏函数
        }
至此,所有的函数功能都以实现,游戏已经可以正常运行。

总结:Space Shooter作为一个初学者很容易上手的游戏,实现起来难度不大。之后将会逐步加大难度,进行更高难度游戏的开发学习。
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值