채팅 추가

This commit is contained in:
2026-09-01 14:40:02 +09:00
parent cab0d772b1
commit a5a1f1d9e9
50 changed files with 3843 additions and 1124 deletions

View File

@@ -0,0 +1,59 @@
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
/// <summary>
/// 채팅창을 씬에 넣는다.
///
/// UI 계층 자체는 런타임에 코드로 만들어지므로 씬에는 ChatController 를 얹은
/// 빈 오브젝트 하나만 있으면 된다. 참조는 전부 Awake 에서 씬을 뒤져 채운다.
/// </summary>
public static class ChatSetupMenu
{
const string ObjectName = "ChatSystem";
[MenuItem("Tools/Desktop Overlay/6. Add Chat Window To Scene")]
public static void AddChatSystem()
{
var existing = Object.FindFirstObjectByType<ChatController>();
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>();
// ChatController 가 Awake 에서 직접 붙이지만, 인스펙터에서 타임아웃 같은
// 설정을 만질 수 있도록 미리 얹어둔다. 백엔드는 두 개 다 붙여두고
// 설정 화면에서 고른 쪽만 실제로 쓴다.
go.AddComponent<AnthropicChatBackend>();
go.AddComponent<GeminiChatBackend>();
go.AddComponent<ChatWindowUI>();
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/7. 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}");
}
}