using UnityEngine;
using System;
///
/// OptiTrack 모션캡처 클라이언트 관리
///
[Serializable]
public class OptiTrackManager
{
[Tooltip("OptiTrack 클라이언트")]
public OptitrackStreamingClient optitrackClient;
[Tooltip("OptiTrack 클라이언트가 없을 때 자동으로 프리펩에서 생성할지 여부")]
public bool autoSpawnOptitrackClient = true;
[Tooltip("OptiTrack 클라이언트 프리펩 경로 (Resources 폴더 기준이 아닌 경우 직접 할당 필요)")]
public GameObject optitrackClientPrefab;
[Tooltip("모션 녹화 시 OptiTrack Motive도 함께 녹화할지 여부")]
public bool recordOptiTrackWithMotion = true;
private Action log;
private Action logError;
public void Initialize(Action log, Action logError)
{
this.log = log;
this.logError = logError;
InitializeOptitrackClient();
}
private void InitializeOptitrackClient()
{
if (optitrackClient != null)
{
log?.Invoke("OptiTrack 클라이언트가 이미 할당되어 있습니다.");
return;
}
optitrackClient = UnityEngine.Object.FindObjectOfType();
if (optitrackClient != null)
{
log?.Invoke("씬에서 OptiTrack 클라이언트를 찾았습니다.");
return;
}
if (autoSpawnOptitrackClient)
{
SpawnOptitrackClientFromPrefab();
}
else
{
log?.Invoke("OptiTrack 클라이언트가 없습니다. 자동 생성 옵션이 꺼져 있습니다.");
}
}
public void SpawnOptitrackClientFromPrefab()
{
var existingClient = UnityEngine.Object.FindObjectOfType();
if (existingClient != null)
{
optitrackClient = existingClient;
log?.Invoke("씬에 이미 OptiTrack 클라이언트가 있습니다.");
return;
}
GameObject clientInstance = null;
if (optitrackClientPrefab != null)
{
clientInstance = UnityEngine.Object.Instantiate(optitrackClientPrefab);
clientInstance.name = "Client - OptiTrack";
log?.Invoke("할당된 프리펩에서 OptiTrack 클라이언트 생성됨");
}
else
{
#if UNITY_EDITOR
string prefabPath = "Assets/External/OptiTrack Unity Plugin/OptiTrack/Prefabs/Client - OptiTrack.prefab";
var prefab = UnityEditor.AssetDatabase.LoadAssetAtPath(prefabPath);
if (prefab != null)
{
clientInstance = UnityEngine.Object.Instantiate(prefab);
clientInstance.name = "Client - OptiTrack";
log?.Invoke($"프리펩에서 OptiTrack 클라이언트 생성됨: {prefabPath}");
}
else
{
logError?.Invoke($"OptiTrack 클라이언트 프리펩을 찾을 수 없습니다: {prefabPath}");
return;
}
#else
logError?.Invoke("OptiTrack 클라이언트 프리펩이 할당되지 않았습니다. Inspector에서 프리펩을 할당해주세요.");
return;
#endif
}
if (clientInstance != null)
{
optitrackClient = clientInstance.GetComponent();
if (optitrackClient == null)
{
logError?.Invoke("생성된 프리펩에 OptitrackStreamingClient 컴포넌트가 없습니다!");
UnityEngine.Object.Destroy(clientInstance);
}
}
}
public void ToggleOptitrackMarkers()
{
if (optitrackClient == null)
{
logError?.Invoke("OptitrackStreamingClient를 찾을 수 없습니다!");
return;
}
optitrackClient.ToggleDrawMarkers();
log?.Invoke($"OptiTrack 마커 표시: {optitrackClient.DrawMarkers}");
}
public void ShowOptitrackMarkers()
{
if (optitrackClient == null)
{
logError?.Invoke("OptitrackStreamingClient를 찾을 수 없습니다!");
return;
}
if (!optitrackClient.DrawMarkers)
{
optitrackClient.ToggleDrawMarkers();
}
log?.Invoke("OptiTrack 마커 표시 켜짐");
}
public void HideOptitrackMarkers()
{
if (optitrackClient == null)
{
logError?.Invoke("OptitrackStreamingClient를 찾을 수 없습니다!");
return;
}
if (optitrackClient.DrawMarkers)
{
optitrackClient.ToggleDrawMarkers();
}
log?.Invoke("OptiTrack 마커 표시 꺼짐");
}
public void ReconnectOptitrack()
{
if (optitrackClient == null)
{
logError?.Invoke("OptitrackStreamingClient를 찾을 수 없습니다!");
return;
}
log?.Invoke("OptiTrack 재접속 시도...");
optitrackClient.Reconnect();
log?.Invoke("OptiTrack 재접속 명령 전송 완료");
}
public bool IsOptitrackConnected()
{
if (optitrackClient == null)
{
return false;
}
return optitrackClient.IsConnected();
}
public string GetOptitrackConnectionStatus()
{
if (optitrackClient == null)
{
return "OptiTrack 클라이언트 없음";
}
return optitrackClient.GetConnectionStatus();
}
}