chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using MCPForUnity.Editor.Helpers;
|
||||
using UnityEngine;
|
||||
|
||||
namespace MCPForUnity.Editor.Tools.Animation
|
||||
{
|
||||
internal static class AnimatorRead
|
||||
{
|
||||
public static object GetInfo(JObject @params)
|
||||
{
|
||||
var go = ObjectResolver.ResolveGameObject(@params["target"], @params["searchMethod"]?.ToString());
|
||||
if (go == null)
|
||||
return new { success = false, message = "Target GameObject not found" };
|
||||
|
||||
var animator = go.GetComponent<Animator>();
|
||||
if (animator == null)
|
||||
return new { success = false, message = $"No Animator component on '{go.name}'" };
|
||||
|
||||
var parameters = new List<object>();
|
||||
for (int i = 0; i < animator.parameterCount; i++)
|
||||
{
|
||||
var p = animator.GetParameter(i);
|
||||
parameters.Add(new
|
||||
{
|
||||
name = p.name,
|
||||
type = p.type.ToString(),
|
||||
defaultFloat = p.defaultFloat,
|
||||
defaultInt = p.defaultInt,
|
||||
defaultBool = p.defaultBool
|
||||
});
|
||||
}
|
||||
|
||||
var layers = new List<object>();
|
||||
for (int i = 0; i < animator.layerCount; i++)
|
||||
{
|
||||
var stateInfo = animator.IsInTransition(i)
|
||||
? animator.GetNextAnimatorStateInfo(i)
|
||||
: animator.GetCurrentAnimatorStateInfo(i);
|
||||
|
||||
layers.Add(new
|
||||
{
|
||||
index = i,
|
||||
name = animator.GetLayerName(i),
|
||||
weight = animator.GetLayerWeight(i),
|
||||
currentStateHash = stateInfo.fullPathHash,
|
||||
currentStateNormalizedTime = stateInfo.normalizedTime,
|
||||
currentStateLength = stateInfo.length,
|
||||
isInTransition = animator.IsInTransition(i)
|
||||
});
|
||||
}
|
||||
|
||||
var clips = new List<object>();
|
||||
if (animator.runtimeAnimatorController != null)
|
||||
{
|
||||
foreach (var clip in animator.runtimeAnimatorController.animationClips)
|
||||
{
|
||||
clips.Add(new
|
||||
{
|
||||
name = clip.name,
|
||||
length = clip.length,
|
||||
frameRate = clip.frameRate,
|
||||
isLooping = clip.isLooping,
|
||||
wrapMode = clip.wrapMode.ToString()
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return new
|
||||
{
|
||||
success = true,
|
||||
data = new
|
||||
{
|
||||
gameObject = go.name,
|
||||
enabled = animator.enabled,
|
||||
speed = animator.speed,
|
||||
hasController = animator.runtimeAnimatorController != null,
|
||||
controllerName = animator.runtimeAnimatorController?.name,
|
||||
applyRootMotion = animator.applyRootMotion,
|
||||
updateMode = animator.updateMode.ToString(),
|
||||
cullingMode = animator.cullingMode.ToString(),
|
||||
parameterCount = animator.parameterCount,
|
||||
layerCount = animator.layerCount,
|
||||
parameters,
|
||||
layers,
|
||||
clips
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static object GetParameter(JObject @params)
|
||||
{
|
||||
var go = ObjectResolver.ResolveGameObject(@params["target"], @params["searchMethod"]?.ToString());
|
||||
if (go == null)
|
||||
return new { success = false, message = "Target GameObject not found" };
|
||||
|
||||
var animator = go.GetComponent<Animator>();
|
||||
if (animator == null)
|
||||
return new { success = false, message = $"No Animator component on '{go.name}'" };
|
||||
|
||||
string paramName = @params["parameterName"]?.ToString();
|
||||
if (string.IsNullOrEmpty(paramName))
|
||||
return new { success = false, message = "'parameterName' is required" };
|
||||
|
||||
AnimatorControllerParameter found = null;
|
||||
for (int i = 0; i < animator.parameterCount; i++)
|
||||
{
|
||||
var p = animator.GetParameter(i);
|
||||
if (p.name == paramName)
|
||||
{
|
||||
found = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found == null)
|
||||
return new { success = false, message = $"Parameter '{paramName}' not found on Animator" };
|
||||
|
||||
object value;
|
||||
switch (found.type)
|
||||
{
|
||||
case AnimatorControllerParameterType.Float:
|
||||
value = animator.GetFloat(paramName);
|
||||
break;
|
||||
case AnimatorControllerParameterType.Int:
|
||||
value = animator.GetInteger(paramName);
|
||||
break;
|
||||
case AnimatorControllerParameterType.Bool:
|
||||
value = animator.GetBool(paramName);
|
||||
break;
|
||||
case AnimatorControllerParameterType.Trigger:
|
||||
value = animator.GetBool(paramName);
|
||||
break;
|
||||
default:
|
||||
value = null;
|
||||
break;
|
||||
}
|
||||
|
||||
return new
|
||||
{
|
||||
success = true,
|
||||
data = new
|
||||
{
|
||||
name = found.name,
|
||||
type = found.type.ToString(),
|
||||
value
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user