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