using UnityEngine; using System; using System.Collections.Generic; using KindRetargeting; /// /// 아바타 Head 본 콜라이더 자동 생성 및 타겟 관리 /// [Serializable] public class AvatarHeadManager { [Tooltip("아바타 Head 본에 자동으로 SphereCollider를 생성합니다 (DOF 타겟, 레이캐스트 등에 활용)")] public bool autoCreateHeadColliders = true; [Tooltip("Head 콜라이더 반경")] public float headColliderRadius = 0.1f; [NonSerialized] private List avatarHeadTargets = new List(); private Action log; private Action logError; public void Initialize(Action log, Action logError) { this.log = log; this.logError = logError; if (autoCreateHeadColliders) { RefreshAvatarHeadColliders(); } } public void RefreshAvatarHeadColliders() { avatarHeadTargets.Clear(); var retargetingScripts = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None); log?.Invoke($"아바타 Head 콜라이더 검색: CustomRetargetingScript {retargetingScripts.Length}개 발견"); foreach (var script in retargetingScripts) { if (script.targetAnimator == null) continue; Transform headBone = script.targetAnimator.GetBoneTransform(HumanBodyBones.Head); if (headBone == null) continue; if (!headBone.TryGetComponent(out _)) { var collider = headBone.gameObject.AddComponent(); collider.radius = headColliderRadius; collider.isTrigger = true; log?.Invoke($"Head 콜라이더 생성: {headBone.name} ({script.targetAnimator.gameObject.name})"); } avatarHeadTargets.Add(headBone); } log?.Invoke($"총 {avatarHeadTargets.Count}개의 아바타 Head 타겟 등록 완료"); } public List GetAvatarHeadTargets() { return avatarHeadTargets; } }