您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
143 行
3.3 KiB
143 行
3.3 KiB
|
|
using UnityEngine;
|
|
using UnityEngine.Serialization;
|
|
|
|
namespace AxelF {
|
|
|
|
[AddComponentMenu("AxelF/AudioEmitter")]
|
|
public class AudioEmitter : MonoBehaviour {
|
|
[FormerlySerializedAs("assets")]
|
|
public Patch[] patches = null;
|
|
uint[] cueHandles;
|
|
|
|
[Range(0, 1)]
|
|
public float volume = 1f;
|
|
public bool autoCue = true;
|
|
public bool singleShot = false;
|
|
bool cuedOnce;
|
|
|
|
public enum Controller {
|
|
None,
|
|
User,
|
|
Zone
|
|
}
|
|
|
|
[HideInInspector]
|
|
public Controller controller;
|
|
|
|
[System.Serializable]
|
|
public struct RandomizationParams {
|
|
[Range(0, 1)]
|
|
public float chance;
|
|
[MinMax(0, 1)]
|
|
public MinMaxFloat distance;
|
|
}
|
|
|
|
[Colorize]
|
|
public RandomizationParams randomization = new RandomizationParams {
|
|
chance = 1f
|
|
};
|
|
|
|
[System.Serializable]
|
|
public struct ModulationParams {
|
|
[MinMax(0, 2)]
|
|
public MinMaxFloat volume;
|
|
[Range(0, 1800)]
|
|
public float period;
|
|
public bool inverted;
|
|
internal CustomModulator custom;
|
|
}
|
|
|
|
public interface CustomModulator {
|
|
float GetCustomModulation();
|
|
}
|
|
|
|
[Colorize]
|
|
public ModulationParams modulation = new ModulationParams {
|
|
volume = new MinMaxFloat {min = 0.95f, max = 1.05f}
|
|
};
|
|
|
|
[System.Serializable]
|
|
public struct AttachmentParams {
|
|
public Transform transform;
|
|
public bool useListenerTransform;
|
|
}
|
|
|
|
[Colorize]
|
|
public AttachmentParams attachment;
|
|
|
|
[System.Serializable]
|
|
public struct AuxiliaryParams {
|
|
public AudioSource source;
|
|
}
|
|
|
|
[Colorize]
|
|
public AuxiliaryParams auxiliary;
|
|
|
|
[System.Serializable]
|
|
public struct GizmoParams {
|
|
public Color color;
|
|
}
|
|
|
|
[Colorize]
|
|
public GizmoParams gizmo = new GizmoParams {
|
|
color = Color.red,
|
|
};
|
|
|
|
internal AudioZone zone;
|
|
internal bool paused;
|
|
|
|
public bool isModulated { get { return modulation.custom != null || modulation.period > 0f; }}
|
|
|
|
public void SetPaused(bool p) { paused = p; }
|
|
public bool IsPaused() { return paused; }
|
|
|
|
protected void Reset() {
|
|
if (controller == Controller.None)
|
|
controller = !zone && !GetComponent<Zone>() ? Controller.User : Controller.Zone;
|
|
enabled = controller != Controller.Zone;
|
|
}
|
|
|
|
protected void Awake() {
|
|
Reset();
|
|
}
|
|
|
|
protected void OnEnable() {
|
|
if (autoCue)
|
|
CueIn();
|
|
}
|
|
|
|
protected void OnDisable() {
|
|
CueOut();
|
|
}
|
|
|
|
public void CueIn() {
|
|
if (!singleShot || !cuedOnce) {
|
|
CueOut();
|
|
if (cueHandles == null || cueHandles.Length != patches.Length)
|
|
cueHandles = new uint[patches.Length];
|
|
for (int i = 0, n = cueHandles.Length; i < n; ++i)
|
|
cueHandles[i] = Sequencer.CueIn(this, i);
|
|
cuedOnce = true;
|
|
}
|
|
}
|
|
|
|
public void CueOut() {
|
|
CueOutWithRelease(0f, EnvelopeMode.None);
|
|
}
|
|
|
|
public void CueOutWithRelease(float release, EnvelopeMode mode) {
|
|
if (cueHandles != null)
|
|
for (int i = 0, n = cueHandles.Length; i < n; ++i) {
|
|
Sequencer.CueOut(cueHandles[i], release, mode);
|
|
cueHandles[i] = 0;
|
|
}
|
|
}
|
|
|
|
public void CueOutInstant() {
|
|
CueOutWithRelease(0f, EnvelopeMode.Exact);
|
|
}
|
|
}
|
|
|
|
} // AxelF
|
|
|