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)
在我的项目中,我使用这个解决方案,它允许您选择淡入淡出时间及其插值函数(例如 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)
归档时间: |
|
查看次数: |
7780 次 |
最近记录: |