using UnityEngine;
using System;
using KindRetargeting;
using KindRetargeting.Remote;
///
/// 리타게팅 WebSocket 서버 관리
/// (HTTP UI는 Streamingle Dashboard에 통합됨)
///
[Serializable]
public class RetargetingRemoteManager
{
[Tooltip("리타게팅 웹 리모컨 컨트롤러 (없으면 자동 생성)")]
public RetargetingRemoteController retargetingRemote;
[Tooltip("리타게팅 WebSocket 포트")]
public int retargetingWsPort = 64212;
[Tooltip("시작 시 리타게팅 자동 시작")]
public bool autoStartRetargetingRemote = true;
private Action log;
private Action logError;
public void Initialize(Action log, Action logError)
{
this.log = log;
this.logError = logError;
InitializeRetargetingRemote();
}
private void InitializeRetargetingRemote()
{
if (retargetingRemote == null)
{
retargetingRemote = UnityEngine.Object.FindObjectOfType();
}
if (retargetingRemote == null && autoStartRetargetingRemote)
{
GameObject remoteObj = new GameObject("RetargetingRemoteController");
retargetingRemote = remoteObj.AddComponent();
retargetingRemote.AutoStart = false;
log?.Invoke("리타게팅 컨트롤러 자동 생성됨");
}
if (retargetingRemote != null)
{
retargetingRemote.WsPort = retargetingWsPort;
}
if (retargetingRemote != null)
{
AutoRegisterRetargetingCharacters();
if (autoStartRetargetingRemote && !retargetingRemote.IsRunning)
{
retargetingRemote.StartServer();
log?.Invoke($"리타게팅 WebSocket 시작됨 - WS: {retargetingWsPort}");
}
}
}
public void AutoRegisterRetargetingCharacters()
{
if (retargetingRemote == null)
{
logError?.Invoke("리타게팅 컨트롤러가 없습니다!");
return;
}
var characters = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None);
foreach (var character in characters)
{
retargetingRemote.RegisterCharacter(character);
}
log?.Invoke($"리타게팅 캐릭터 {characters.Length}개 등록됨");
}
public void StartRetargetingRemote()
{
if (retargetingRemote == null)
{
InitializeRetargetingRemote();
}
if (retargetingRemote != null && !retargetingRemote.IsRunning)
{
retargetingRemote.StartServer();
log?.Invoke($"리타게팅 WebSocket 시작됨 - WS: {retargetingWsPort}");
}
}
public void StopRetargetingRemote()
{
if (retargetingRemote != null && retargetingRemote.IsRunning)
{
retargetingRemote.StopServer();
log?.Invoke("리타게팅 WebSocket 중지됨");
}
}
public void ToggleRetargetingRemote()
{
if (retargetingRemote == null || !retargetingRemote.IsRunning)
{
StartRetargetingRemote();
}
else
{
StopRetargetingRemote();
}
}
public void IsRetargetingRemoteRunning(out bool running)
{
running = retargetingRemote != null && retargetingRemote.IsRunning;
}
public bool IsRetargetingRemoteRunning()
{
return retargetingRemote != null && retargetingRemote.IsRunning;
}
public string GetRetargetingRemoteUrl()
{
if (retargetingRemote != null && retargetingRemote.IsRunning)
{
return $"ws://localhost:{retargetingWsPort}";
}
return "";
}
}