--移动 local DriveSystem = {} local private = {} local FP=FP local _aimAddTemp = FP.newV1(0) local _v2Temp = FP.newV2(0,0) local LuaConst=LuaConst function DriveSystem.OnBorn(entity) --载具有自己的出生旋转朝向 if entity:IsVehicle() then local moveComp = entity.components.move local driveComp = entity.components.drive local driveData = driveComp:GetDriveData() local bornAngle = driveData.BornAngle if FP.Math.Abs(bornAngle) > driveData.AngleMax then logging.error("LTAG.ERROR" , "[关卡策划注意] :载具的出生角度大过了AngleMax ,这不允许!") end local dir = FP.V2.GetOffsetToAngle(bornAngle, moveComp.LogicRotateDir) moveComp.LastLogicRotateDir:Reset(moveComp.LogicRotateDir) moveComp:SetLogicRotateDir(dir) end end function DriveSystem.OnDead(entity) local driveComp = entity.components.drive if driveComp then if driveComp.DriveEntity then SystemManager.OffDrive(entity, true) end if driveComp.BeDrivedByEntity then local driver = driveComp.BeDrivedByEntity SystemManager.OffDrive(driver, true) BattleEventSystem.AfterDrivedVehicleDead(entity, driver) end end end function DriveSystem.DriveEntity(entity ,carEntity) local driveComp = entity.components.drive driveComp:SetDrivedEntity(carEntity) end function DriveSystem.OffDriveEntity(entity) local driveComp = entity.components.drive driveComp:ResetDrivedEntity() end --被驾驶的车,打击目标点的移动 function DriveSystem.OnLogicUpdate(entity) local driveComp = entity.components.drive if (not driveComp.BeDrived) or (not driveComp.IsFirstPerspective) then return end local moveComponent = entity.components.move if moveComponent.WantRotateDir == FP.Const.Vector2_Zero then return end local y = moveComponent.WantRotateDir.z local halfControlRate = moveComponent.IsHalfDir and 0.6 or 1 local disSpeed = driveComp.realDisSpeed or ( driveComp.DriveData.DisSpeed * FP.Math.Abs(y) ) if y > FP.Const.Zero then --远离 _aimAddTemp:Reset(disSpeed):Mul(LuaConst.TimeSpan):Mul(halfControlRate) driveComp.AimPosZ:Add( _aimAddTemp) if driveComp.AimPosZ > driveComp.DriveData.DisMax then driveComp.AimPosZ:Reset(driveComp.DriveData.DisMax) end else -- 拉近 _aimAddTemp:Reset(disSpeed):Mul(LuaConst.TimeSpan):Mul(halfControlRate) driveComp.AimPosZ:Sub( _aimAddTemp) if driveComp.AimPosZ < driveComp.DriveData.DisMin then driveComp.AimPosZ:Reset(driveComp.DriveData.DisMin) end end end return DriveSystem