using System; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using SLSUtilities.FunctionalAnimation; using UnityEditor; using UnityEngine; namespace Cielonos.MainGame.FunctionalAnimation { public partial class InvokePreloadFunction : FuncAnimPayloadBase { private bool HasCollection => parentData != null && parentData.parentCollection != null; [InfoBox("此 Data 未连接到 FuncAnimDataCollection,无法获取函数列表。\n请在 FuncAnimData 的顶部进行连接。", InfoMessageType.Error, "@!this.HasCollection")] [PropertyOrder(-1)] [EnableIf("HasCollection")] // 只有连接了才能选 [OnInspectorInit("RefreshParameterReference")] // 初始化时刷新参数引用 [ValueDropdown("GetFunctionKeys")] [OnValueChanged("OnFunctionKeyChanged")] public string functionKey; [HideLabel] // 隐藏字段名,让参数看起来像直接嵌入的 [SerializeReference] [HideReferenceObjectPicker] // 隐藏类型选择器,强制由 Key 决定 [InfoBox("请先选择一个函数。", InfoMessageType.Warning, "@this.parameters == null && !string.IsNullOrEmpty(this.functionKey)")] public CustomFunction.ParameterCollectionBase parameters; public override void Invoke() { if (runtimeFuncAnim == null) return; runtimeFuncAnim.currentActionParams = this.parameters; if (!string.IsNullOrEmpty(functionKey) && character.animationSc.registeredFunctions.TryGetValue(functionKey, out var func)) { func.Invoke(runtimeFuncAnim); } else { Debug.LogWarning($"[InvokePreRegisteredFunction] 试图调用 '{functionKey}',但该函数未在 AnimationSc 中注册。"); } } } public partial class InvokePreloadFunction { private void RefreshParameterReference() { if (parentData == null || parameters == null || string.IsNullOrEmpty(functionKey)) return; if (!HasCollection) return; List functions = parentData.parentCollection.preloadFunctions; CustomFunction selectedFunc = functions.Find(func => func.functionName == functionKey); if (selectedFunc != null) { parameters.function = selectedFunc; } } private IEnumerable GetFunctionKeys() { if (!HasCollection) return null; List functions = parentData.parentCollection.preloadFunctions; if (functions == null || functions.Count == 0) return null; return functions.ConvertAll(func => func.functionName); } private void OnFunctionKeyChanged() { if (!HasCollection) return; CustomFunction selectedFunc = parentData.parentCollection.preloadFunctions.Find(func => func.functionName == functionKey); if (selectedFunc != null) { parameters = Activator.CreateInstance(selectedFunc.paramCollectionType) as CustomFunction.ParameterCollectionBase; if (parameters != null) { parameters.function = selectedFunc; } } else { parameters = null; } } } }