public override void OnInspectorGUI() { serializedObject.Update(); TrailPreset TrailSettingsScript = target as TrailPreset; EditorGUILayout.PropertyField(m_TrailColor); EditorGUILayout.PropertyField(m_UseOnlyAlpha); EditorGUILayout.PropertyField(m_SpecialMat); GUILayout.Space(15); EditorGUILayout.PropertyField(m_TrailElementDurationCondition); switch (TrailSettingsScript.m_TrailElementDurationCondition) { case TrailElementDurationCondition.Time: EditorGUILayout.PropertyField(m_TrailDuration); break; case TrailElementDurationCondition.ElementCount: EditorGUILayout.PropertyField(m_TrailMaxLength); EditorGUILayout.PropertyField(m_TrailDuration); break; } GUILayout.Space(15); EditorGUILayout.PropertyField(m_TrailElementSpawnCondition); switch (TrailSettingsScript.m_TrailElementSpawnCondition) { case TrailElementSpawnCondition.Time: EditorGUILayout.PropertyField(m_TimeBetweenSpawns); break; case TrailElementSpawnCondition.FrameCount: EditorGUILayout.PropertyField(m_FramesBetweenSpawns); break; case TrailElementSpawnCondition.Distance: EditorGUILayout.PropertyField(m_DistanceBetweenSpawns); EditorGUILayout.PropertyField(m_DistanceCorrection); break; } GUILayout.Space(15); EditorGUILayout.PropertyField(m_UseSizeModifier); if (TrailSettingsScript.m_UseSizeModifier) { EditorGUILayout.PropertyField(m_TrailSizeX); EditorGUILayout.PropertyField(m_TrailSizeY); } GUILayout.Space(15); EditorGUILayout.PropertyField(m_UsePositionModifier); if (TrailSettingsScript.m_UsePositionModifier) { EditorGUILayout.PropertyField(m_TrailPositionX); EditorGUILayout.PropertyField(m_TrailPositionY); } serializedObject.ApplyModifiedProperties(); }
/// <summary> /// Modify the trail effect /// </summary> /// /// <param name="preset">The trail preset you want to set</param> public void SetTrailPreset(TrailPreset preset) { m_PreviousTrailPreset = m_CurrentTrailPreset; m_CurrentTrailPreset = preset; }
void Update() { if (m_PreviousTrailPreset != m_CurrentTrailPreset) { if (m_HideTrailOnDisabled) { HideTrail(false); } m_PreviousTrailPreset = m_CurrentTrailPreset; } if (m_TrailActivationCondition == TrailActivationCondition.VelocityMagnitude || m_TrailDeactivationCondition == TrailDeactivationCondition.VelocityMagnitude) { CalculateCurrentVelocity(); } if (m_EffectEnabled) { if (m_CurrentTrailPreset == null) { return; } if (m_SpriteToDuplicate == null) { return; } switch (m_TrailDeactivationCondition) { case TrailDeactivationCondition.Manual: break; case TrailDeactivationCondition.Time: if (m_TimeTrailStarted + m_TrailActivationDuration <= Time.time) { DisableTrailEffect(); return; } break; case TrailDeactivationCondition.VelocityMagnitude: float _Velocity = 0; if (m_VelocityStopIsLocalSpace) { _Velocity = m_VelocityLocal.magnitude; } else { _Velocity = m_VelocityWorld.magnitude; } if (!m_StopIfOverVelocity && _Velocity >= m_VelocityNeededToStop) { DisableTrailEffect(); } else if (m_StopIfOverVelocity && _Velocity <= m_VelocityNeededToStop) { DisableTrailEffect(); } break; } switch (m_CurrentTrailPreset.m_TrailElementSpawnCondition) { case TrailElementSpawnCondition.Time: if (m_PreviousTimeSpawned + m_CurrentTrailPreset.m_TimeBetweenSpawns <= Time.time) { float _TimeError = Time.time - (m_PreviousTimeSpawned + m_CurrentTrailPreset.m_TimeBetweenSpawns); if (m_CurrentTrailPreset.m_TimeBetweenSpawns > 0) { while (_TimeError >= m_CurrentTrailPreset.m_TimeBetweenSpawns) { _TimeError -= m_CurrentTrailPreset.m_TimeBetweenSpawns; } } if (_TimeError > m_CurrentTrailPreset.m_TimeBetweenSpawns) { _TimeError = 0; } m_PreviousTimeSpawned = Time.time - _TimeError; GenerateNewTrailElement(); } break; case TrailElementSpawnCondition.FrameCount: if (m_PreviousFrameSpawned + m_CurrentTrailPreset.m_FramesBetweenSpawns <= Time.frameCount) { m_PreviousFrameSpawned = Time.frameCount; GenerateNewTrailElement(); } break; case TrailElementSpawnCondition.Distance: if (m_CurrentTrailPreset.m_DistanceCorrection && m_CurrentTrailPreset.m_DistanceBetweenSpawns > 0) { //TODO : if error corrected : generate a timer error ( 3 elements generated at the same frame == 3 elements that update the same) while (Vector2.Distance(m_PreviousPosSpawned, m_SpriteToDuplicate.transform.position) >= m_CurrentTrailPreset.m_DistanceBetweenSpawns) { Vector2 _dir = (Vector2)m_SpriteToDuplicate.transform.position - m_PreviousPosSpawned; Vector2 _tmpPos = m_PreviousPosSpawned + _dir.normalized * m_CurrentTrailPreset.m_DistanceBetweenSpawns; GenerateNewTrailElement(new Vector3(_tmpPos.x, _tmpPos.y, m_SpriteToDuplicate.transform.position.z)); m_PreviousPosSpawned = _tmpPos; } } else if (Vector2.Distance(m_PreviousPosSpawned, m_SpriteToDuplicate.transform.position) >= m_CurrentTrailPreset.m_DistanceBetweenSpawns) { GenerateNewTrailElement(); m_PreviousPosSpawned = m_SpriteToDuplicate.transform.position; } break; } } else if (m_CanBeAutomaticallyActivated) //check activation condition { switch (m_TrailActivationCondition) { case TrailActivationCondition.AlwaysEnabled: EnableTrailEffect(false); break; case TrailActivationCondition.Manual: break; case TrailActivationCondition.VelocityMagnitude: float _Velocity = 0; if (m_VelocityStopIsLocalSpace) { _Velocity = m_VelocityLocal.magnitude; } else { _Velocity = m_VelocityWorld.magnitude; } if (!m_StartIfUnderVelocity && _Velocity >= m_VelocityNeededToStart) { EnableTrailEffect(); } else if (m_StartIfUnderVelocity && _Velocity <= m_VelocityNeededToStart) { EnableTrailEffect(); } break; } } }
public void Initialise(SpriteTrail trail) { m_NeedDequeue = false; m_TrailPos = -1; m_NeedLateUpdate = false; m_TimeSinceCreation = 0; m_MotherTrail = trail; this.m_myGameObject.SetActive(true); m_TrailSettings = trail.m_CurrentTrailPreset; if (SpriteRenderer == null) { SpriteRenderer = GetComponent <SpriteRenderer>(); } if (m_TrailSettings.m_SpecialMat != null) { SpriteRenderer.material = m_TrailSettings.m_SpecialMat; } else { SpriteRenderer.material = trail.m_SpriteToDuplicate.material; } SpriteRenderer.color = trail.m_SpriteToDuplicate.color; SpriteRenderer.sortingLayerID = trail.m_SortingLayerID; SpriteRenderer.sortingOrder = trail.m_OrderInSortingLayer; SpriteRenderer.sprite = trail.m_SpriteToDuplicate.sprite; SpriteRenderer.flipX = trail.m_SpriteToDuplicate.flipX; SpriteRenderer.flipY = trail.m_SpriteToDuplicate.flipY; m_InitSize = m_Transform.localScale; m_InitPos = m_Transform.localPosition; m_Init = true; trail.m_ElementsInTrail.Enqueue(this); ApplyFrameEffect(); if (m_TrailSettings.m_TrailElementDurationCondition == TrailElementDurationCondition.ElementCount) { if (m_TrailSettings.m_TrailMaxLength > 0) { while (trail.m_ElementsInTrail.Count > m_TrailSettings.m_TrailMaxLength) { trail.m_ElementsInTrail.Dequeue().Hide(); } } else { while (trail.m_ElementsInTrail.Count > 0) { trail.m_ElementsInTrail.Dequeue().Hide(); } } int _cnt = 0; foreach (TrailElement _elem in trail.m_ElementsInTrail) { _elem.m_TrailPos = trail.m_ElementsInTrail.Count - _cnt; _elem.m_NeedLateUpdate = true; _cnt++; } } }