using UnityEngine; using UnityEditor; namespace Streamingle.Contents.BossRaid.Editor { public static class ParticleCreator { [MenuItem("Streamingle/BossRaid/Create Particle Prefabs")] public static void CreateAll() { string basePath = "Assets/Scripts/Contents/BossRaid/Resources/Particles"; EnsureFolder(basePath); CreateHitSpark(basePath); CreateCriticalHit(basePath); CreateBossExplosion(basePath); CreateVictoryConfetti(basePath); CreatePhaseAura(basePath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log("[ParticleCreator] 5개 파티클 프리팹 생성 완료!"); } 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); } static Material GetParticleMaterial() { var shader = Shader.Find("Particles/Standard Unlit"); if (shader == null) shader = Shader.Find("Universal Render Pipeline/Particles/Unlit"); if (shader == null) shader = Shader.Find("Unlit/Color"); return new Material(shader); } static void CreateHitSpark(string basePath) { var go = new GameObject("HitSpark"); var ps = go.AddComponent(); var main = ps.main; main.duration = 0.3f; main.loop = false; main.startLifetime = new ParticleSystem.MinMaxCurve(0.2f, 0.5f); main.startSpeed = new ParticleSystem.MinMaxCurve(4f, 8f); main.startSize = new ParticleSystem.MinMaxCurve(0.05f, 0.15f); main.startColor = new Color(1f, 0.9f, 0.3f, 1f); main.maxParticles = 30; main.simulationSpace = ParticleSystemSimulationSpace.World; main.gravityModifier = 1.5f; main.playOnAwake = true; var emission = ps.emission; emission.rateOverTime = 0; emission.SetBursts(new[] { new ParticleSystem.Burst(0f, 12, 18) }); var shape = ps.shape; shape.shapeType = ParticleSystemShapeType.Sphere; shape.radius = 0.2f; var sol = ps.sizeOverLifetime; sol.enabled = true; sol.size = new ParticleSystem.MinMaxCurve(1f, AnimationCurve.Linear(0, 1, 1, 0)); var col = ps.colorOverLifetime; col.enabled = true; var grad = new Gradient(); grad.SetKeys( new[] { new GradientColorKey(new Color(1f, 1f, 0.5f), 0f), new GradientColorKey(new Color(1f, 0.5f, 0f), 1f) }, new[] { new GradientAlphaKey(1f, 0f), new GradientAlphaKey(0f, 1f) } ); col.color = grad; var renderer = go.GetComponent(); renderer.renderMode = ParticleSystemRenderMode.Billboard; renderer.material = GetParticleMaterial(); PrefabUtility.SaveAsPrefabAsset(go, basePath + "/HitSpark.prefab"); Object.DestroyImmediate(go); } static void CreateCriticalHit(string basePath) { var go = new GameObject("CriticalHit"); var ps = go.AddComponent(); var main = ps.main; main.duration = 0.5f; main.loop = false; main.startLifetime = new ParticleSystem.MinMaxCurve(0.3f, 0.7f); main.startSpeed = new ParticleSystem.MinMaxCurve(6f, 12f); main.startSize = new ParticleSystem.MinMaxCurve(0.1f, 0.3f); main.startColor = new Color(1f, 0.3f, 0.1f, 1f); main.maxParticles = 50; main.simulationSpace = ParticleSystemSimulationSpace.World; main.gravityModifier = 1f; main.playOnAwake = true; var emission = ps.emission; emission.rateOverTime = 0; emission.SetBursts(new[] { new ParticleSystem.Burst(0f, 25, 35) }); var shape = ps.shape; shape.shapeType = ParticleSystemShapeType.Sphere; shape.radius = 0.4f; var sol = ps.sizeOverLifetime; sol.enabled = true; sol.size = new ParticleSystem.MinMaxCurve(1f, AnimationCurve.Linear(0, 1, 1, 0)); var col = ps.colorOverLifetime; col.enabled = true; var grad = new Gradient(); grad.SetKeys( new[] { new GradientColorKey(Color.white, 0f), new GradientColorKey(new Color(1f, 0.2f, 0f), 0.3f), new GradientColorKey(new Color(0.8f, 0f, 0f), 1f) }, new[] { new GradientAlphaKey(1f, 0f), new GradientAlphaKey(1f, 0.5f), new GradientAlphaKey(0f, 1f) } ); col.color = grad; var renderer = go.GetComponent(); renderer.renderMode = ParticleSystemRenderMode.Billboard; renderer.material = GetParticleMaterial(); PrefabUtility.SaveAsPrefabAsset(go, basePath + "/CriticalHit.prefab"); Object.DestroyImmediate(go); } static void CreateBossExplosion(string basePath) { var go = new GameObject("BossExplosion"); var ps = go.AddComponent(); var main = ps.main; main.duration = 1f; main.loop = false; main.startLifetime = new ParticleSystem.MinMaxCurve(0.5f, 1.5f); main.startSpeed = new ParticleSystem.MinMaxCurve(3f, 10f); main.startSize = new ParticleSystem.MinMaxCurve(0.2f, 0.6f); main.startColor = new Color(1f, 0.5f, 0f, 1f); main.maxParticles = 80; main.simulationSpace = ParticleSystemSimulationSpace.World; main.gravityModifier = 0.5f; main.playOnAwake = true; var emission = ps.emission; emission.rateOverTime = 0; emission.SetBursts(new[] { new ParticleSystem.Burst(0f, 40, 60), new ParticleSystem.Burst(0.1f, 15, 25) }); var shape = ps.shape; shape.shapeType = ParticleSystemShapeType.Sphere; shape.radius = 0.8f; var sol = ps.sizeOverLifetime; sol.enabled = true; sol.size = new ParticleSystem.MinMaxCurve(1f, AnimationCurve.EaseInOut(0, 1, 1, 0)); var col = ps.colorOverLifetime; col.enabled = true; var grad = new Gradient(); grad.SetKeys( new[] { new GradientColorKey(Color.white, 0f), new GradientColorKey(new Color(1f, 0.6f, 0f), 0.2f), new GradientColorKey(new Color(0.3f, 0.3f, 0.3f), 1f) }, new[] { new GradientAlphaKey(1f, 0f), new GradientAlphaKey(0.8f, 0.5f), new GradientAlphaKey(0f, 1f) } ); col.color = grad; var renderer = go.GetComponent(); renderer.renderMode = ParticleSystemRenderMode.Billboard; renderer.material = GetParticleMaterial(); PrefabUtility.SaveAsPrefabAsset(go, basePath + "/BossExplosion.prefab"); Object.DestroyImmediate(go); } static void CreateVictoryConfetti(string basePath) { var go = new GameObject("VictoryConfetti"); var ps = go.AddComponent(); var main = ps.main; main.duration = 3f; main.loop = false; main.startLifetime = new ParticleSystem.MinMaxCurve(2f, 4f); main.startSpeed = new ParticleSystem.MinMaxCurve(5f, 10f); main.startSize = new ParticleSystem.MinMaxCurve(0.1f, 0.25f); main.maxParticles = 200; main.simulationSpace = ParticleSystemSimulationSpace.World; main.gravityModifier = 0.8f; main.playOnAwake = true; main.startRotation = new ParticleSystem.MinMaxCurve(0f, Mathf.PI * 2f); main.startColor = new ParticleSystem.MinMaxGradient(new Color(1f, 0.2f, 0.2f), new Color(0.2f, 0.5f, 1f)); var emission = ps.emission; emission.rateOverTime = 0; emission.SetBursts(new[] { new ParticleSystem.Burst(0f, 60, 80), new ParticleSystem.Burst(0.3f, 40, 60), new ParticleSystem.Burst(0.6f, 30, 50) }); var shape = ps.shape; shape.shapeType = ParticleSystemShapeType.Cone; shape.angle = 40f; shape.radius = 0.5f; var rot = ps.rotationOverLifetime; rot.enabled = true; rot.z = new ParticleSystem.MinMaxCurve(-3f, 3f); var col = ps.colorOverLifetime; col.enabled = true; var grad = new Gradient(); grad.SetKeys( new[] { new GradientColorKey(Color.white, 0f), new GradientColorKey(Color.white, 1f) }, new[] { new GradientAlphaKey(1f, 0f), new GradientAlphaKey(1f, 0.7f), new GradientAlphaKey(0f, 1f) } ); col.color = grad; var renderer = go.GetComponent(); renderer.renderMode = ParticleSystemRenderMode.Billboard; renderer.material = GetParticleMaterial(); PrefabUtility.SaveAsPrefabAsset(go, basePath + "/VictoryConfetti.prefab"); Object.DestroyImmediate(go); } static void CreatePhaseAura(string basePath) { var go = new GameObject("PhaseAura"); var ps = go.AddComponent(); var main = ps.main; main.duration = 2f; main.loop = true; main.startLifetime = new ParticleSystem.MinMaxCurve(1f, 2f); main.startSpeed = new ParticleSystem.MinMaxCurve(1f, 3f); main.startSize = new ParticleSystem.MinMaxCurve(0.2f, 0.5f); main.startColor = new Color(1f, 0.3f, 0f, 0.8f); main.maxParticles = 60; main.simulationSpace = ParticleSystemSimulationSpace.World; main.gravityModifier = -0.5f; main.playOnAwake = false; var emission = ps.emission; emission.rateOverTime = 30; var shape = ps.shape; shape.shapeType = ParticleSystemShapeType.Circle; shape.radius = 1.5f; var sol = ps.sizeOverLifetime; sol.enabled = true; sol.size = new ParticleSystem.MinMaxCurve(1f, AnimationCurve.EaseInOut(0, 0.5f, 1, 1.5f)); var col = ps.colorOverLifetime; col.enabled = true; var grad = new Gradient(); grad.SetKeys( new[] { new GradientColorKey(new Color(1f, 0.5f, 0f), 0f), new GradientColorKey(new Color(1f, 0.1f, 0f), 1f) }, new[] { new GradientAlphaKey(0f, 0f), new GradientAlphaKey(0.8f, 0.3f), new GradientAlphaKey(0f, 1f) } ); col.color = grad; var renderer = go.GetComponent(); renderer.renderMode = ParticleSystemRenderMode.Billboard; renderer.material = GetParticleMaterial(); PrefabUtility.SaveAsPrefabAsset(go, basePath + "/PhaseAura.prefab"); Object.DestroyImmediate(go); } } }