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 ""; } }