Files
aibis-dream/Assets/Scripts/SceneManagement/ActorKit/ActorAnima.cs
T

115 lines
3.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using AibisDream.Framework;
using AibisDream.SaveSystem;
using UnityEngine;
namespace AibisDream
{
public class ActorAnima : AbsActor
{
private const string HashPrefix = "#hash.";
private Animator _animator;
private Dictionary<int, string> _hashToStateName;
protected override void InitInternal()
{
_animator = GetComponent<Animator>();
base.InitInternal();
_actorType = ActorType.Anima;
var controller = ResourceKit.LoadAssetSync<RuntimeAnimatorController>($"Animation/{ActorName}");
_animator.runtimeAnimatorController = controller;
_hashToStateName = AnimatorKit.BuildStateHashToNameMap(controller);
}
public override void ChangeState(string animaName)
{
if (string.IsNullOrEmpty(animaName)) return;
if (animaName.StartsWith(HashPrefix))
{
var hash = int.Parse(animaName[HashPrefix.Length..]);
_animator.Play(hash);
}
else
{
_animator.Play(animaName);
}
}
public override IEnumerator ChangeStateAsync(string animaName)
{
if (string.IsNullOrEmpty(animaName))
{
yield break;
}
if (animaName.StartsWith(HashPrefix))
{
var hash = int.Parse(animaName[HashPrefix.Length..]);
_animator.Play(hash);
yield return null;
yield break;
}
_animator.Play(animaName);
yield return null;
while (!_animator.GetCurrentAnimatorStateInfo(0).IsName(animaName))
{
yield return null;
}
var info = _animator.GetCurrentAnimatorStateInfo(0);
yield return new WaitForSeconds(info.length);
}
public override ActorEntrySnapshotDto CaptureEntry()
{
var entry = new ActorEntrySnapshotDto();
FillBaseEntry(entry);
var info = _animator.GetCurrentAnimatorStateInfo(0);
entry.stateNormalizedTime = info.normalizedTime;
if (_hashToStateName != null
&& _hashToStateName.TryGetValue(info.shortNameHash, out var name))
{
entry.stateName = name;
}
else
{
entry.stateName = HashPrefix + info.shortNameHash;
}
return entry;
}
public override IEnumerator ApplyEntryAsync(ActorEntrySnapshotDto entry)
{
ApplyAlphaFromEntry(entry);
if (string.IsNullOrEmpty(entry.stateName))
{
yield return null;
yield break;
}
if (entry.stateName.StartsWith(HashPrefix))
{
var hash = int.Parse(entry.stateName[HashPrefix.Length..]);
_animator.Play(hash, 0, entry.stateNormalizedTime);
}
else
{
_animator.Play(entry.stateName, 0, entry.stateNormalizedTime);
}
yield return null;
}
}
}