277 lines
11 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|