private void Fight() { float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, m_Owner.Target.Pos); if (dist > AI.AttackDist) { ChangeState <AIChaseState>(); return; } if (m_Owner.CurFsmStateType == ActorFsmStateType.FSM_SKILL) { return; } SkillTree skill = m_Owner.ActorSkill.FindNextSkillByDist(dist); if (skill != null) { m_Owner.ExecuteCommand(new UseSkillCommand(skill.Pos)); } else { m_Owner.ExecuteCommand(new IdleCommand()); } }
protected override void OnUpdate(IFsm <ActorBase> fsm, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(fsm, elapseSeconds, realElapseSeconds); ActorBase pTarget = m_Owner.Target; switch (m_Owner.ActorType) { case ActorType.Monster: { if (pTarget?.CachedTransform != null) { float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, pTarget.Pos); if (dist < AI.WaringDist) { ChangeState <AIChaseState>(); } } } break; case ActorType.Partner: { if (pTarget?.CachedTransform != null) { float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, pTarget.Pos); if (dist < AI.WaringDist) { ChangeState <AIChaseState>(); } } ActorBase pHost = m_Owner.Host; if (pHost?.CachedTransform != null) { float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, m_Owner.Host.Pos); if (dist > AI.FollowDist) { ChangeState <AIFollowState>(); return; } } } break; case ActorType.Player: { if (pTarget?.CachedTransform != null) { float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, pTarget.Pos); if (dist < AI.WaringDist) { ChangeState <AIChaseState>(); } } } break; } }
protected override void OnUpdate(IFsm <ActorBase> fsm, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(fsm, elapseSeconds, realElapseSeconds); if (m_Owner.Target == null) { return; } float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, m_Owner.Target.Pos); if (dist < AI.AttackDist) { ChangeState <AIFightState>(); } }
public ActorBase GetNearestEnemy(float radius = 100) { List <ActorBase> actors = GetAllEnemy(); ActorBase nearest = null; float min = radius; for (int i = 0; i < actors.Count; i++) { float dist = GlobalTools.GetHorizontalDistance(actors[i].CachedTransform.position, this.CachedTransform.position); if (dist < min) { min = dist; nearest = actors[i]; } } return(nearest); }
public SkillTree FindNextSkillByDist(Vector3 dest) { float dist = GlobalTools.GetHorizontalDistance(dest, m_Owner.Pos); return(FindNextSkillByDist(dist)); }
protected override void OnUpdate(IFsm <ActorBase> fsm, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(fsm, elapseSeconds, realElapseSeconds); switch (m_Owner.ActorType) { case ActorType.Monster: { if (m_Owner.Target == null) { return; } float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, m_Owner.Target.Pos); if (dist > AI.WaringDist) { ChangeState <AIBackState>(); } else if (dist < AI.AttackDist) { ChangeState <AIFightState>(); return; } } break; case ActorType.Partner: { if (m_Owner.Target?.CachedTransform == null) { ChangeState <AIIdleState>(); return; } float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, m_Owner.Target.Pos); if (dist > AI.WaringDist) { ChangeState <AIIdleState>(); return; } else if (dist < AI.AttackDist) { ChangeState <AIFightState>(); return; } } break; case ActorType.Player: { if (m_Owner.Target == null) { ChangeState <AIIdleState>(); return; } float dist = GlobalTools.GetHorizontalDistance(m_Owner.Pos, m_Owner.Target.Pos); if (dist < AI.AttackDist) { ChangeState <AIFightState>(); return; } } break; } if (m_Owner.Target != null) { m_Owner.ExecuteCommand(new AutoMoveCommand(m_Owner.Target)); } }