--控制单位进行 直行 -> 升轨 -> 圆周的运动 local base = require("Battle/Logic/AI/Decision/Decision_Base") local Decision_HarassMove = class("Decision_HarassMove", base) local EPhase = { CLOSE_TO = 1, --接近 FAR_AWAY = 2, --远离 EXIT = 3, --退出 } function Decision_HarassMove:initialize(entity) --类型 self.Type = LuaConst.DecisionType.HarassMove --是否是瞬时 self.IsOnce = false end --[[ 进入该Decision --]] function Decision_HarassMove:DecisionIn(entity, decisionData) local decisionRecordDic = entity.components.aiBase:GetDecisionRecordDic(decisionData) self:CommonConditionalSkillStringParamParse(decisionData, decisionRecordDic, entity) decisionRecordDic.changePhaseDistSqr = FP.newV1(math.abs(decisionData.IntParam2) + math.abs(decisionData.IntParam3)) decisionRecordDic.changePhaseDistSqr:Mul(math.abs(decisionData.IntParam2) + math.abs(decisionData.IntParam3)) decisionRecordDic.sideOffset = decisionData.IntParam3 self:ChangePhase(EPhase.CLOSE_TO, decisionRecordDic, entity) end function Decision_HarassMove:ChangePhase(newPhase, decisionRecordDic, entity, decisionData) if decisionRecordDic.phase ~= newPhase then decisionRecordDic.phase = newPhase decisionRecordDic.phaseFrameEla = 0 if newPhase == EPhase.CLOSE_TO then elseif newPhase == EPhase.FAR_AWAY then end else logging.error(LTAG.ERROR, "HYW :警告! 试图重复设置phase @Decision_HarassMove(程序调试代码,测试可以忽略)") end end --[[ 退出该Decision --]] function Decision_HarassMove:DecisionOut(entity, decisionData) base.DecisionOut(self, entity, decisionData) entity.components.aiBase:SetAiRecord("DetourRoundMoveTimeEla", nil) end --[[ 能否进入 --]] function Decision_HarassMove:CanEnter(entity, decisionData, command) --有目标才能进入 return entity.components.target.Target ~= nil end --[[ 能否退出 --]] function Decision_HarassMove:CanExit(entity, decisionData, command) local decisionRecordDic = entity.components.aiBase:GetDecisionRecordDic(decisionData) --如果没有目标就退出 return entity.components.target.Target == nil or decisionRecordDic.phase == EPhase.EXIT end local _tempV1 = FP.newV1(0) local _tempV2 = FP.newV2(0, 0) --[[ 修饰指令(修饰command) --]] function Decision_HarassMove:SetCommand(entity, decisionData, command) local decisionRecordDic = entity.components.aiBase:GetDecisionRecordDic(decisionData) local deltaFrame = 0 --两次SetCommand之间的间隔 if decisionRecordDic.lastSetCommandFrame then deltaFrame = LogicUpdateManager._clientHandleFrame - decisionRecordDic.lastSetCommandFrame end decisionRecordDic.lastSetCommandFrame = LogicUpdateManager._clientHandleFrame decisionRecordDic.phaseFrameEla = decisionRecordDic.phaseFrameEla + deltaFrame if decisionRecordDic.phase == EPhase.CLOSE_TO then local target = entity.components.target.Target if target then _tempV2:Reset(target:GetLogicPos()) _tempV2:Sub(entity:GetLogicPos()) --此时_tempV2是从entity指向target的向量 local sideOffset = FP.V2.GetRightByForward(_tempV2) --支持横向偏移 sideOffset:Normalize() sideOffset:Mul(decisionRecordDic.sideOffset) _tempV2:Add(sideOffset) --此时_tempV2是从entity指向目标位置(带偏移的)的向量,也就是距离向量 FP.V2.SqrMagnitude(_tempV2, _tempV1) -- _tempV1是entity跟目标位置(带偏移的)的距离 _tempV2:Normalize() --_tempV2此时是从entity指向目标位置的单位向量 if _tempV1 <= decisionRecordDic.changePhaseDistSqr then decisionRecordDic.farAwayDir = _tempV2:cloneV2() self:ChangePhase(EPhase.FAR_AWAY, decisionRecordDic, entity, decisionData) else command.MoveDir:Reset(_tempV2) command.RotateDir:Reset(command.MoveDir) end self:CommonIntervalUseConditionalSkill(decisionRecordDic, entity, deltaFrame * LuaConst.TimeSpanMs, command) end elseif decisionRecordDic.phase == EPhase.FAR_AWAY then command.MoveDir:Reset(decisionRecordDic.farAwayDir) command.RotateDir:Reset(command.MoveDir) if decisionRecordDic.phaseFrameEla > decisionData.IntParam1 then self:ChangePhase(EPhase.EXIT, decisionRecordDic, entity, decisionData) end end return command end return Decision_HarassMove