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 Enter() { _enemyActorId = 0; isRest = false; ActorBehaviour abEnemy = GameRoomManager.Instance.RoomLogic.ActorManager.GetActor(Owner.TargetActorId); if (abEnemy != null && _actorBehaviour.IsEnemyInRange(abEnemy)) { _enemyActorId = abEnemy.ActorId; FightStart output = new FightStart() { RoomId = GameRoomManager.Instance.RoomId, OwnerId = _actorBehaviour.OwnerId, ActorId = _actorBehaviour.ActorId, TargetId = abEnemy.ActorId, // SkillId }; GameRoomManager.Instance.SendMsg(ROOM.FightStart, output.ToByteArray()); } else { // 如果没有找到敌人, 休息 Owner.TriggerTransition(StateEnum.IDLE); } }