--这个只能是给玩家使用,其他怪全部为默认值false local DriveComponent = class("DriveComponent") local _v2Temp = FP.newV2(0,0) local _v1Temp = FP.newV1(0) function DriveComponent:initialize(entity) self.Entity = entity ---------我是司机时的数据-------- self.DriveEntity = nil --被我驾驶的人 -----------我是车被驾驶数据------------- self.BeDrived = false -- 被驾驶了 self.AimPosZ = nil -- 如果有瞄准点,这就是瞄准点的相对位置的z值【同步的关键信息值】 self.OriginForward = FP.newV2(0,1) -- 出生时的朝向 self.BeDrivedByEntity = nil -- 驾驶我的人 self.LastDriver = nil -- 最后一个驾驶我的人 local characterData = entity.components.base.CurCharacterData if characterData.DriveParamID > 0 then self.DriveData = DataSheetManager.DriveData:GetDataByID(characterData.DriveParamID) if self.DriveData then self.RandomAngle1 = self.DriveData.RandomAngle1 -- 水平旋转 self.RandomAngle2 = self.DriveData.RandomAngle2 -- 垂直旋转 self.PerspectiveType = self.DriveData.PerspectiveType -- 驾驶类型 (0:第一视角 ;1 第三视角) self.IsFirstPerspective = self.DriveData.PerspectiveType == 0 -- 驾驶类型 是 第一视角 self.IsFreeMove = self.DriveData.MoveType == 1 -- 驾驶移动类型 :可自由行走 self.IsFreeCamera = self.DriveData.CameraType == 1 -- 驾驶相机类型 :是 自由相机 end end if self.DriveData then self.AimPosZ = FP.newV1(0) if self.DriveData.DisInit == FP.Const.Zero then self.AimPosZ:Reset(self.DriveData.DisMin):Add(self.DriveData.DisMax):Div(FP.Const.Two) -- 初始化的位置是中间 else self.AimPosZ:Reset(self.DriveData.DisInit) end self.OriginForward = entity.components.move.LogicRotateDir:cloneV2() -- 策划配置的原始向上抬的角速度 FP.Math.Abs( (self.DriveData.CRXMax - self.DriveData.CRXMin) / ( (self.DriveData.DisMax - self.DriveData.DisMin) / self.DriveData.DisSpeed ) ) _v1Temp:Reset(self.DriveData.DisMax):Sub(self.DriveData.DisMin):Div(self.DriveData.DisSpeed) self.AngleSpeedX = FP.newV1(0) self.AngleSpeedX:Reset(self.DriveData.CRXMin):Sub(self.DriveData.CRXMax):Div(_v1Temp) if self.DriveData.ExtraUIType == LuaConst.DriveExtraUIType.UIAim then self.realDisSpeed = self.DriveData.DisSpeed:cloneV1() -- 准星类的垂直角速度 ,需要进行改变的,以保持摇杆和视图方向一致 end end end --set被我驾驶的人 function DriveComponent:SetDrivedEntity(carEntity) self.DriveEntity = carEntity self.DriveEntity.components.drive.BeDrived = true self.DriveEntity.components.drive.BeDrivedByEntity = self.Entity self.DriveEntity.components.drive.LastDriver = self.Entity end --清除被我驾驶的人 function DriveComponent:ResetDrivedEntity() if self.DriveEntity then self.DriveEntity.components.drive.BeDrived = false self.DriveEntity.components.drive.BeDrivedByEntity = nil end self.DriveEntity = nil end --获取被我驾驶的人 function DriveComponent:GetDrivedEntity() return self.DriveEntity end function DriveComponent:GetDriver() return self.BeDrivedByEntity end function DriveComponent:GetLastDriver() return self.LastDriver end -- 获取drive限制信息 function DriveComponent:GetDriveData() return self.DriveData end -- 计算弩车子弹的SpeedY function DriveComponent:GetSpeedY(speedX) if not self.DriveData.FireMissileNeedY then return FP.Const.Zero end local rate = (self.AimPosZ - self.DriveData.DisMin) / (self.DriveData.DisMax - self.DriveData.DisMin) local angle = (self.DriveData.CRXMax - self.DriveData.CRXMin) * rate + self.DriveData.CRXMin if self.RandomAngle2 then local random = LogicRandom.GetRangeValue(nil,-self.RandomAngle2 , self.RandomAngle2 ,4001) angle:Add(random) end local rad = FP.Math.Radian(angle) local sy = FP.newV1(0) sy:Reset(speedX):Mul(FP.Math.Sin(rad)):Mul(FP.Math.Cos(rad)):Negative() return sy end --设置弩车的左右偏移 function DriveComponent:TrySetRandomAngle(fireParam) if self.RandomAngle1 then local randomAngle = LogicRandom.GetRangeValue(nil,-self.RandomAngle1 , self.RandomAngle1 ,4002) fireParam.Forward = FP.V2.GetOffsetToAngle(randomAngle, fireParam.Forward) end end --设置弩车的垂直转动角速度 function DriveComponent:SetAngleSpeed(angleSpeed) --self.realDisSpeed = (self.DriveData.DisMax - self.DriveData.DisMin) / ((self.DriveData.CRXMin - self.DriveData.CRXMax) / angleSpeed) _v1Temp:Reset(self.DriveData.CRXMin):Sub(self.DriveData.CRXMax):Div(angleSpeed) self.realDisSpeed:Reset(self.DriveData.DisMax):Sub(self.DriveData.DisMin):Div(_v1Temp) end --设置弩车的垂直转动角速度 -- 倍率 function DriveComponent:SetAngleSpeedRate(rate) self.realDisSpeed:Mul(rate) end -- 获取瞄准点位置 function DriveComponent:TryGetAimPos() if not self.AimPosZ then return nil end local moveComp = self.Entity.components.move local aimPos = moveComp.LogicPos:cloneV2() aimPos:Reset(moveComp.LogicRotateDir):Mul(self.AimPosZ):Add(moveComp.LogicPos) -- LogicRotateDir 一定要归一化的 --技能中设置了随机的话 local skillBaseComponent = self.Entity.components.skillBase local skillData = skillBaseComponent.CurSkillData if skillData then -- 如果是正在释放技能中获取目标点,则需要考虑随机范围 local radius = skillData.AimPosRound if radius > FP.Const.Zero then LogicRandom.GetRandomPointInCircle(self.Entity,radius ,401 ,_v2Temp) aimPos:Add(_v2Temp) end end return aimPos end return DriveComponent