Files
ichni_Official/Assets/Scripts/Game/GameElements/Track/Trackers/ParticleTracker.cs

141 lines
5.2 KiB
C#
Raw Normal View History

2025-07-10 08:42:30 -04:00
using System;
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
using UnityEngine.Serialization;
namespace Ichni.RhythmGame
{
2025-08-22 14:54:40 -04:00
public partial class ParticleTracker : GameElement, IHaveParticles, IHaveColorSubmodule
2025-07-10 08:42:30 -04:00
{
2026-03-14 03:13:10 -04:00
#region [] Essential Configs
2025-07-10 08:42:30 -04:00
public Track track;
public string themeBundleName;
public string materialName;
public bool prewarm;
public float playTime;
public float stopTime;
public bool is3D;
public float width;
public Vector3 extendDirection;
public float density;
public float lifeTime;
public bool isAutoOrient;
public Vector3 particleRotation;
2026-03-14 03:13:10 -04:00
#endregion
#region [] Calculated & Cached States
public ParticleController particleController;
public bool haveBaseColor => true;
public bool haveEmissionColor => true;
#endregion
#region [] Submodules
public ParticleSystem particle { get; set; }
public ColorSubmodule colorSubmodule { get; set; }
#endregion
2025-07-10 08:42:30 -04:00
2026-03-14 03:13:10 -04:00
#region [] Lifecycle & Factory
2025-07-10 08:42:30 -04:00
public static ParticleTracker GenerateElement(string elementName, Guid id, List<string> tags,
bool isFirstGenerated, Track track, string themeBundleName, string materialName,
bool prewarm, float playTime, float stopTime,
bool is3D, float width, Vector3 extendDirection,
float density, float lifeTime,
bool isAutoOrient, Vector3 particleRotation)
{
2026-03-14 03:13:10 -04:00
ParticleTracker particleTracker = Instantiate(GameManager.Instance.basePrefabs.particleTracker, track.transform)
2025-07-10 08:42:30 -04:00
.GetComponent<ParticleTracker>();
2025-08-22 14:54:40 -04:00
particleTracker.particle = particleTracker.GetComponent<ParticleSystem>();
2025-07-10 08:42:30 -04:00
particleTracker.Initialize(elementName, id, tags, isFirstGenerated, track);
particleTracker.track = track;
particleTracker.particleController.spline = track.trackPathSubmodule.path;
particleTracker.playTime = playTime;
particleTracker.stopTime = stopTime;
2025-07-26 04:20:25 -04:00
particleTracker.themeBundleName = themeBundleName;
particleTracker.materialName = materialName;
2025-08-22 14:54:40 -04:00
(particleTracker as IHaveParticles).SetParticleMaterial(themeBundleName, materialName);
2025-07-10 08:42:30 -04:00
particleTracker.SetParticleSettings(prewarm, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation);
return particleTracker;
}
public override void SetDefaultSubmodules()
{
colorSubmodule = new ColorSubmodule(this, Color.white, true, Color.white, 0);
}
2026-03-14 03:13:10 -04:00
#endregion
#region [] Runtime Settings
2025-08-22 14:54:40 -04:00
public void SetParticleSettings(bool prewarm, bool is3D, float width, Vector3 extendDirection,
float density, float lifeTime, bool isAutoOrient, Vector3 particleRotation)
2025-07-10 08:42:30 -04:00
{
this.prewarm = prewarm;
this.is3D = is3D;
this.width = width;
this.extendDirection = extendDirection;
this.density = density;
this.lifeTime = lifeTime;
this.prewarm = prewarm;
this.isAutoOrient = isAutoOrient;
this.particleRotation = particleRotation;
2025-08-22 14:54:40 -04:00
(this as IHaveParticles).SetParticleSettings(prewarm, ParticleSystemSimulationSpace.Local, density,
lifeTime, 0, 1, isAutoOrient, particleRotation);
2025-07-10 08:42:30 -04:00
SetShape();
}
2026-03-14 03:13:10 -04:00
#endregion
2025-07-10 08:42:30 -04:00
}
2026-03-14 03:13:10 -04:00
#region [] Main Update
2025-07-10 08:42:30 -04:00
public partial class ParticleTracker
{
private void Update()
{
2026-03-14 03:13:10 -04:00
float songTime = CoreServices.TimeProvider.SongTime;
2025-07-10 08:42:30 -04:00
if (playTime > songTime || stopTime < songTime)
{
particle.Stop();
}
else
{
if (!particle.isPlaying)
{
particle.Play();
}
}
}
}
2026-03-14 03:13:10 -04:00
#endregion
2025-07-10 08:42:30 -04:00
2026-03-14 03:13:10 -04:00
#region [] Behavior Overrides
2025-07-10 08:42:30 -04:00
public partial class ParticleTracker
{
private void SetShape()
{
particleController.is3D = is3D;
particleController.width = width;
particleController.extendDirection = extendDirection;
particleController.Rebuild();
}
public override void Refresh()
{
base.Refresh();
ParticleSystemRenderer particleSystemRenderer = particle.GetComponent<ParticleSystemRenderer>();
particleSystemRenderer.material.SetColor("_BaseColor", colorSubmodule.currentBaseColor);
if (colorSubmodule.emissionEnabled)
{
2026-04-03 10:53:11 -04:00
particleSystemRenderer.material.SetFloat("_EnableEmission", 1);
2025-07-10 08:42:30 -04:00
particleSystemRenderer.material.SetColor("_EmissionColor", colorSubmodule.GetCurrentEmissionColor());
}
else
{
2026-04-03 10:53:11 -04:00
particleSystemRenderer.material.SetFloat("_EnableEmission", 0);
2025-07-10 08:42:30 -04:00
}
}
}
2026-03-14 03:13:10 -04:00
#endregion
2025-07-10 08:42:30 -04:00
}