using Entitas; using System.Collections.Generic; using UnityEngine; using Game; /// /// 主角的技能锁定系统 /// public class ComboLockSystem : IExecuteSystem, IInitializeSystem { private IGroup _entities; private List _tempList = new List(); public void Initialize() { _entities = Util.GetGroup(GameMatcher.Hp); } public void Execute() { var entity = Util.GetMaster(); if (Util.IsPause(entity)) { return; } UpdateLock(entity); //更新锁定 } public void UpdateLock(GameEntity entity) { var combo = entity.combo; var hasTarget = combo.TargetLock > 0; var lockPress = combo.KeyPressSet.Contains(EFunctionKey.Lock); //更新锁定时间 _tempList.Clear(); _tempList.AddRange(combo.TargetLastLockTime.Keys); foreach (var item in _tempList) { combo.TargetLastLockTime[item] += Time.deltaTime; if (combo.TargetLastLockTime[item] >= GameConst.LockCacheTime) { combo.TargetLastLockTime.Remove(item); } } //无变化的状态 if (hasTarget == lockPress) { if (combo.TargetLock == -1) { combo.TargetLock = 0; } return; } if (hasTarget) { //取消锁定 combo.TargetLastLockTime[combo.TargetLock] = 0; combo.TargetLock = 0; } else { //锁定 if (combo.TargetLock == -1) { return; } //查找锁定对象 现阶段方案只找最近的 var newTarget = FindTarget(entity); //如果没找到 清空锁定时间 再找一次 if (newTarget == -1 && combo.TargetLastLockTime.Count > 0) { combo.TargetLastLockTime.Clear(); } newTarget = FindTarget(entity); combo.TargetLock = newTarget; } var target = Util.GetEntity(combo.TargetLock); Util.SetSubTarget(target == null ? null : target.view.GameObject.transform); } private int FindTarget(GameEntity entity) { var combo = entity.combo; var newTarget = -1; var distanceMin = float.MaxValue; foreach (var target in _entities) { if (target.Team() != ETeam.Monster) { continue; } var entityID = target.ID(); if (combo.TargetLastLockTime.ContainsKey(entityID)) { continue; } var distance = Vector3.Distance(entity.Pos(), target.Pos()); if (distance > GameConst.LockRange) { continue; } if (distance < distanceMin) { newTarget = entityID; distanceMin = distance; } } return newTarget; } }