Files
aibis-dream/Assets/Scripts/SceneManagement/ActorKit/ActorAnimaEx.cs
T
2026-01-05 20:49:01 +08:00

119 lines
3.8 KiB
C#

using AibisDream.Framework;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AibisDream
{
public class ActorAnimaEx : AbsActor
{
private Animator _animator;
private string _currentStateName;
private Dictionary<string, BlendTreeInfo> _blendTreeDict;
protected override void Init()
{
_animator = GetComponent<Animator>();
// 设置基本信息
base.Init();
actorData.actorType = ActorType.AnimaEx;
var controller = ResourceKit.LoadAssetSync<RuntimeAnimatorController>($"Animation/{ActorName}");
_animator.runtimeAnimatorController = controller;
_blendTreeDict = ParseBlendTreeInfos();
// 保存事件
actorData.onSave.AddListener(() =>
{
actorData.stateName = _currentStateName;
actorData.faceParam = _animator.GetFloat("Face Param");
});
// 加载初始状态
if (!string.IsNullOrWhiteSpace(actorData.stateName))
{
ChangeState(actorData.stateName);
}
if (actorData.faceParam >= 0)
{
_animator.SetFloat("Face Param", actorData.faceParam);
}
}
private Dictionary<string, BlendTreeInfo> ParseBlendTreeInfos()
{
var dict = new Dictionary<string, BlendTreeInfo>();
// 解析混合树
var configText = ResourceKit.LoadAssetSync<TextAsset>($"AnimationConfig/{ActorName}");
if (configText != null)
{
var blendTreeInfos = AnimatorKit.ParseBlendTreeFromJson(configText.text);
foreach (var info in blendTreeInfos)
{
dict[info.name] = info;
}
}
return dict;
}
/// <summary>
/// 切换站姿
/// </summary>
/// <param name="stateName"></param>
public override void ChangeState(string stateName)
{
// 记录当前状态
_currentStateName = stateName;
// 切换站姿
_animator.SetTrigger(stateName);
}
public override IEnumerator ChangeStateAsync(string stateName)
{
ChangeState(stateName);
// 等待动作切换完成
while (!_animator.GetCurrentAnimatorStateInfo(0).IsName(stateName))
{
yield return null;
}
var info = _animator.GetCurrentAnimatorStateInfo(0);
yield return new WaitForSeconds(info.length);
}
public override void SetTalkingState(bool isTalking)
{
_animator.SetBool("Is Talking", isTalking);
}
public override void SetFaceState(string faceName)
{
// 先读取当前混合树信息
if (_blendTreeDict.TryGetValue(_currentStateName, out var blendTreeInfo))
{
if (blendTreeInfo.type == "1D")
{
var clipInfo = blendTreeInfo.GetClipInfo(faceName);
if (clipInfo != null)
{
_animator.SetFloat(blendTreeInfo.blendParameter, clipInfo.threshold);
}
}
else
{
var clipInfo = blendTreeInfo.GetClipInfo(faceName);
if (clipInfo != null)
{
_animator.SetFloat(blendTreeInfo.blendParameter, clipInfo.position.x);
// 不设置Y轴参数
}
}
}
else
{
Debug.LogWarning($"当前状态{_currentStateName}的混合树信息不存在");
}
}
}
}