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

163 lines
4.7 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---@class BP_MoveBase_C:AActor
---@field Box UBoxComponent
---@field StaticMesh UStaticMeshComponent
---@field DefaultSceneRoot USceneComponent
---@field Script FString
---@field MoveLength int32
--Edit Below--
require('Script.Global.Tool.TableTool')
---@type BP_MoveBase_C
local BP_MoveBase = {};
---@type bool 是否移动
BP_MoveBase.IsMove = false;
BP_MoveBase.StartMoveTime = nil;
BP_MoveBase.CachedIsMove = false;
BP_MoveBase.CachedStartMoveTime = nil;
---@type MoveItemScriptBase
BP_MoveBase.ScriptItem = nil;
BP_MoveBase.ScriptParams = nil;
BP_MoveBase.PreScript = "Script.Blueprint.SceneObj.Move.Script.";
--- 继承用
function BP_MoveBase:new(...)
local Params = {...};
if table.isEmpty(Params) then
Params = nil;
end
return setmetatable({
IsMove = false,
StartMoveTime = nil,
CachedIsMove = false;
CachedStartMoveTime = nil;
ScriptItem = nil;
ScriptParams = Params;
}, {
__index = self,
__metatable = self,
});
end
--function BP_MoveBase:ReceiveBeginPlay()
-- self.SuperClass.ReceiveBeginPlay(self);
-- self:LuaInit();
--end
function BP_MoveBase:LuaInit(...)
UGCEventSystem.AddListener(EventTypes.ClientAlready, self.OnClientAlready, self)
self:PreInit();
self:InitMove(...);
self:PostInit();
end
function BP_MoveBase:PreInit() end
function BP_MoveBase:InitMove(...)
UGCLogSystem.Log("[BP_MoveBase:InitMove] 执行")
if string.len(self.Script) ~= 0 then
self.Script = self.PreScript .. self.Script;
local Item = require(self.Script);
local Len = self.MoveLength > 0 and self.MoveLength or 1000;
self.ScriptItem = setmetatable({
MoveLength = Len;
Owner = self,
}, {
__index = Item;
__metatable = Item;
__tostring = function(t) return tostring(t.MoveLength); end
});
if self.ScriptItem ~= nil then
local Params = {...};
if table.isEmpty(Params) then self.ScriptParams = Params; end
table.func(self.ScriptItem, self.ScriptItem['Init'], table.unpackTable(self.ScriptParams));
if self.ScriptItem['GetStaticMeshString'] ~= nil then
local MeshStr, Transform = self.ScriptItem['GetStaticMeshString'](self.ScriptItem)
if MeshStr ~= nil then
UE.AsyncLoadObject(MeshStr, function(TargetObject)
self.StaticMesh:SetStaticMesh(TargetObject);
end)
if Transform ~= nil then
self.StaticMesh:K2_SetRelativeLocation(Transform.Translation);
self.StaticMesh:K2_SetRelativeRotation(KismetMathLibrary.Quat_Rotator(Transform.Rotation));
self.StaticMesh:SetRelativeScale3D(Transform.Scale3D);
end
end
end
end
end
-- 通过这种方式注册,之后就不需要调用 Tick 了
if self.ScriptItem then
GlobalTickTool:AddTick(self, self.MoveTick, nil, function(o, dt, ServerTime) return true; end)
end
end
function BP_MoveBase:PostInit() end
--- 服务器和客户端同时执行
function BP_MoveBase:StartMove(EnableMove, InTime)
if IsServer then
UGCLogSystem.Log("[BP_MoveBase:StartMove] 设置是否移动:%s", tostring(EnableMove))
self.IsMove = EnableMove;
self.StartMoveTime = EnableMove and UE.GetServerTime() or nil;
self.CachedIsMove = EnableMove;
self.CachedStartMoveTime = self.StartMoveTime;
UnrealNetwork.CallUnrealRPC_Multicast(self, "StartMove", self.IsMove, self.CachedStartMoveTime);
DOREPONCE(self, "IsMove")
DOREPONCE(self, "StartMoveTime")
else
UGCLogSystem.Log("[BP_MoveBase:StartMove] 设置是否移动:%sStartMoveTime = %f", tostring(EnableMove), InTime)
self.CachedIsMove = EnableMove;
self.CachedStartMoveTime = InTime;
end
end
function BP_MoveBase:OnRep_IsMove()
self.CachedIsMove = self.IsMove;
end
function BP_MoveBase:OnRep_StartMoveTime()
self.CachedStartMoveTime = self.StartMoveTime;
UGCLogSystem.Log("[BP_MoveBase:OnRep_StartMoveTime] StartMoveTime = %s", tostring(self.StartMoveTime));
end
--[[
function BP_MoveBase:ReceiveEndPlay()
self.SuperClass.ReceiveEndPlay(self);
end
--]]
function BP_MoveBase:GetReplicatedProperties()
return { "IsMove", "Lazy" }
, { "StartMoveTime", "Lazy" }
end
--[[
function BP_MoveBase:GetAvailableServerRPCs()
return
end
--]]
function BP_MoveBase:MoveTick(InDeltaTime, ServerTime)
if not (self.CachedIsMove or self.IsMove) then return end
if self.CachedStartMoveTime == nil then return end
local DeltaTime = ServerTime - self.CachedStartMoveTime;
local Loc = table.func(self.ScriptItem, "Move", self, DeltaTime, InDeltaTime)
if Loc then self:K2_SetActorLocation(Loc); end
local Rot = table.func(self.ScriptItem, "Rotate", self, DeltaTime, InDeltaTime)
if Rot then self:K2_SetActorLocation(Loc); end
end
function BP_MoveBase:GetIsMove() return self.CachedIsMove; end
function BP_MoveBase:OnClientAlready()
if IsServer then
UGCLogSystem.Log("[BP_MoveBase:OnClientAlready] 执行")
self:StartMove(true);
end
end
return BP_MoveBase;