using System; using System.Collections; using System.Linq; using System.Collections.Generic; using UnityEngine; using Sirenix.OdinInspector; using KairoEngine.Core; using KairoEngine.Core.GameActions; namespace KairoEngine.SFX.GameActions { [System.Serializable, HideReferenceObjectPicker] public class PlaySFXClipGameAction : GameActionBase { public override string name { get { return $"Play {(sfxClip != null ? sfxClip.name : "SFX Clip")}"; } } public override GameActionsController controller { get => _controller; set { _controller = value; typeName = "PlaySFXClipGameAction"; GetCompatibleVariablenames(); } } public override string GetTypeName() => "PlaySFXClipGameAction"; public override string GetActionName() => "Play SFX Clip"; [FoldoutGroup("@name"), NonSerialized, ShowInInspector, HideIf("@!string.IsNullOrEmpty(librarySfxClipName)")] public SFXClip sfxClip; [FoldoutGroup("@name"), HideIf("@sfxClip != null")] public string librarySfxClipName = ""; [FoldoutGroup("@name"), ValueDropdown("possibleVariables", IsUniqueList = false)] public string parent; private IEnumerable possibleVariables = new ValueDropdownList(); public PlaySFXClipGameAction(GameActionsController controller) : base(controller) { this.controller = controller; className = this.GetType().AssemblyQualifiedName; } public override void Initialize(GameActionObjectSerializer objectSerializer) { var obj = objectSerializer.DeserializeScriptableObject($"{sfxClipName}-sfxClip"); if(obj != null && sfxClip == null) sfxClip = (SFXClip)obj; } public override void Start() { Debug.Log("Playing sound"); GameObject parentObj = GetVariable(parent, null); Transform parentTransform = null; if(parentObj != null) parentTransform = parentObj.transform; Vector3 pos = new Vector3(); if(parentObj != null) pos = parentObj.transform.position; if(sfxClip != null) SoundController.EmmitSound(sfxClip, pos, parentTransform); else if(!string.IsNullOrEmpty(librarySfxClipName)) SoundController.EmmitSound(librarySfxClipName, pos, parentTransform); _done = true; _started = true; } public override void Update() { } public override void Restart() { _done = false; _started = false; } public static PlaySFXClipGameAction JSONToPlaySFXClipGameAction(string data) { return JsonUtility.FromJson(data); } private PlaySFXClipGameAction Duplicate(GameActionsController controller) { PlaySFXClipGameAction action = new PlaySFXClipGameAction(controller == null ? this.controller : controller); action.controller = controller; return action; } private T GetVariable(string title, T defaultValue) { for (int i = 0; i < controller.context.variables.Count; i++) { if(controller.context.variables[i].name == title) { return controller.context.variables[i].GetValue(defaultValue); } } return defaultValue; } [HideInInspector] public string sfxClipName; public override void OnBeforeSerialize(GameActionObjectSerializer serializer, int n, int depth) { if(sfxClip != null) { sfxClipName = sfxClip.name; serializer.SerializeScriptableObject($"{sfxClipName}-sfxClip", sfxClip); } } public override void OnBeforeDeserialize(GameActionObjectSerializer serializer, int n, int depth) { sfxClip = (SFXClip)serializer.DeserializeScriptableObject($"{depth}-{n}-Prefab"); } private void GetCompatibleVariablenames() { if(_controller == null) return; if(_controller.context == null) return; possibleVariables = _controller.context.variables //.Where(x => x.data is GameActionContextString) .Select(x => new ValueDropdownItem(x.name, x.name)); } } }