#if UNITY_EDITOR using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; using Wwise.Wooduan.Config; using Wwise.Wooduan.Core; using Wwise.Wooduan.Editor; namespace Wwise.Wooduan.Tools { public class SoundCaster : EditorWindow { [Serializable] public class RTPCController { public string name = ""; public float value = 0; public float rangeMin = 0; public float rangeMax = 100; } private enum ChannelConfig { Mono = AkSoundEngine.AK_SPEAKER_SETUP_MONO, Stereo = AkSoundEngine.AK_SPEAKER_SETUP_STEREO, Surround = AkSoundEngine.AK_SPEAKER_SETUP_SURROUND, Auro13_1 = AkSoundEngine.AK_SPEAKER_SETUP_AURO_13POINT1_751, Dolby7_1_4 = AkSoundEngine.AK_SPEAKER_SETUP_DOLBY_7_1_4 } internal static SoundCaster Instance; private List _events = new List{"Gun_AK47"}; private List _banks = new List{""}; private List _switches = new List{"P1_P3/P3"}; private List _states = new List{""}; private List _rtpcs = new List{new RTPCController()}; private string _busName, _effectShareSetName; private int _effectSlot; private VoiceLanguage _language = VoiceLanguage.Chinese; private ChannelConfig _channelConfig = ChannelConfig.Stereo; private HRTFMode _hrtfMode; private int _ambisonicChannels = 16; private bool _isLocked; private GameObject _emitter; private void OnEnable() { if (Instance) DestroyImmediate(Instance); Instance = this; } private void OnDestroy() { Instance = null; } internal void PasteFromAudioConsole(AudioConsoleLog message) { switch (message.ObjectType) { case AudioObjectType.Music: case AudioObjectType.Voice: case AudioObjectType.SFX: if (_events.Count > 0) _events[0] = message.ObjectName; else _events.Add(message.ObjectName); break; case AudioObjectType.SoundBank: if (_banks.Count > 0) _banks[0] = message.ObjectName; else _banks.Add(message.ObjectName); break; case AudioObjectType.State: if (_states.Count > 0) _states[0] = message.ObjectName; else _states.Add(message.ObjectName); break; case AudioObjectType.Switch: if (_switches.Count > 0) _switches[0] = message.ObjectName; else _switches.Add(message.ObjectName); break; case AudioObjectType.RTPC: if (_rtpcs.Count > 0) _rtpcs[0].name = message.ObjectName; else _rtpcs.Add(new RTPCController{name = message.ObjectName}); break; case AudioObjectType.Bus: case AudioObjectType.AuxBus: _busName = message.ObjectName; break; } } private void OnGUI() { DrawEmitter(); DrawEvent(); DrawBank(); DrawState(); DrawSwitch(); DrawRTPC(); DrawMixing(); DrawSpatialAudio(); DrawLanguage(); DrawSaveLoad(); } private void DrawEmitter() { EditorGUILayout.LabelField("Emitter", EditorStyles.boldLabel); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { if (_emitter) EditorGUILayout.LabelField("Target GameObject: " + _emitter.name); else EditorGUILayout.LabelField("Please select a GameObject as target"); EditorGUILayout.BeginHorizontal(); if (!_isLocked) { _emitter = Selection.activeGameObject; if (GUILayout.Button("Lock")) _isLocked = true; } else { if (GUILayout.Button("Unlock")) { _isLocked = false; _emitter = Selection.activeGameObject; } } if (GUILayout.Button("Instantiate")) { var mainCameraTransform = Camera.main.transform; var newCube = GameObject.CreatePrimitive(PrimitiveType.Cube); Instantiate(newCube, mainCameraTransform.position + mainCameraTransform.forward * 2, mainCameraTransform.rotation); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.Separator(); } private void DrawEvent() { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Event", EditorStyles.boldLabel); if (GUILayout.Button("+", EditorStyles.miniButtonLeft, GUILayout.Width(20))) _events.Add(""); if (GUILayout.Button("-", EditorStyles.miniButtonRight, GUILayout.Width(20))) _events.RemoveAt(_events.Count - 1); EditorGUILayout.EndHorizontal(); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { for (var i = 0; i < _events.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", GUILayout.Width(50)); _events[i] = EditorGUILayout.TextField(_events[i]); AkWooduanGuiDrawer.DrawPlayStopButton( () => { AudioManager.PlaySound(_events[i], _emitter, AudioTriggerSource.SoundCaster); }, () => { AudioManager.StopEvent(_events[i], _emitter, 0, AudioTriggerSource.SoundCaster); } ); EditorGUILayout.EndHorizontal(); } } EditorGUILayout.Separator(); } private void DrawBank() { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Bank", EditorStyles.boldLabel); if (GUILayout.Button("+", EditorStyles.miniButtonLeft, GUILayout.Width(20))) _banks.Add(""); if (GUILayout.Button("-", EditorStyles.miniButtonRight, GUILayout.Width(20))) _banks.RemoveAt(_banks.Count - 1); EditorGUILayout.EndHorizontal(); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { for (var i = 0; i < _banks.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", GUILayout.Width(50)); _banks[i] = EditorGUILayout.TextField(_banks[i]); AkWooduanGuiDrawer.DrawPlayStopButton( () => { AudioManager.LoadBank(_banks[i], AudioTriggerSource.SoundCaster); }, () => { AudioManager.UnloadBank(_banks[i], true, AudioTriggerSource.SoundCaster); } ); EditorGUILayout.EndHorizontal(); } } EditorGUILayout.Separator(); } private void DrawState() { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("State", EditorStyles.boldLabel); if (GUILayout.Button("+", EditorStyles.miniButtonLeft, GUILayout.Width(20))) _states.Add(""); if (GUILayout.Button("-", EditorStyles.miniButtonRight, GUILayout.Width(20))) _states.RemoveAt(_states.Count - 1); EditorGUILayout.EndHorizontal(); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { for (var i = 0; i < _states.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", GUILayout.Width(50)); _states[i] = EditorGUILayout.TextField(_states[i]); AkWooduanGuiDrawer.DrawPlayStopButton( () => { AudioManager.SetState(_states[i], _emitter, AudioTriggerSource.SoundCaster); } ); EditorGUILayout.EndHorizontal(); } } EditorGUILayout.Separator(); } private void DrawSwitch() { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Switch", EditorStyles.boldLabel); if (GUILayout.Button("+", EditorStyles.miniButtonLeft, GUILayout.Width(20))) _switches.Add(""); if (GUILayout.Button("-", EditorStyles.miniButtonRight, GUILayout.Width(20))) _switches.RemoveAt(_switches.Count - 1); EditorGUILayout.EndHorizontal(); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { for (var i = 0; i < _switches.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", GUILayout.Width(50)); _switches[i] = EditorGUILayout.TextField(_switches[i]); AkWooduanGuiDrawer.DrawPlayStopButton( () => { AudioManager.SetSwitch(_switches[i], _emitter, AudioTriggerSource.SoundCaster); } ); EditorGUILayout.EndHorizontal(); } } EditorGUILayout.Separator(); } private void DrawRTPC() { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("RTPC", EditorStyles.boldLabel); if (GUILayout.Button("+", EditorStyles.miniButtonLeft, GUILayout.Width(20))) _rtpcs.Add(new RTPCController()); if (GUILayout.Button("-", EditorStyles.miniButtonRight, GUILayout.Width(20))) _rtpcs.RemoveAt(_rtpcs.Count - 1); EditorGUILayout.EndHorizontal(); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { for (var i = 0; i < _rtpcs.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Name", GUILayout.Width(50)); _rtpcs[i].name = EditorGUILayout.TextField(_rtpcs[i].name); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Range", GUILayout.Width(50)); _rtpcs[i].rangeMin = EditorGUILayout.FloatField(_rtpcs[i].rangeMin, GUILayout.Width(40)); EditorGUILayout.LabelField("-", GUILayout.Width(10)); _rtpcs[i].rangeMax = EditorGUILayout.FloatField(_rtpcs[i].rangeMax, GUILayout.Width(40)); var currentValue = EditorGUILayout.Slider(_rtpcs[i].value, _rtpcs[i].rangeMin, _rtpcs[i].rangeMax); if (currentValue != _rtpcs[i].value) { _rtpcs[i].value = currentValue; AudioManager.SetRTPCValue(_rtpcs[i].name, currentValue, _emitter, 0f, AudioTriggerSource.SoundCaster); } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.Separator(); } private void DrawMixing() { EditorGUILayout.LabelField("Mixing", EditorStyles.boldLabel); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Bus", GUILayout.Width(50)); _busName = EditorGUILayout.TextField(_busName); EditorGUILayout.LabelField("Effect", GUILayout.Width(40)); _effectShareSetName = EditorGUILayout.TextField(_effectShareSetName); EditorGUILayout.LabelField("Slot", GUILayout.Width(30)); _effectSlot = EditorGUILayout.IntField(_effectSlot, GUILayout.Width(20)); AkWooduanGuiDrawer.DrawPlayStopButton( () => { if (string.IsNullOrEmpty(_effectShareSetName)) AudioManager.ClearBusEffect(_busName, (uint) _effectSlot); else AudioManager.SetBusEffect(_busName, _effectShareSetName, (uint) _effectSlot); } ); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Channel Config", GUILayout.Width(100)); var newChannelConfig = (ChannelConfig)EditorGUILayout.EnumPopup(_channelConfig); if (newChannelConfig != _channelConfig) { AkChannelConfig config = new AkChannelConfig(); config.SetStandard((uint) _channelConfig); Wwise.Wooduan.Core.AudioManager.SetBusConfig(_busName, config); _channelConfig = newChannelConfig; } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Ambisonic Channels"); _ambisonicChannels = EditorGUILayout.IntField(_ambisonicChannels); AkWooduanGuiDrawer.DrawPlayStopButton( () => { AkChannelConfig config = new AkChannelConfig(); config.SetAmbisonic((uint) _ambisonicChannels); Wwise.Wooduan.Core.AudioManager.SetBusConfig(_busName, config); } ); EditorGUILayout.EndHorizontal(); } } private void DrawSpatialAudio() { EditorGUILayout.LabelField("Spatial Audio", EditorStyles.boldLabel); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { var geometryEnabled = EditorGUILayout.Toggle("Geometry", SpatialAudioManager.GeometryEnabled); if (geometryEnabled != SpatialAudioManager.GeometryEnabled) SpatialAudioManager.ToggleGeometry(geometryEnabled); var roomEnabled = EditorGUILayout.Toggle("Room", SpatialAudioManager.RoomEnabled); if (roomEnabled != SpatialAudioManager.RoomEnabled) SpatialAudioManager.ToggleRoom(roomEnabled); var occlusionEnabled = EditorGUILayout.Toggle("Occlusion", SpatialAudioManager.OcclusionEnabled); if (occlusionEnabled != SpatialAudioManager.OcclusionEnabled) SpatialAudioManager.ToggleOcclusion(occlusionEnabled); var obstructionEnabled = EditorGUILayout.Toggle("Obstruction", SpatialAudioManager.ObstructionEnabled); if (obstructionEnabled != SpatialAudioManager.ObstructionEnabled) SpatialAudioManager.ToggleObstruction(obstructionEnabled); var newHrtfMode = (HRTFMode) EditorGUILayout.EnumPopup("HRTF mode", _hrtfMode); if (newHrtfMode != _hrtfMode) { _hrtfMode = newHrtfMode; SpatialAudioManager.SwitchHRTFMode(_hrtfMode); } } } private void DrawLanguage() { EditorGUILayout.LabelField("Language", EditorStyles.boldLabel); using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { var newLanguage = (VoiceLanguage) EditorGUILayout.EnumPopup("Current Language", _language); if (newLanguage != _language) { _language = newLanguage; AudioManager.VoiceLanguage = _language; } } } private void DrawSaveLoad() { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Save")) Save(); if (GUILayout.Button("Load")) Load(); EditorGUILayout.EndHorizontal(); } private void Save() { var filePath = EditorUtility.SaveFilePanel("Select config", AkWwiseEditorSettings.WwiseAssetsPathFull, "SoundCaster.json", "json"); if (string.IsNullOrEmpty(filePath)) return; var obj = new { events = _events.ToArray(), banks = _banks.ToArray(), states = _states.ToArray(), switches = _switches.ToArray(), rtpcs = _rtpcs.ToArray() }; File.WriteAllText(filePath, AkWooduanScriptingTools.ToJson(obj)); } private void Load() { var filePath = EditorUtility.OpenFilePanel("Select config", AkWwiseEditorSettings.WwiseAssetsPathFull, "json"); if (string.IsNullOrEmpty(filePath)) return; var jsonString = File.ReadAllText(filePath); _events = AkWooduanScriptingTools.ParseJsonArray(AkWooduanScriptingTools.FromJson(jsonString, "events")).ToList(); _banks = AkWooduanScriptingTools.ParseJsonArray(AkWooduanScriptingTools.FromJson(jsonString, "banks")).ToList(); _states = AkWooduanScriptingTools.ParseJsonArray(AkWooduanScriptingTools.FromJson(jsonString, "states")).ToList(); _switches = AkWooduanScriptingTools.ParseJsonArray(AkWooduanScriptingTools.FromJson(jsonString, "switches")).ToList(); _rtpcs.Clear(); var rtpcArray = AkWooduanScriptingTools.FromJson(jsonString, "rtpcs"); foreach (var controllerString in AkWooduanScriptingTools.ParseJsonArray(rtpcArray)) { if (!string.IsNullOrEmpty(controllerString)) { var newController = new RTPCController { name = AkWooduanScriptingTools.FromJson(controllerString, "name"), value = AkWooduanScriptingTools.StringToFloat( AkWooduanScriptingTools.FromJson(controllerString, "value")), rangeMin = AkWooduanScriptingTools.StringToFloat( AkWooduanScriptingTools.FromJson(controllerString, "rangeMin")), rangeMax = AkWooduanScriptingTools.StringToFloat( AkWooduanScriptingTools.FromJson(controllerString, "rangeMax")) }; _rtpcs.Add(newController); } } } } } #endif