using UnityEngine; namespace SerializeAnimation.PoseAccessor { public sealed class HumanPoseAccessor : MonoBehaviour { [SerializeField] private Animator animator; private HumanPoseHandler _humanPoseHandler; public bool Initialized => _humanPoseHandler != null && animator != null && animator.isHuman; public Transform Ts { get; private set; } public Animator Animator => animator; private void OnEnable() { if (animator == null) { return; } Init(animator); } private void OnDisable() { _humanPoseHandler?.Dispose(); _humanPoseHandler = null; } public void Init(Animator humanAnimator) { animator = humanAnimator; if (animator == null || !animator.isHuman) { return; } Ts = transform; var animTs = animator.transform; if (animTs.parent != Ts) { var currentParent = animTs.parent; animTs.parent = Ts; Ts.parent = currentParent; } animTs.localPosition = Vector3.zero; animTs.localRotation = Quaternion.identity; animTs.localScale = Vector3.one; _humanPoseHandler = new HumanPoseHandler(animator.avatar, animTs); } public void GetPose(out HumanPose humanPose) { humanPose = default; _humanPoseHandler.GetHumanPose(ref humanPose); } public void SetPose(ref HumanPose humanPose) { _humanPoseHandler.SetHumanPose(ref humanPose); } } }