[英]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.