- 모든 컨트롤러 에디터를 IMGUI → UI Toolkit(UXML/USS)으로 전환 (Camera, Item, Event, Avatar, System, StreamDeck, OptiTrack, Facial) - StreamingleCommon.uss 공통 테마 + 개별 에디터 USS 스타일시트 - SystemController 서브매니저 분리 (OptiTrack, Facial, Recording, Screenshot 등) - 런타임 컨트롤 패널 (ESC 토글, 좌측 오버레이, 150% 스케일) - 웹 대시보드 서버 (StreamingleDashboardServer) + 리타게팅 통합 - 설정 도구(StreamingleControllerSetupTool) UXML 재작성 + 원클릭 설정 - SimplePoseTransfer UXML 에디터 추가 - 전체 UXML 한글화 + NanumGothic 폰트 적용 - Streamingle.Debug → Streamingle.Debugging 네임스페이스 변경 (Debug.Log 충돌 해결) - 불필요 코드 제거 (rawkey.cs, RetargetingHTTPServer, OptitrackSkeletonAnimator 등) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
68 lines
2.1 KiB
C#
68 lines
2.1 KiB
C#
using UnityEngine;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using KindRetargeting;
|
|
|
|
/// <summary>
|
|
/// 아바타 Head 본 콜라이더 자동 생성 및 타겟 관리
|
|
/// </summary>
|
|
[Serializable]
|
|
public class AvatarHeadManager
|
|
{
|
|
[Tooltip("아바타 Head 본에 자동으로 SphereCollider를 생성합니다 (DOF 타겟, 레이캐스트 등에 활용)")]
|
|
public bool autoCreateHeadColliders = true;
|
|
|
|
[Tooltip("Head 콜라이더 반경")]
|
|
public float headColliderRadius = 0.1f;
|
|
|
|
[NonSerialized]
|
|
private List<Transform> avatarHeadTargets = new List<Transform>();
|
|
|
|
private Action<string> log;
|
|
private Action<string> logError;
|
|
|
|
public void Initialize(Action<string> log, Action<string> logError)
|
|
{
|
|
this.log = log;
|
|
this.logError = logError;
|
|
|
|
if (autoCreateHeadColliders)
|
|
{
|
|
RefreshAvatarHeadColliders();
|
|
}
|
|
}
|
|
|
|
public void RefreshAvatarHeadColliders()
|
|
{
|
|
avatarHeadTargets.Clear();
|
|
|
|
var retargetingScripts = UnityEngine.Object.FindObjectsByType<CustomRetargetingScript>(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<SphereCollider>(out _))
|
|
{
|
|
var collider = headBone.gameObject.AddComponent<SphereCollider>();
|
|
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<Transform> GetAvatarHeadTargets()
|
|
{
|
|
return avatarHeadTargets;
|
|
}
|
|
}
|