---@class BP_BatteryBullet_C:AActor ---@field BoomEffect UParticleSystemComponent ---@field ParticleTrailing UParticleSystemComponent ---@field BulletMesh UStaticMeshComponent ---@field SphereOverlap USphereComponent ---@field DefaultSceneRoot USceneComponent ---@field LifeTime float ---@field FlySpeed float ---@field Damage float --Edit Below-- ---@type BP_BatteryBullet_C local BP_BatteryBullet = { bFlying = false; StartFlyTime = 0; -- 预飞行的起始时间 StartPrepareTime = 0; FlyStartPos = {X = 0, Y = 0, Z = 0}; FlyDir = {X = 0, Y = 0, Z = 0}; }; function BP_BatteryBullet:SetDamage(InDamage) self.Damage = InDamage; end function BP_BatteryBullet:SetFlySpeed(InFlySpeed) self.FlySpeed = InFlySpeed end function BP_BatteryBullet:SetLifeTime(InLifeTime) self.LifeTime = InLifeTime end function BP_BatteryBullet:ReceiveBeginPlay() self.SuperClass.ReceiveBeginPlay(self); UGCLogSystem.Log("[BP_BatteryBullet_ReceiveBeginPlay]" .. KismetSystemLibrary.GetObjectName(self)) if UGCGameSystem.IsServer() then self.SphereOverlap.OnComponentBeginOverlap:Add(self.OnBeginOverlap, self); else self.BulletMesh:SetHiddenInGame(true) end end --- 预开火 function BP_BatteryBullet:PrepareToFire(StartTime, DelayFireTime) self.StartPrepareTime = StartTime self.StartFlyTime = self.StartPrepareTime + DelayFireTime self.FlyStartPos = self:K2_GetActorLocation() self.FlyDir = self:GetActorForwardVector() self.bFlying = true if UGCGameSystem.IsServer() then else self.BulletMesh:SetHiddenInGame(false) self.ParticleTrailing:SetActive(true, true) end end ---@param OtherActor UGCPlayerPawn_C function BP_BatteryBullet:OnBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) if self.bFlying and OtherActor and OtherActor.PlayerKey then self:HitPlayer(OtherActor) end end --- 击中玩家 function BP_BatteryBullet:HitPlayer(PlayerPawn) self.bFlying = false if UGCGameSystem.IsServer() then UGCSendRPCSystem.ActorRPCNotify(nil, self, "HitPlayer") UGCPawnAttrSystem.SetHealth(PlayerPawn, UGCPawnAttrSystem.GetHealth(PlayerPawn) - self.Damage) else self:FlyEndEffect() end end --- 炮弹移动 function BP_BatteryBullet:ReceiveTick(DeltaTime) self.SuperClass.ReceiveTick(self, DeltaTime); if self.bFlying then local NowTime = UGCGameSystem.GameState:GetServerGameTime() local FlyTime = NowTime - self.StartFlyTime if FlyTime > self.LifeTime then self.bFlying = false FlyTime = self.LifeTime if not UGCGameSystem.IsServer() then self:FlyEndEffect() end end if FlyTime > 0 then local TargetPos = VectorHelper.Add(self.FlyStartPos, VectorHelper.MulNumber(self.FlyDir, FlyTime * self.FlySpeed)) self:K2_SetActorLocation(TargetPos) -- UGCLogSystem.Log("[BP_BatteryBullet_ReceiveTick] TargetPos:%s", VectorHelper.ToString(TargetPos)) end end end --- 结束效果 function BP_BatteryBullet:FlyEndEffect() self.BulletMesh:SetHiddenInGame(true) self.BoomEffect:SetActive(true, true) self.ParticleTrailing:SetActive(false, false) SoundSystem.PlaySound(SoundSystem.ESound.Impact) end --[[ function BP_BatteryBullet:ReceiveEndPlay() self.SuperClass.ReceiveEndPlay(self); end --]] --[[ function BP_BatteryBullet:GetAvailableServerRPCs() return end --]] return BP_BatteryBullet;