60 lines
2.4 KiB
C#
60 lines
2.4 KiB
C#
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}");
|
|
}
|
|
}
|