using UnityEngine; using UnityEditor; namespace Streamingle.Contents.BossRaid.Editor { /// /// 원클릭으로 BossRaid 전체 시스템을 씬에 셋업합니다. /// Streamingle → BossRaid → Setup Scene (One-Click) /// public static class BossRaidSetup { [MenuItem("Streamingle/BossRaid/Setup Scene (One-Click)")] public static void SetupScene() { // === 1. BossData 에셋 확보 === BossData bossData = FindOrCreateBossData(); // === 2. 파티클 프리팹 생성 (없으면) === EnsureParticlePrefabs(); // === 3. 루트 오브젝트 생성 === var root = new GameObject("=== BossRaid System ==="); Undo.RegisterCreatedObjectUndo(root, "BossRaid Setup"); // === 4. 보스 스폰 포인트 === var spawnPoint = new GameObject("BossSpawnPoint"); spawnPoint.transform.SetParent(root.transform); spawnPoint.transform.localPosition = new Vector3(0f, 0f, 3f); // === 5. BossRaidManager (메인) === var manager = root.AddComponent(); // BossData, SpawnPoint 할당 var so = new SerializedObject(manager); so.FindProperty("bossData").objectReferenceValue = bossData; so.FindProperty("bossSpawnPoint").objectReferenceValue = spawnPoint.transform; so.ApplyModifiedProperties(); // === 6. 안전장치 === root.AddComponent(); // === 7. 비주얼 === var visualObj = new GameObject("Visual"); visualObj.transform.SetParent(root.transform); visualObj.AddComponent(); visualObj.AddComponent(); visualObj.AddComponent(); // === 8. UI === var uiObj = new GameObject("UI"); uiObj.transform.SetParent(root.transform); uiObj.AddComponent(); uiObj.AddComponent(); uiObj.AddComponent(); // === 9. 오디오 === var audioObj = new GameObject("Audio"); audioObj.transform.SetParent(root.transform); audioObj.AddComponent(); // === 10. 웹 서버 === var webObj = new GameObject("WebServer"); webObj.transform.SetParent(root.transform); webObj.AddComponent(); // === 11. 파티클 프리팹 연결 === AssignParticlePrefabs(bossData); // === 완료 === Selection.activeGameObject = root; EditorGUIUtility.PingObject(root); Debug.Log("[BossRaid] 원클릭 셋업 완료! Play 모드에서 인스펙터의 Start Raid 버튼을 누르세요."); Debug.Log("[BossRaid] 웹 제어판: http://localhost:64220"); } static BossData FindOrCreateBossData() { // 기존 에셋 검색 string[] guids = AssetDatabase.FindAssets("t:BossData"); if (guids.Length > 0) { string path = AssetDatabase.GUIDToAssetPath(guids[0]); var existing = AssetDatabase.LoadAssetAtPath(path); if (existing != null) { Debug.Log($"[BossRaid] 기존 BossData 사용: {path}"); return existing; } } // 새로 생성 string dataPath = "Assets/Scripts/Contents/BossRaid/Resources"; EnsureFolder(dataPath); var data = ScriptableObject.CreateInstance(); data.bossName = "Test Boss"; data.maxHP = 1000; data.baseDamage = 10; data.damageVariance = 3; data.criticalChance = 0.15f; data.criticalMultiplier = 2f; string assetPath = dataPath + "/TestBossData.asset"; AssetDatabase.CreateAsset(data, assetPath); AssetDatabase.SaveAssets(); Debug.Log($"[BossRaid] BossData 생성: {assetPath}"); return data; } static void EnsureParticlePrefabs() { string particlePath = "Assets/Scripts/Contents/BossRaid/Resources/Particles"; if (AssetDatabase.LoadAssetAtPath(particlePath + "/HitSpark.prefab") != null) return; ParticleCreator.CreateAll(); } static void AssignParticlePrefabs(BossData data) { string basePath = "Assets/Scripts/Contents/BossRaid/Resources/Particles"; var so = new SerializedObject(data); TryAssignPrefab(so, "hitParticlePrefab", basePath + "/HitSpark.prefab"); TryAssignPrefab(so, "criticalParticlePrefab", basePath + "/CriticalHit.prefab"); TryAssignPrefab(so, "deathParticlePrefab", basePath + "/BossExplosion.prefab"); TryAssignPrefab(so, "victoryParticlePrefab", basePath + "/VictoryConfetti.prefab"); TryAssignPrefab(so, "phaseAuraParticlePrefab", basePath + "/PhaseAura.prefab"); so.ApplyModifiedProperties(); EditorUtility.SetDirty(data); AssetDatabase.SaveAssets(); } static void TryAssignPrefab(SerializedObject so, string propertyName, string path) { var prefab = AssetDatabase.LoadAssetAtPath(path); if (prefab != null) { var prop = so.FindProperty(propertyName); if (prop != null) prop.objectReferenceValue = prefab; } } static void EnsureFolder(string path) { if (AssetDatabase.IsValidFolder(path)) return; string parent = System.IO.Path.GetDirectoryName(path).Replace("\\", "/"); string folder = System.IO.Path.GetFileName(path); if (!AssetDatabase.IsValidFolder(parent)) EnsureFolder(parent); AssetDatabase.CreateFolder(parent, folder); } } }