/// --------------------------------------------- /// Senses Pack for Behavior Designer Pro /// Copyright (c) Opsive. All Rights Reserved. /// https://www.opsive.com /// --------------------------------------------- namespace Opsive.BehaviorDesigner.AddOns.SensesPack.Runtime.Emitters { using UnityEngine; /// /// Creates a trace within the TraceManager. Can be used for a single trace or over a trail. /// public class TraceEmitter : MonoBehaviour { [Tooltip("How often to emit the trace (in seconds).")] [SerializeField] protected float m_EmitInterval = 0; [Tooltip("The intensity of the trace.")] [SerializeField] protected float m_Intensity = 1f; [Tooltip("The time in seconds before the trace fully dissipates. Set to 0 for persistant traces.")] [SerializeField] protected float m_DissipationTime = 1f; [Tooltip("The offset from the transform where the trace should be placed.")] [SerializeField] protected Vector3 m_PositionOffset = Vector3.zero; [Tooltip("A reference to the particle effect that should be spawned when the trace is emitted.")] [SerializeField] protected GameObject m_ParticleEffect; private Transform m_Transform; private float m_NextEmissionTime; private GameObject m_Particle; /// /// Initializes the default values. /// private void Awake() { m_Transform = transform; } /// /// The component has been enabled. /// private void OnEnable() { if (m_ParticleEffect != null) { m_Particle = GameObject.Instantiate(m_ParticleEffect, transform.position, transform.rotation, transform); } } /// /// Creates a new trace at the current position. /// private void Start() { if (m_EmitInterval == 0) { Emit(); enabled = false; } } /// /// Emits a scent at the specified interval. /// private void Update() { if (Time.time < m_NextEmissionTime) { return; } TraceManager.Instance.Add(new Trace(transform.position, m_Intensity, m_DissipationTime)); m_NextEmissionTime = Time.time + m_EmitInterval; } /// /// Emits the trace. /// private void Emit() { TraceManager.Instance.Add(new Trace(transform.TransformPoint(m_PositionOffset), m_Intensity, m_DissipationTime)); } /// /// The component has been disabled. /// private void OnDisable() { if (m_Particle != null) { GameObject.Destroy(m_Particle); m_Particle = null; } } } }