swb_base/particles/ParticleGravity.cs
namespace SWB.Base.Particles;

public enum ParticleGravityDirection
{
	Up,
	Down,
	Left,
	Right
}

[Group( "SWB Particles" )]
public class ParticleGravity : Component
{
	[Property] public float Multiplier { get; set; } = 1f;
	[Property] public ParticleGravityDirection Direction { get; set; }
	ParticleEffect effect { get; set; }
	Vector3 dir { get; set; }

	protected override void OnAwake()
	{
		effect = GetComponent<ParticleEffect>();

		dir = Direction switch
		{
			ParticleGravityDirection.Up => Vector3.Up,
			ParticleGravityDirection.Down => Vector3.Down,
			ParticleGravityDirection.Left => Vector3.Left,
			ParticleGravityDirection.Right => Vector3.Right,
			_ => Vector3.Zero,
		};
	}

	protected override void OnFixedUpdate()
	{
		base.OnFixedUpdate();
		var gravity = dir * 9.81f * Time.Delta * Multiplier;
		var forceDirectionMod = gravity;

		// Convert gravity to local space
		if ( effect.ForceSpace == ParticleEffect.SimulationSpace.Local )
			forceDirectionMod = effect.WorldRotation.Inverse * gravity;

		effect.ForceDirection += forceDirectionMod;
	}
}