using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; /// /// 채팅창을 씬에 넣는다. /// /// UI 계층 자체는 런타임에 코드로 만들어지므로 씬에는 ChatController 를 얹은 /// 빈 오브젝트 하나만 있으면 된다. 참조는 전부 Awake 에서 씬을 뒤져 채운다. /// public static class ChatSetupMenu { const string ObjectName = "ChatSystem"; [MenuItem("Tools/Desktop Overlay/8. Add Chat Window To Scene")] public static void AddChatSystem() { var existing = Object.FindFirstObjectByType(); if (existing != null) { Selection.activeGameObject = existing.gameObject; EditorGUIUtility.PingObject(existing.gameObject); Debug.Log($"[ChatSetupMenu] 이미 있습니다: {existing.gameObject.name}"); return; } var go = new GameObject(ObjectName); Undo.RegisterCreatedObjectUndo(go, "Add Chat System"); go.AddComponent(); // ChatController 가 Awake 에서 직접 붙이지만, 인스펙터에서 타임아웃 같은 // 설정을 만질 수 있도록 미리 얹어둔다. 백엔드는 두 개 다 붙여두고 // 설정 화면에서 고른 쪽만 실제로 쓴다. go.AddComponent(); go.AddComponent(); go.AddComponent(); Selection.activeGameObject = go; EditorSceneManager.MarkSceneDirty(go.scene); Debug.Log( "[ChatSetupMenu] ChatSystem 을 추가했습니다. 씬을 저장(Ctrl+S)하세요.\n" + "API 키는 실행 후 캐릭터를 클릭 → 채팅창 머리말의 '설정' 에서 입력합니다.\n" + $"(파일로 직접 넣으려면 {ChatConfig.ConfigPath}, 또는 환경 변수 ANTHROPIC_API_KEY)"); } [MenuItem("Tools/Desktop Overlay/9. Open Chat Config Folder")] public static void OpenConfigFolder() { string dir = ChatConfig.ConfigDirectory; System.IO.Directory.CreateDirectory(dir); // 파일이 없으면 템플릿을 만들어 준다. 사용자가 열어서 apiKey 만 채우면 된다. ChatConfig.Load(); EditorUtility.RevealInFinder(ChatConfig.ConfigPath); Debug.Log($"[ChatSetupMenu] 설정 파일: {ChatConfig.ConfigPath}"); } }