Unity 中使用 C# 实现音频淡入/淡出?

Joz*_*nko 0 c# audio unity-game-engine

我刚刚在 Unity 中为我的 Android 平台游戏添加了一个音频管理器,该管理器基于Brackeys 的视频教程,并且按预期工作。我想请某人帮助我理解如何实现音频淡入/淡出代码(我认为它将是一个协程),这样当游戏开始时所有声音都会淡入以及当我调用按钮上的函数时(退出游戏 UI 按钮已创建),然后所有声音都会淡出。

我尝试从之前的 UI Manager 脚本中实现一个协程,但不幸的是,我在理解问题时遇到了问题。游戏的所有其他功能都按照我的意愿运行。

音乐课.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;
}

Run Code Online (Sandbox Code Playgroud)

音乐播放器.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();

    }
}
Run Code Online (Sandbox Code Playgroud)

Evg*_*kov 5

在我的项目中,我使用这个解决方案,它允许您选择淡入淡出时间及其插值函数(例如 Mathf.Lerp、Mathf.SmoothStep 等)。

声音.cs

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;

}
Run Code Online (Sandbox Code Playgroud)

AudioFade.cs

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

StartCoroutine(AudioFade.FadeIn(mainThemeSound, 3f, Mathf.SmoothStep));
Run Code Online (Sandbox Code Playgroud)