2016年3月24日 星期四

【Unity】使用Scrollbar做音量調整

這次來談談音量調整,這次會使用Scrollbar作為音量的控制器。
首先新增GameObject->UI->Scrollbar以及Button,分別做音量控制條和是否靜音按鈕。
Unity Volume Control

新增音樂播放器,使用空的GameObject即可,音樂播放器上掛載Audio Source,在AudioClip上加入音樂,到這步可以執行看看音樂是否會播放。
Unity Volume Control
必要的物件都準備好後,在音樂播放器下新增控制腳本。
這個腳本下需要做兩件事:
1.移動音量控制條位置時,要依位置改變音量。
2.按下靜音紐時,音量歸0,再按一次恢復音量。
Unity Volume Control
以下是腳本內容:
using UnityEngine;
public class MusicControl : MonoBehaviour {
    private AudioSource audioSource;
    private bool muteState;
    private float preVolume;
    void Start () {
        audioSource = GetComponent<AudioSource>();
        audioSource.volume = 0;
        muteState = false;
        preVolume = audioSource.volume;
    }
        .
        .
        .
}
首先我們需要幾個變數:audioSource抓volume(音量)的數值,muteState判斷目前靜音的狀態,以及preVolume紀錄靜音前的音量,在Start執行時,做這些變數的初始化。


using UnityEngine;
public class MusicControl : MonoBehaviour {
    private AudioSource audioSource;
    private bool muteState;
    private float preVolume;
    void Start () {
        audioSource = GetComponent<AudioSource>();
        audioSource.volume = 0;
        muteState = false;
        preVolume = audioSource.volume;
    }
    public void VolumeChanged(float newVolume) {
        audioSource.volume = newVolume;
        muteState = false;
    }
        .
        .
        .
}
接著是音量控制的函式,這裡的VolumeChanged做兩件事,當被呼叫時把newVolume帶入audioSource.volume改變音量,以及將靜音狀態設為false。


using UnityEngine;
public class MusicControl : MonoBehaviour {
    private AudioSource audioSource;
    private bool muteState;
    private float preVolume;
    void Start () {
        audioSource = GetComponent<AudioSource>();
        audioSource.volume = 0;
        muteState = false;
        preVolume = audioSource.volume;
    }
    public void VolumeChanged(float newVolume) {
        audioSource.volume = newVolume;
        muteState = false;
    }
    public void MuteClick() {
        muteState = !muteState;
        if (muteState)
        {
            preVolume = audioSource.volume;
            audioSource.volume = 0;
        }
        else
            audioSource.volume = preVolume;
    }
}
最後做靜音的控制,在MuteClick執行時做是否靜音的判斷,當按鈕按下時,一定是靜音的是或否,所以先做muteState != muteState 的true false的切換。
muteState為true,也就是靜音時,將目前的音量存在preVolume變數中,再將音量audioSource.volume設為0。
而muteState為false時,再將preVolume數值帶回audioSource.volume。

接著回到場景中,做音量控制條和靜音按鈕的設定:
Unity Volume Control

音量控制條(Scrollbar)上,找到On Value Changed按+新增項目,把播放器帶入後找到腳本下的VolumeChanged函式,按下後就可以。
靜音按鈕在On Click項目上做同樣的步驟,找到MuteClick函式按下就完成了。

以上就是音量的控制,其實還有靜音按鈕圖切換,及靜音切換時音量條的位置等小細節,不過就先跳過,這次就到這裡。

2 則留言:

  1. 我做兩個Panel , 我把上面的程式都放在第二個panel , 然後第二個panel的scarllbar功能是正常的 , 可是我跳回第一個panel時 , 第二個panel的音樂就停止了 , 而且第二個panel的動作都被初始化了 , 請問要如何解決 , 然後如果我要儲存panel的動作(比如說靜音或調大小聲)要如何做?

    回覆刪除
    回覆
    1. 您好:
      這篇文章裡面並沒有提到數值的儲存,所以換場景後是無法維持原來功能的。
      您可以可以使用DontDestroyOnLoad作物健保留,或是把數值設為靜態static。
      希望有幫助到您

      刪除

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...