using Core.Health; using Core.Utilities; using System.Collections; using System.Collections.Generic; using TowerDefense.Agents; using UnityEngine; public class AgentResetPosEffect : AgentEffect { protected bool bPosReset = false; /// /// 重设到开始位置的特效 /// protected GameObject m_PosResetFx; protected Timer m_DestroyTimer; protected Timer m_PosResetTimer; /// /// 用于备份粒子系统的默认Scale,在设置完Parent之后,会有对自己Scale的设置,从而导致还回内存池之后, /// LocalScale会缩小的情况发生。 /// protected Vector3 m_BackScale; /// /// 初始化当前的位置重设特效 /// /// /// /// public void Initialize( float maxPlaySec,GameObject posResetFx = null,Vector3 position = default(Vector3), float scale = 1.0f) { if ((posResetFx == null) || (m_PosResetFx != null)) return; if( !m_Agent) return; position.y = 0.2f; m_PosResetFx = Poolable.TryGetPoolable(posResetFx); m_BackScale = m_PosResetFx.transform.localScale; m_PosResetFx.transform.SetParent(transform, true); m_PosResetFx.transform.localPosition = position; m_PosResetFx.transform.localScale *= scale; var particle = m_PosResetFx.GetComponent(); if( particle) { particle.Simulate(0.0f); particle.Play(); } m_Agent.removed += OnRemoved; m_DestroyTimer = new Timer(maxPlaySec, RemoveEffect); m_PosResetTimer = new Timer(maxPlaySec / 5.0f, resetInitPosition); m_Agent.navMeshNavMeshAgent.speed = 0.0f; } public void Update() { m_DestroyTimer.Tick(Time.deltaTime); if( !bPosReset ) m_PosResetTimer.Tick(Time.deltaTime); } protected void RemoveEffect() { m_Agent.removed -= OnRemoved; ResetAgent(); } /// /// 重设当前的Agent到开始位置. /// protected void resetInitPosition() { m_Agent.navMeshNavMeshAgent.speed = m_Agent.originalMovementSpeed; m_Agent.ResetAgentToInitialPos(); bPosReset = true; } void OnRemoved(DamageableBehaviour targetable) { m_Agent.removed -= OnRemoved; ResetAgent(); } void ResetAgent() { m_Agent.navMeshNavMeshAgent.speed = m_Agent.originalMovementSpeed; if (m_PosResetFx != null) { var particle = m_PosResetFx.GetComponent(); if (particle) particle.Stop(); Poolable.TryPool(m_PosResetFx); m_PosResetFx.transform.localScale = m_BackScale; m_PosResetFx = null; } Destroy(this); } }