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 _hashToStateName; protected override void InitInternal() { _animator = GetComponent(); base.InitInternal(); _actorType = ActorType.Anima; var controller = ResourceKit.LoadAssetSync($"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; } } }