public static bool AttackEnemyInRange(ActorBehaviour abMe, long targetId) { ActorBehaviour abEnemy = GameRoomManager.Instance.RoomLogic.ActorManager.GetActor(targetId); if (abEnemy == null) { // 优先找指定的敌人,如果没有找到,则搜索射程以内的敌人(从近到远) abEnemy = abMe.FindEnemyInRange(); } if (abEnemy != null) { if (abMe.IsEnemyInRange(abEnemy)) { if (abMe.CalcDistance(abEnemy) < 18f * abMe.ShootingRange) { // 敌人进入射程,进入攻击状态. 注意:这时候的敌人,可能不是之前要打的敌人 abMe.IsCounterAttack = false; // 这是主动攻击, 不是反击, 记录在自己身上, Stop的时候用 abMe.StateMachine.TriggerTransition(StateEnum.FIGHT, abEnemy.CellIndex, abEnemy.ActorId, abMe.AttackDuration); CmdAttack.TryCommand(); return(true); } } } return(false); }
public override void Tick() { if (timeSpan < TIME_DELAY) { timeSpan += Time.deltaTime; return; } timeSpan = 0; // 1-恢复[弹药基数AmmoBase] if (Owner.GetLastedTime() >= TIME_SUPPLY) { Owner.RestartTime(); if (_actorBehaviour.AmmoBase < _actorBehaviour.AmmoBaseMax) { _actorBehaviour.AmmoBase++; AmmoSupply output = new AmmoSupply() { RoomId = _actorBehaviour.RoomId, OwnerId = _actorBehaviour.OwnerId, ActorId = _actorBehaviour.ActorId, AmmoBase = _actorBehaviour.AmmoBase, }; GameRoomManager.Instance.SendMsg(ROOM.AmmoSupply, output.ToByteArray()); } } // 2-寻找附近的敌人, 如果有, 且自己弹药满仓, 且自己行动点足够, 且敌人活着, 就干他 // (因为本状态下可以恢复弹药,所以如果只要弹药有1就攻击的话,显得拖拖拉拉) var abEnemy = _actorBehaviour.FindEnemyInRange(); if (abEnemy != null && _actorBehaviour.AmmoBase == _actorBehaviour.AmmoBaseMax && CmdAttack.IsActionPointGranted() && !abEnemy.IsDead) { _actorBehaviour.IsCounterAttack = false; // 这是主动攻击, 不是反击, 记录在自己身上, Stop的时候用 _actorBehaviour.StateMachine.TriggerTransition(StateEnum.FIGHT, 0, abEnemy.ActorId, _actorBehaviour.AttackDuration); } }