2025-01-04 23:00:19 +08:00

88 lines
2.3 KiB
Lua

---@class BP_RangeTest_C:AActor
---@field Sphere USphereComponent
---@field DefaultSceneRoot USceneComponent
--Edit Below--
---@type BP_RangeTest_C
local BP_RangeTest = {};
function BP_RangeTest:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
self.Sphere.OnComponentBeginOverlap:Add(self.OnSphereBeginOverlap, self);
end
function BP_RangeTest:OnSphereBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult)
UGCLogSystem.Log("[BP_RangeTest:OnSphereBeginOverlap] OtherActor = %s", UE.GetName(OtherActor));
end
BP_RangeTest.RangeActors = {};
function BP_RangeTest:FindAllActorsInRange()
local AllActors = {};
local Radius = self.Sphere:GetScaledSphereRadius();
UE.FindActorsByClass(nil, AllActors, function(InIndex, InActor)
if InActor then end
local Dis = VectorHelper.GetActorDis2D(self, InActor);
if Dis < Radius and InActor ~= self then
return true;
end
return false;
end);
self:SelectActors(AllActors);
end
function BP_RangeTest:FindSphereActors()
local ObjetType = { ECollisionChannel.ECC_WorldDynamic, };
local ActorList = {};
local Radius = self.Sphere:GetScaledSphereRadius();
UGCLogSystem.Log("[BP_RangeTest:FindSphereActors] Radius = %s", tostring(Radius));
KismetSystemLibrary.SphereOverlapActors(self, self:K2_GetActorLocation(), Radius, ObjetType, UE.GetActorClass(), {}, ActorList);
self:SelectActors(ActorList);
end
---@param InActorList table<int32, AActor>
function BP_RangeTest:SelectActors(InActorList)
local HadChange = false;
for i, v in pairs(self.RangeActors) do
if v == nil or not UE.IsValid(v) then
HadChange = true;
self.RangeActors[i] = nil;
end
end
for i, v in pairs(InActorList) do
if UE.IsValid(v) then
local Name = UE.GetName(v);
if self.RangeActors[Name] == nil then
HadChange = true;
self.RangeActors[Name] = v;
end
end
end
if HadChange then
UGCLogSystem.LogTree(string.format("[BP_RangeTest:SelectActors] RangeActors "), self.RangeActors)
end
end
function BP_RangeTest:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
self:FindAllActorsInRange();
end
--[[
function BP_RangeTest:ReceiveEndPlay()
self.SuperClass.ReceiveEndPlay(self);
end
--]]
--[[
function BP_RangeTest:GetReplicatedProperties()
return
end
--]]
--[[
function BP_RangeTest:GetAvailableServerRPCs()
return
end
--]]
return BP_RangeTest;