157 lines
6.1 KiB
C#
157 lines
6.1 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
namespace Streamingle.Contents.BossRaid.Editor
|
|
{
|
|
/// <summary>
|
|
/// 원클릭으로 BossRaid 전체 시스템을 씬에 셋업합니다.
|
|
/// Streamingle → BossRaid → Setup Scene (One-Click)
|
|
/// </summary>
|
|
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<BossRaidManager>();
|
|
// BossData, SpawnPoint 할당
|
|
var so = new SerializedObject(manager);
|
|
so.FindProperty("bossData").objectReferenceValue = bossData;
|
|
so.FindProperty("bossSpawnPoint").objectReferenceValue = spawnPoint.transform;
|
|
so.ApplyModifiedProperties();
|
|
|
|
// === 6. 안전장치 ===
|
|
root.AddComponent<BossRaidSafety>();
|
|
|
|
// === 7. 비주얼 ===
|
|
var visualObj = new GameObject("Visual");
|
|
visualObj.transform.SetParent(root.transform);
|
|
visualObj.AddComponent<DamagePopup>();
|
|
visualObj.AddComponent<ScreenEffect>();
|
|
visualObj.AddComponent<PhaseTransition>();
|
|
|
|
// === 8. UI ===
|
|
var uiObj = new GameObject("UI");
|
|
uiObj.transform.SetParent(root.transform);
|
|
uiObj.AddComponent<BossHPBar>();
|
|
uiObj.AddComponent<ComboCounter>();
|
|
uiObj.AddComponent<VictoryScreen>();
|
|
|
|
// === 9. 오디오 ===
|
|
var audioObj = new GameObject("Audio");
|
|
audioObj.transform.SetParent(root.transform);
|
|
audioObj.AddComponent<BossRaidAudio>();
|
|
|
|
// === 10. 웹 서버 ===
|
|
var webObj = new GameObject("WebServer");
|
|
webObj.transform.SetParent(root.transform);
|
|
webObj.AddComponent<BossRaidWebServer>();
|
|
|
|
// === 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<BossData>(path);
|
|
if (existing != null)
|
|
{
|
|
Debug.Log($"[BossRaid] 기존 BossData 사용: {path}");
|
|
return existing;
|
|
}
|
|
}
|
|
|
|
// 새로 생성
|
|
string dataPath = "Assets/Scripts/Contents/BossRaid/Resources";
|
|
EnsureFolder(dataPath);
|
|
|
|
var data = ScriptableObject.CreateInstance<BossData>();
|
|
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<GameObject>(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<GameObject>(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);
|
|
}
|
|
}
|
|
}
|