Files
Cielonos/Packages/com.opsive.behaviordesigner/Runtime/Tasks/Actions/Particles/SetVelocity.cs
2026-05-10 11:47:55 -04:00

88 lines
3.4 KiB
C#

#if GRAPH_DESIGNER
/// ---------------------------------------------
/// Behavior Designer
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.BehaviorDesigner.Runtime.Tasks.Actions.ParticlesTasks
{
using Opsive.GraphDesigner.Runtime.Variables;
using UnityEngine;
[Opsive.Shared.Utility.Category("Particles")]
[Opsive.Shared.Utility.Description("Sets particle velocity with mode selection and variation.")]
public class SetVelocity : TargetGameObjectAction
{
/// <summary>
/// Specifies the velocity mode.
/// </summary>
public enum VelocityMode
{
Linear,
Random
}
[Tooltip("The velocity mode.")]
[SerializeField] protected VelocityMode m_VelocityMode = VelocityMode.Linear;
[Tooltip("The velocity vector.")]
[SerializeField] protected SharedVariable<Vector3> m_Velocity = Vector3.zero;
[Tooltip("The velocity variation (for random mode).")]
[SerializeField] protected SharedVariable<Vector3> m_VelocityVariation = Vector3.zero;
private ParticleSystem m_ResolvedParticleSystem;
private ParticleSystem.VelocityOverLifetimeModule m_VelocityOverLifetime;
/// <summary>
/// Called when the state machine is initialized.
/// </summary>
/// <summary>
/// Initializes the target GameObject.
/// </summary>
protected override void InitializeTarget()
{
base.InitializeTarget();
m_ResolvedParticleSystem = m_ResolvedGameObject.GetComponent<ParticleSystem>();
}
/// <summary>
/// Updates the velocity settings.
/// </summary>
/// <returns>The status of the action.</returns>
public override TaskStatus OnUpdate()
{
if (m_ResolvedParticleSystem == null) {
return TaskStatus.Success;
}
m_VelocityOverLifetime = m_ResolvedParticleSystem.velocityOverLifetime;
m_VelocityOverLifetime.enabled = true;
if (m_VelocityMode == VelocityMode.Linear) {
m_VelocityOverLifetime.space = ParticleSystemSimulationSpace.Local;
m_VelocityOverLifetime.x = m_Velocity.Value.x;
m_VelocityOverLifetime.y = m_Velocity.Value.y;
m_VelocityOverLifetime.z = m_Velocity.Value.z;
} else {
m_VelocityOverLifetime.space = ParticleSystemSimulationSpace.Local;
m_VelocityOverLifetime.x = new ParticleSystem.MinMaxCurve(m_Velocity.Value.x - m_VelocityVariation.Value.x, m_Velocity.Value.x + m_VelocityVariation.Value.x);
m_VelocityOverLifetime.y = new ParticleSystem.MinMaxCurve(m_Velocity.Value.y - m_VelocityVariation.Value.y, m_Velocity.Value.y + m_VelocityVariation.Value.y);
m_VelocityOverLifetime.z = new ParticleSystem.MinMaxCurve(m_Velocity.Value.z - m_VelocityVariation.Value.z, m_Velocity.Value.z + m_VelocityVariation.Value.z);
}
return TaskStatus.Success;
}
/// <summary>
/// Resets the action values back to their default.
/// </summary>
public override void Reset()
{
base.Reset();
m_VelocityMode = VelocityMode.Linear;
m_Velocity = Vector3.zero;
m_VelocityVariation = Vector3.zero;
}
}
}
#endif