using System.Collections.Generic; using Entitas; using GAS.Runtime; using UnityEngine; namespace CoreGame.Render { public class MonsterIndicatorSys : IExecuteSystem { private readonly IGroup m_MonsterGroup; private readonly List m_CacheEntities = new List(); private readonly Camera m_Camera; public MonsterIndicatorSys(Contexts contexts) { m_MonsterGroup = contexts.combat.GetGroup(CombatMatcher.Monster); m_Camera = Camera.main; } public void Execute(float deltaTime) { m_MonsterGroup.GetEntities(m_CacheEntities); var closestDis = 999f; var closestEid = 0; var closestPos = Vector2.zero; for (var i = 0; i < m_CacheEntities.Count; i++) { var monster = m_CacheEntities[i]; if (monster.TagCountContainer.HasTag(GTagLib.State_Death)) continue; var screenPos = m_Camera.WorldToViewportPoint(monster.logicTransform.position.ToVector2()); var isOutOfBounds = screenPos.x < 0 || screenPos.x > 1 || screenPos.y < 0 || screenPos.y > 1; if (!isOutOfBounds) { closestEid = 0; break; } var dis = Mathf.Min( Mathf.Min(Mathf.Abs(screenPos.x - 1), screenPos.x), Mathf.Min(Mathf.Abs(screenPos.y - 1), screenPos.y) ); if (!(dis < closestDis)) continue; closestDis = dis; closestEid = monster.creationIndex; closestPos = monster.transformProxy.position; } if (closestEid == 0) { CoreUIBridge.CoreGamePushNearestMonsterPos(false, Vector2.zero); } else { CoreUIBridge.CoreGamePushNearestMonsterPos(true, closestPos); } } } }