115 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|