Files
Fishing2/Assets/Scripts/Editor/AnimatorParametersGenerator.cs
2025-05-10 12:49:47 +08:00

107 lines
4.2 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 UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
public class AnimatorParametersGenerator : Editor
{
[MenuItem("Tools/Generate Animator Parameters with Properties")]
public static void GenerateAnimatorParametersWithProperties()
{
// 获取选中的Animator Controller
var controller = Selection.activeObject as AnimatorController;
if (controller == null)
{
Debug.LogError("请选择一个Animator Controller文件");
return;
}
// 用于存储生成的代码
string className = controller.name + "Parameters";
string code = $"// Auto-generated class for {controller.name} parameters\n";
code += "using UnityEngine;\n\n";
code += "public class " + className + "\n{\n";
code += " private Animator _animator;\n\n";
code += $" public {className}(Animator animator)\n";
code += " {\n";
code += " _animator = animator;\n";
code += " }\n\n";
foreach (var parameter in controller.parameters)
{
string paramName = parameter.name;
string sanitizedName = SanitizeName(paramName); // 变量名合法化
string typeName = GetTypeName(parameter.type); // 获取类型名称
switch (parameter.type)
{
case AnimatorControllerParameterType.Bool:
code += $" public bool {sanitizedName}\n";
code += " {\n";
code += $" get => _animator.GetBool(\"{paramName}\");\n";
code += $" set => _animator.SetBool(\"{paramName}\", value);\n";
code += " }\n\n";
break;
case AnimatorControllerParameterType.Int:
code += $" public int {sanitizedName}\n";
code += " {\n";
code += $" get => _animator.GetInteger(\"{paramName}\");\n";
code += $" set => _animator.SetInteger(\"{paramName}\", value);\n";
code += " }\n\n";
break;
case AnimatorControllerParameterType.Float:
code += $" public float {sanitizedName}\n";
code += " {\n";
code += $" get => _animator.GetFloat(\"{paramName}\");\n";
code += $" set => _animator.SetFloat(\"{paramName}\", value);\n";
code += " }\n\n";
break;
case AnimatorControllerParameterType.Trigger:
code += $" public void Set{sanitizedName}Trigger()\n";
code += " {\n";
code += $" _animator.SetTrigger(\"{paramName}\");\n";
code += " }\n\n";
code += $" public void Reset{sanitizedName}Trigger()\n";
code += " {\n";
code += $" _animator.ResetTrigger(\"{paramName}\");\n";
code += " }\n\n";
break;
}
}
code += "}\n";
// 输出到控制台
Debug.Log(code);
// 可选:将代码写入到指定文件
string path = EditorUtility.SaveFilePanel("保存参数类", "Assets", className, "cs");
if (!string.IsNullOrEmpty(path))
{
System.IO.File.WriteAllText(path, code);
AssetDatabase.Refresh();
Debug.Log("生成的参数类已保存到:" + path);
}
}
// 对参数名进行安全处理,避免非法字符
private static string SanitizeName(string name)
{
return name.Replace(" ", "_").Replace("-", "_");
}
// 根据Animator参数类型返回对应的C#类型名
private static string GetTypeName(AnimatorControllerParameterType type)
{
return type switch
{
AnimatorControllerParameterType.Bool => "bool",
AnimatorControllerParameterType.Int => "int",
AnimatorControllerParameterType.Float => "float",
AnimatorControllerParameterType.Trigger => "void",
_ => "unknown"
};
}
}