簡體   English   中英

在 Unity 中使用 C# 進行音頻淡入/淡出?

[英]Audio Fade In/Out with C# in Unity?

我剛剛在 Unity 中為我的 android 平台游戲添加了一個音頻管理器,該管理器基於Brackeys 的這個視頻教程,它按預期工作。 我想請人幫助我了解如何實現音頻淡入/淡出代碼(我認為這將是一個協程),以便在游戲開始時所有聲音淡入以及當我調用按鈕上的函數時(退出游戲 UI 按鈕已經創建),然后所有聲音都會消失。

我試圖從我以前的 UI 管理器腳本中實現一個協程,但不幸的是我在理解這個問題時遇到了問題。 游戲的所有其他功能都按我的意願工作。

音樂課.cs

using UnityEngine.Audio;
using UnityEngine;

[System.Serializable]
public class Classmusic
{
    public string name;

    public AudioClip clip;

    [Range(0f, 1f)]
    public float volume;
    [Range(0.1f, 3f)]
    public float pitch;

    public bool loop;

    [HideInInspector]
    public AudioSource source;
}

音樂播放器.cs

using System.Collections;
using UnityEngine;
using System;
using UnityEngine.Audio;


public class MPlayer : MonoBehaviour
{
    public Classmusic[] music;

    private void Awake()
    {
        foreach (Classmusic m in music)
        {
            m.source = gameObject.AddComponent<AudioSource>();
            m.source.clip = m.clip;
            m.source.volume = m.volume;
            m.source.pitch = m.pitch;
            m.source.loop = m.loop;
        }
    }

    private void Start()
    {
        Play("MainMusic");
    }

    public void Play (string name)
    {
        Classmusic m = Array.Find(music, sound => sound.name == name);
        if (m == null)
        {
            Debug.LogWarning("Music: " + name + " not found!");
            return;
        }
        m.source.Play();

    }
}

這里的一個問題是您有兩卷,一卷在 Classmusic 中,另一卷在 Classmusic 中包含的 AudioSource 源變量中。 我猜播放函數設置source.volume = 0; ,但我不能肯定地說。 你有沒有嘗試過這樣的事情?

IEnumerator FadeIn(Classmusic sound) {
    sound.volume = 0;
    sound.source.volume = 0;
    float speed = 0.01f;   

    for (float i = 0; i < 1; i += speed)
    {
        sound.volume = i;
        sound.source.volume = i;
        yield return null;
    }
}

我知道設置兩個變量很煩人,但最好讓它們保持同步。 您還可以使用 SetVolume() 函數來設置 AudioSource 音量和 Classmusic 類中的變量。

在我的項目中,我使用了這個解決方案,它允許您為其選擇衰落時間和插值函數(例如 Mathf.Lerp、Mathf.SmoothStep 等)。

聲音文件

using UnityEngine;

[System.Serializable]
public class Sound
{
    public string name;
    public AudioClip clip;

    [Range(0f, 1f)]
    public float volume;
    [Range(.1f, 3f)]
    public float pitch;

    public bool loop;

    [HideInInspector]
    public AudioSource source;

}

音頻淡入淡出

using UnityEngine;
using System.Collections;
using System;

public class AudioFade
{
    public static IEnumerator FadeOut(Sound sound, float fadingTime, Func<float, float, float, float> Interpolate)
    {
        float startVolume = sound.source.volume;
        float frameCount = fadingTime / Time.deltaTime;
        float framesPassed = 0;

        while (framesPassed <= frameCount)
        {
            var t = framesPassed++ / frameCount;
            sound.source.volume = Interpolate(startVolume, 0, t);
            yield return null;
        }

        sound.source.volume = 0;
        sound.source.Pause();
    }
    public static IEnumerator FadeIn(Sound sound, float fadingTime, Func<float, float, float, float> Interpolate)
    {
        sound.source.Play();
        sound.source.volume = 0;

        float resultVolume = sound.volume;
        float frameCount = fadingTime / Time.deltaTime;
        float framesPassed = 0;

        while (framesPassed <= frameCount)
        {
            var t = framesPassed++ / frameCount;
            sound.source.volume = Interpolate(0, resultVolume, t);
            yield return null;
        }

        sound.source.volume = resultVolume;
    }
}

使用:

StartCoroutine(AudioFade.FadeIn(mainThemeSound, 3f, Mathf.SmoothStep));

這是我的 2d 平台游戲的解決方案。 當我的播放器靠近/遠離其父對象時,我的聲音淡入/淡出,我將其稱為“敵人”。

Enemy 上的音頻源設置:

Spatial Blend: 1
Volume Rolloff: = Linear Rolloff
Min distance = 1
Max distance = 30

將音頻偵聽器放在您的播放器對象上,它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM