컨트롤러를 잠시 막는 기능을 구현하려고 한다.
핵심 아이디어는 손 트래킹을 담당하는 핵심 컴포넌트인 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;
}
}