Files
Cielonos/Assets/Scripts/MainGame/Base/FunctionalAnimation/Payloads/InvokePreloadFunction.cs
SoulliesOfficial 9a9e48f8a5
2026-06-27 12:52:03 -04:00

149 lines
5.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using SLSUtilities.FunctionalAnimation;
using UnityEditor;
using UnityEngine;
namespace Cielonos.MainGame.FunctionalAnimation
{
[Serializable]
public partial class InvokePreloadFunction : FuncAnimPayloadBase
{
public override bool IsCombatOnly => true;
private bool HasCollection => parentData != null && parentData.parentCollection != null;
public override string NameForInspector => $"Preload Function: {functionKey}";
[InfoBox("此 Data 未连接到 FuncAnimDataCollection无法获取函数列表。\n请在 FuncAnimData 的顶部进行连接。", InfoMessageType.Error, "@!this.HasCollection")]
[PropertyOrder(-1)]
[EnableIf("HasCollection")] // 只有连接了才能选
[OnInspectorInit("RefreshParameterReference")] // 初始化时刷新参数引用
[ValueDropdown("GetFunctionKeys")]
[OnValueChanged("OnFunctionKeyChanged")]
[InlineButton("RefreshParameterInputFields", "R")]
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 || mute) 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<CustomFunction> 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<CustomFunction> 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)
{
Type newParamType = selectedFunc.paramCollectionType;
var newParameters = Activator.CreateInstance(newParamType) as CustomFunction.ParameterCollectionBase;
if (parameters != null && newParameters != null)
{
Type currentParamType = parameters.GetType();
foreach (var field in currentParamType.GetFields())
{
var newField = newParamType.GetField(field.Name);
if (newField != null && newField.FieldType == field.FieldType)
{
newField.SetValue(newParameters, field.GetValue(parameters));
}
}
}
parameters = newParameters;
if (parameters != null)
{
parameters.function = selectedFunc;
}
}
else
{
parameters = null;
}
}
private void RefreshParameterInputFields()
{
if (!HasCollection) return;
CustomFunction selectedFunc = parentData.parentCollection.preloadFunctions.Find(func => func.functionName == functionKey);
if (selectedFunc != null)
{
Type newParamType = selectedFunc.paramCollectionType;
var newParameters = Activator.CreateInstance(newParamType) as CustomFunction.ParameterCollectionBase;
if (parameters != null && newParameters != null)
{
Type currentParamType = parameters.GetType();
foreach (var field in currentParamType.GetFields())
{
var newField = newParamType.GetField(field.Name);
if (newField != null && newField.FieldType == field.FieldType)
{
newField.SetValue(newParameters, field.GetValue(parameters));
}
}
}
parameters = newParameters;
if (parameters != null)
{
parameters.function = selectedFunc;
}
}
else
{
parameters = null;
}
}
}
}