[Unity] VR - 컨트롤러 트래킹 비활성

gest·2026년 5월 18일

unity

목록 보기
9/11

컨트롤러를 잠시 막는 기능을 구현하려고 한다.
핵심 아이디어는 손 트래킹을 담당하는 핵심 컴포넌트인 ActionBasedController와 TrackedPoseDriver를 찾아내어 잠시 enabled = false로 만들고, 원래 켜져 있던 컴포넌트들의 목록만 따로 기억해 두었다가 나중에 다시 켜주는 것이다.

ActionBasedController와 TrackedPoseDriver를 끄면 된다.
ActionBasedController는 컨트롤러 클래스라고 보면 되고,
TrackedPoseDriver는 위치와 회전을 추적해서 매 프레임 transform에 값을 넣는 기능을 한다.

private static List<Behaviour> SuppressHandTrackers(Transform hand)
{
    var list = new List<Behaviour>();
    CollectAndDisable<ActionBasedController>(hand, list);
    CollectAndDisable<TrackedPoseDriver>(hand, list);
    return list;
}

// 부모와 자식을 싹 다 찾아서 비활성화한다. 나중에 복구하기 위해 값들을 가져온다.
private static void CollectAndDisable<T>(Transform hand, List<Behaviour> sink) where T : Behaviour
{
    // 부모 찾기
    foreach (var c in hand.GetComponentsInParent<T>(true))
    {
        if (c.enabled) { c.enabled = false; sink.Add(c); }
    }
    
    // 자식 찾기
    foreach (var c in hand.GetComponentsInChildren<T>(true))
    {
        if (c.enabled) { c.enabled = false; sink.Add(c); }
    }
}

// 복구
private static void RestoreTrackers(List<Behaviour> suppressed)
{
    for (int i = 0; i < suppressed.Count; i++)
    {
        if (suppressed[i] != null) suppressed[i].enabled = true;
    }
}

0개의 댓글