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

180 lines
5.8 KiB
Lua

---@class BP_MoveActorManager_C:AActor
---@field DefaultSceneRoot USceneComponent
--Edit Below--
---@type BP_MoveActorManager_C
local BP_MoveActorManager = {};
---@type MovingActorsManager
BP_MoveActorManager.MovingActorManager = nil;
BP_MoveActorManager.IsOpen = false;
BP_MoveActorManager.ActorPool = nil;
BP_MoveActorManager.ActorPoolCount = 20;
BP_MoveActorManager.MovingActorIndexList = {};
function BP_MoveActorManager:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
self.MovingActorManager = UGCGameSystem.GameState.MoveActorManager;
self.ActorPool = require('Script.Blueprint.MiniLevelActor.JumpAndCrouch.ActorPool');
UGCLogSystem.Log("[BP_MoveActorManager:ReceiveBeginPlay] self.MovingActorManager = %s", tostring(self.MovingActorManager));
-- 注册不同的Actor
UGCEventSystem.SetTimer(self, function()
if UGCGameSystem.IsServer() then
self:Init();
UGCEventSystem.SetTimer(self, function()
self:StartMove();
end, 10)
end
end, 30);
end
BP_MoveActorManager.MoveDelta = { X = 75, Y = 0, Z = 0, };
---@type table<int32, BP_ActorStart_C>
BP_MoveActorManager.MovingActorStarts = {};
BP_MoveActorManager.PinpongJump = 0.;
BP_MoveActorManager.StartTime = 5.;
BP_MoveActorManager.Symbol = 1;
function BP_MoveActorManager:InitMoveActor1()
UGCLogSystem.Log("[BP_MoveActorManager:InitMoveActor1] 执行")
local MovingActor = {};
local RotatorActors = {};
GameplayStatics.GetAllActorsWithTag(self, "MovingActor", MovingActor);
GameplayStatics.GetAllActorsWithTag(self, "RotatorActor", RotatorActors);
UGCLogSystem.LogTree(string.format("[BP_MoveActorManager:InitMoveActor1] MovingActor = "), MovingActor)
UGCLogSystem.LogTree(string.format("[BP_MoveActorManager:InitMoveActor1] RotatorActors = "), RotatorActors)
for i, v in pairs(MovingActor) do
self:LoadMovingActorManager():RegisterMovingActor(v, 5, function(InActor, InDeltaTime)
if InDeltaTime == nil then
return true, self.MoveDelta;
end
self.PinpongJump = self.PinpongJump + InDeltaTime;
if self.PinpongJump > self.StartTime then
self.PinpongJump = self.PinpongJump - self.StartTime;
self.Symbol = self.Symbol * -1;
end
local Vec = VectorHelper.ToLuaTable(VectorHelper.Mul(self.MoveDelta, { X = self.Symbol, Y = 1, Z = 1, }));
return true, Vec;
end)
end
for i, v in pairs(RotatorActors) do
self:LoadMovingActorManager():RegisterMovingActor(v, 5, function(Actor, InDeltaTime)
local Rot = VectorHelper.MakeRotator({ 0, 0, 30 })
UGCLogSystem.LogTree(string.format("[BP_MoveActorManager:InitMoveActor1] Rot = "), Rot);
return true, nil, Rot;
end)
end
-- 设置玩家试试
local Pawns = UGCGameSystem.GetAllPlayerPawn()
for i, v in pairs(Pawns) do
self:LoadMovingActorManager():RegisterMovingActor(v, 5, function(Actor, InDeltaTime)
local Vec = VectorHelper.MakeVector({ 30, 0, 0 });
return true, Vec, nil;
end)
end
end
---@return MovingActorsManager
function BP_MoveActorManager:LoadMovingActorManager()
if self.MovingActorManager == nil then
self.MovingActorManager = UGCGameSystem.GameState.MoveActorManager
end
return self.MovingActorManager;
end
-- 初始化
function BP_MoveActorManager:Init()
-- 寻找场景中的东西
self.ActorPool:Init(self.ActorPoolCount, ObjectPathTable.BP_MovingActor_Class, self,
VectorHelper.MakeVector(0, 0, 0), VectorHelper.MakeRotator({ 0, 0, 0 }), function(InActor, InIndex)
UGCLogSystem.Log("[BP_MoveActorManager:Init] ActorName = %s, Index = %s", UE.GetName(InActor), tostring(InIndex))
end);
if self:HasAuthority() then
for i = 1, self.ActorPoolCount do
self.MovingActorIndexList[#self.MovingActorIndexList + 1] = math.random(1, 2);
end
local Actors = {};
GameplayStatics.GetAllActorsOfClass(self, ObjectPathTable.BP_ActorStart_Class, Actors);
for i, v in pairs(Actors) do
local Index = v.StartIndex;
self.MovingActorStarts[Index] = v;
end
end
end
BP_MoveActorManager.PopTimer = nil;
BP_MoveActorManager.PopTimeFrequent = 1; -- pop的时间间隔
---@type float 注意该值需要比池子里面总数要小
BP_MoveActorManager.ResetTime = 10;
BP_MoveActorManager.PopIndex = 0;
--- 开始移动
function BP_MoveActorManager:StartMove()
UGCLogSystem.Log("[BP_MoveActorManager:StartMove] 执行")
self.PopTimer = UGCEventSystem.SetTimerLoop(self, function()
local Actor = self.ActorPool:Pop(function(InActor)
UGCEventSystem.SetTimer(InActor, function()
self.ActorPool:Push(InActor, function(A)
self.MovingActorManager:ResetActor(A);
A:SetActorHiddenInGame(true);
self.MovingActorManager:UnregisterMovingActor(A, true);
end)
end, 10);
end)
self.PopIndex = self.PopIndex + 1
local Index = self.MovingActorIndexList[self.PopIndex]
if Index == nil then
self:EndMove();
return ;
end
local Start = self.MovingActorStarts[Index];
if UE.IsValid(Start) then
self:RegisterMove(Actor, Start);
end
end, self.PopTimeFrequent);
end
--- 结束移动
function BP_MoveActorManager:EndMove()
if self.PopTimer ~= nil then
UGCEventSystem.StopTimer(self.PopTimer);
self.PopTimer = nil;
end
self.PopIndex = 0;
self.MovingActorIndexList = nil;
self.ActorPoolCount = 0;
self.MovingActorStarts = nil;
end
--- 注册移动
function BP_MoveActorManager:RegisterMove(InActor, InStart)
InActor:K2_SetActorLocation(InStart:K2_GetActorLocation());
InActor:K2_SetActorRotation(InStart:K2_GetActorRotation());
self.MovingActorManager:RegisterMovingActor(InActor, 2, function(Actor, InDeltaTime)
return true, VectorHelper.MakeVector(300, 0, 0), nil;
end);
if UGCGameSystem.IsServer() then
UnrealNetwork.CallUnrealRPC_Multicast(self, "RegisterMove", InActor, InStart);
end
end
function BP_MoveActorManager:ActorPoolSendRPC(FuncName, ...)
if UGCGameSystem.IsServer() then
UnrealNetwork.CallUnrealRPC_Multicast(self, "ActorPoolSendRPC", FuncName, ...);
else
end
end
return BP_MoveActorManager;