using System.Collections.Generic; using Entitas; using GAS.Runtime; using UnityEngine; namespace CoreGame.Render { // 只对LocalPlayer起效 public class MovementSys : IExecuteSystem, ICleanupSystem { private readonly IGroup m_MoveGroup; private readonly List m_CacheEntities = new List(); public MovementSys(CombatContext contexts) { var matcher = (Matcher)Matcher.AllOf(CombatComponentsLookup.Movement, CombatComponentsLookup.NavAgentProxy) .NoneOf(CombatComponentsLookup.Dead, CombatComponentsLookup.ForceNav); m_MoveGroup = contexts.GetGroup(matcher); RealTimeChart.Instance.AddTrack("MovementSysX", Color.green); RealTimeChart.Instance.AddTrack("MovementSysY", Color.red); } public void Execute(float deltaTime) { m_MoveGroup.GetEntities(m_CacheEntities); if (m_CacheEntities.Count == 0) { return; } for (int i = 0; i < m_CacheEntities.Count; i++) { var combatEntity = m_CacheEntities[i]; if (combatEntity.TagCountContainer.HasAnyTags(GTagLib.State_Death, GTagLib.State_Stun, GTagLib.State_ForceMove)) continue; var movementCmpt = combatEntity.movement; var trans = combatEntity.transformProxy; trans.SetRenderSpeed(0); var navAgentProxy = combatEntity.navAgentProxy; if (movementCmpt.joySpeed <= 0.001) { navAgentProxy.StopNav(); continue; } var property = combatEntity.property; var speed = property.MoveSpeed; speed *= movementCmpt.joySpeed; var dir = new Vector2(Mathf.Cos(movementCmpt.direction * Mathf.Deg2Rad), Mathf.Sin(movementCmpt.direction * Mathf.Deg2Rad)); if (combatEntity.TagCountContainer.HasTag(GTagLib.State_Bound)) { dir = Vector2.zero; speed = 0; } trans.SetRenderSpeed(speed.AsFloat); navAgentProxy.SetDestination(trans.position + dir, speed); } } public void Cleanup() { for (int i = 0; i < m_CacheEntities.Count; i++) { m_CacheEntities[i].RemoveMovement(); } } } }