277 lines
11 KiB
C#

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<ParticleSystem>();
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<ParticleSystemRenderer>();
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<ParticleSystem>();
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<ParticleSystemRenderer>();
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<ParticleSystem>();
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<ParticleSystemRenderer>();
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<ParticleSystem>();
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<ParticleSystemRenderer>();
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<ParticleSystem>();
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<ParticleSystemRenderer>();
renderer.renderMode = ParticleSystemRenderMode.Billboard;
renderer.material = GetParticleMaterial();
PrefabUtility.SaveAsPrefabAsset(go, basePath + "/PhaseAura.prefab");
Object.DestroyImmediate(go);
}
}
}