【Unity 3D 2019】做一個有聲音的小遊戲吧

上一篇轉盤小遊戲的介紹之後,總感覺好像少了什麼東西?對了,就是「聲音」,沒有了聲音,遊戲沒有靈魂,沒有臨場感,現在我們就來加上聲音吧。Unity支援的「聲音格式」可以自己查看一下 (其實也不多啦)。

做一個長這樣子的Game吧

遊戲製作

放入素材

  • 新增一個「2D專案」後,將遊戲中所需要的圖片拉到專案中,相對的位置調整好,然後RunRun看 (目前是不會動的),這邊就不多說了。

移動車子

  • 新增一個C# Script,以滑鼠移動的方式讓車子移動,主要依照滑鼠左鍵「按下 - GetMouseButtonDown()」跟「放開 - GetMouseButtonUp()」的位置算出速度,然後移動、慢慢減速,就是在手機上滑動的感覺。
using UnityEngine;

public class CarController : MonoBehaviour
{
    float speed;
    Vector2 startPosition;

    void Update() { MoveCarWithMouse(); }

    // 使用滑鼠移動車子
    private void MoveCarWithMouse()
    {
        // 按下滑鼠左鍵
        if (Input.GetMouseButtonDown(0))
        {
            this.startPosition = Input.mousePosition;
        }

        // 放開滑鼠左鍵 => 根據兩者的差距決定速度
        if (Input.GetMouseButtonUp(0))
        {
            Vector2 endPosition = Input.mousePosition;
            float swipeLength = endPosition.x - this.startPosition.x;
            this.speed = swipeLength / 500.0f;
        }

        transform.Translate(this.speed, 0, 0);
        this.speed *= 0.98f;
    }
}

加入音效

  • 為車子加入「音效」的Component - AudioSource,比較要注意的是,如果「Play On Awake」打勾的話,只要一Run就會發出聲音了,這樣滿怪的,所以這裡是把它「取消掉」。這裡可以看到,在車子的圖片上會多一個「聲音的圖示」。而取得播放元件的方法是使用「GetComponent()」,去取得「AudioSource」的元件 (應該說「轉型」),到這裡在車子動的時候就會有音效了。
using UnityEngine;

public class CarController : MonoBehaviour
{
    float speed;
    Vector2 startPosition;

    void Update() { MoveCarWithMouse(); }

    // 使用滑鼠移動車子
    private void MoveCarWithMouse()
    {
        // 按下滑鼠左鍵
        if (Input.GetMouseButtonDown(0))
        {
            this.startPosition = Input.mousePosition;
        }

        // 放開滑鼠左鍵 => 根據兩者的差距決定速度
        if (Input.GetMouseButtonUp(0))
        {
            Vector2 endPosition = Input.mousePosition;
            float swipeLength = endPosition.x - this.startPosition.x;
            this.speed = swipeLength / 500.0f;

            PlaySound();
        }

        transform.Translate(this.speed, 0, 0);
        this.speed *= 0.98f;
    }

    // 播放音效
    private void PlaySound() {
        GetComponent<AudioSource>().Play();
    }
}

加入文字框

  • 在這裡我們加上一個用來顯示距離的文字框 - Text,這裡可以發現到,文字框的位置跟遊戲的位置好像差滿遠的?不過在Run的時候還是正確的。

更新文字框

  • 加上一個空白的物件,然後新增一個C# Script給它,而取得物件的實體是以「GameObject()」來做處理,然後依照車子跟旗子的距離來計算出有沒有超過終點。
using UnityEngine;
using UnityEngine.UI;

public class GameDirector : MonoBehaviour
{
    GameObject car;
    GameObject flag;
    GameObject distance;

    void Start() { InitGameObject(); }
    void Update() { FinishTesting(); }

    // 先找到畫面上的物件在哪裡 (名字就是在屬性表上看到的名字)
    private void InitGameObject() {
        this.car = GameObject.Find("car");
        this.flag = GameObject.Find("flag");
        this.distance = GameObject.Find("Distance");
    }

    // 測試車子有沒有到終點 (GetComponent()的使用)
    private void FinishTesting() {
        float length = this.flag.transform.position.x - this.car.transform.position.x;

        if (length > 0) {
            this.distance.GetComponent<Text>().text = "距離目標還有 " + length.ToString("F2") + " 公尺";
        } else {
            this.distance.GetComponent<Text>().text = "抵達終點";
        }
    }
}

範例程式碼下載

後記

  • 這篇主要是延續上一次的功能,然後在加上聲音,慢慢的做出一個完整的小遊戲。