using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using KairoEngine.Core; using KairoEngine.Core.ModuleSystem; using Sirenix.OdinInspector; namespace KairoEngine.SFX { [Serializable, HideReferenceObjectPicker] public class SFXModule : GameModuleBase { public override string name => "SFX Module"; [Tooltip("Use a custom sound emitter prefab or load the default prefab")] [HorizontalGroup("@name/emitter", 0.015f), LabelText("Custom Sound Emitter")] public bool useCustomSoundEmitter; [HorizontalGroup("@name/emitter", 0.985f), HideLabel, ShowIf("@useCustomSoundEmitter")] public GameObject soundEmitterPrefab; [FoldoutGroup("@name"), Tooltip("Optional sound library asset")] public SFXLibrary soundLibrary; public SFXModule(GameConfig config) : base(config) { this.gameConfig = config; this.className = this.GetType().AssemblyQualifiedName; this.typeName = "SFXModule"; } public override void Load(Transform parent) { if(!useCustomSoundEmitter) soundEmitterPrefab = Resources.Load("SoundEmmiterPrefab") as GameObject; GameObject soundControllerPrefab = Resources.Load("SoundControllerPrefab") as GameObject; GameObject soundControllerObj = GameObject.Instantiate(soundControllerPrefab, parent); SoundController soundController = soundControllerObj.GetComponent(); if(soundController == null) { Debug.LogError($"SoundControllerPrefab has no SoundController component", soundControllerObj); return; } soundController.soundEmitterPrefab = soundEmitterPrefab; if(soundLibrary != null) soundController.soundLibrary = soundLibrary; soundControllerObj.name = "SoundController"; } public override void Reset() { } public override void Destroy() { } public static SFXModule JSONToSFXModule(string data) { try { return JsonUtility.FromJson(data); } catch (System.Exception e) { Debug.LogError($"Could not deserialize SFXModule: \n{e}"); return new SFXModule(null); } } public override void OnBeforeSerialize(ObjectSerializer serializer) { if(soundEmitterPrefab != null) serializer.AddGameObject("SFXModule_soundEmitterPrefab", soundEmitterPrefab); } public override void OnBeforeDeserialize(ObjectSerializer serializer) { soundEmitterPrefab = serializer.GetGameObject("SFXModule_soundEmitterPrefab"); } } }