using CoreGame; using Entitas; using UnityEngine; namespace CoreGame.Render { public class LocationSyncSystem : IExecuteSystem { private readonly Contexts m_Contexts; private readonly Matcher m_PosMatcher; private static readonly object s_EntityNoMove = new object(); public LocationSyncSystem(Contexts contexts) { m_Contexts = contexts; m_PosMatcher = (Matcher)Matcher.AllOf(CombatComponentsLookup.TransformProxy). NoneOf(CombatComponentsLookup.JoystickProxy, CombatComponentsLookup.VirtualCameraProxy, CombatComponentsLookup.Dead); m_PosMatcher.componentNames = CombatComponentsLookup.componentNames; RealTimeChart.Instance.AddTrack("LocationSyncSystemX", UnityEngine.Color.yellow); RealTimeChart.Instance.AddTrack("LocationSyncSystemY", UnityEngine.Color.blue); } public void Execute(float deltaTime) { if (deltaTime < BattleConst.Epsilon) return; var ces = m_Contexts.combat.GetGroup(MatcherExt.s_MovementMatcher).GetEntities(Contexts.s_CacheEntities); var dtRevese = 1.0f / (deltaTime * deltaTime); var cesCount = ces.Count; for (int i = 0; i < cesCount; i++) { var re = ces[i]; var transform = (TransformProxy)re.GetComponent(CombatComponentsLookup.TransformProxy); var speedSqr = (transform.position - transform.lastPosition).sqrMagnitude * dtRevese; re.DispatchEvent(ClientEvent.NoMovementTime, speedSqr > 0.04f ? null : s_EntityNoMove); // todo : 如果变换的多的话,需要加响应系统同步 // if (BattleModule.Instance.worldType != WorldType.Battle) { var animProxy = (AnimationProxy)re.GetComponent(CombatComponentsLookup.AnimationProxy); if (animProxy != null) { // 时间减缓 if (speedSqr > 0.04) { animProxy.Play(FNameLookup.Move); } else if (speedSqr < 0.01) { animProxy.Play(FNameLookup.Idle); } } transform.Sync(); transform.Flush(); } } } } }