local Base = require("Battle/Logic/AI/Decision/Decision_Base") local Decision_WanderToGroupLeader = class("Decision_WanderToGroupLeader", Base) local private = {} --[[ 初始化 --]] function Decision_WanderToGroupLeader:initialize(entity) --类型 self.Type = LuaConst.DecisionType.Idle --瞬时 self.IsOnce = false end --[[ 能否进入 进入条件:群组领袖存在 --]] function Decision_WanderToGroupLeader:CanEnter(entity, decisionData, command) local groupComponent = entity.components.group return groupComponent.LeaderEntity ~= nil end --[[ 能否退出 退出条件:一定距离之内 --]] function Decision_WanderToGroupLeader:CanExit(entity, decisionData, command) local groupComponent = entity.components.group if groupComponent.LeaderEntity then return FP.LessEquals(groupComponent.ToLeaderDisSqr, decisionData.IntParam1 * decisionData.IntParam1) else return true end end --[[ 输出指令 --]] function Decision_WanderToGroupLeader:SetCommand(entity, decisionData, command) command.DecisionID = decisionData.ID --始终朝向目标 local target = entity.components.target.Target if target then command.RotateDir:Reset(target.components.move.LogicPos):Sub(entity.components.move.LogicPos) end return command end --[[ 执行 --]] function Decision_WanderToGroupLeader:Handle(entity, decisionData, stateType, animName) local animComponent = entity.components.anim if not LuaConst.WanderAnimNameTable[entity.components.anim.CurAnimID] or animComponent.IsCurAnimOver then local leader = entity.components.group.LeaderEntity if leader then local target = entity.components.target.Target animName = private:GetWanderAnimNameByAngle(entity, leader, target) return LuaConst.StateType.Wander, animName end end return LuaConst.StateType.None, nil end function private:GetWanderAnimNameByAngle(entity, leader, target) local animName = nil local selfToTarget = FP.V2.Normalized(target.components.move.LogicPos - entity.components.move.LogicPos) local selfToLeader = FP.V2.Normalized(leader.components.move.LogicPos - entity.components.move.LogicPos) local leaderToTarget = FP.V2.Normalized(target.components.move.LogicPos - leader.components.move.LogicPos) local targetToLeader = -leaderToTarget local angle = FP.V2.Angle(selfToTarget, leaderToTarget) if angle > FP.newV1(60) then if FP.V2.IsRotateClockwise(selfToLeader, selfToTarget) then animName = LuaConst.Animation_walk_right_loop else animName = LuaConst.Animation_walk_left_loop end else local angle2 = FP.V2.Angle(targetToLeader, selfToLeader) if angle2 > FP.newV1(90) then animName = LuaConst.Animation_walk_back_loop else animName = LuaConst.Animation_walk_front_loop end end return animName end Decision_WanderToGroupLeader.GetWanderAnimNameByAngle = private.GetWanderAnimNameByAngle return Decision_WanderToGroupLeader