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

170 lines
6.5 KiB
Lua

ParticleConfig = ParticleConfig or {}
ParticleConfig.EParticleType = {
AddBuff = 1;
GodOfWar = 2;
GodOfWarSelf = 3;
Ice = 4;
Explosion = 5;
}
ParticleConfig.ParticleInfoList = {
[ParticleConfig.EParticleType.AddBuff] = {
Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/BuffFx/P_AddBuff2.P_AddBuff2');
Position = { X = 0, Y = 0, Z = -85 };
AttachName = "";
};
[ParticleConfig.EParticleType.GodOfWar] = {
Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/GodOfWar/P_GodOfWar.P_GodOfWar');
Position = { X = 0, Y = 0, Z = -85 };
AttachName = "";
Rot = {Roll = 0., Pitch = 0., Yaw = -90};
Scale = 2;
IsFaseToLocalPlayer = true;
IsZeroYaw = true;
};
[ParticleConfig.EParticleType.GodOfWarSelf] = {
Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/GodOfWar/P_GodOfWar_Self.P_GodOfWar_Self');
Position = { X = 0, Y = 0, Z = -85 };
AttachName = "";
Scale = 2;
IsZeroYaw = true;
};
[ParticleConfig.EParticleType.Ice] = {
Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/GodOfWar/P_Ice.P_Ice');
Position = { X = 0, Y = 0, Z = 110 };
AttachName = "";
Scale = 1.5;
IsZeroYaw = true;
AttachLocation = EAttachLocation.SnapToTarget;
};
-- 爆炸
[ParticleConfig.EParticleType.Explosion] = {
Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/BuffFx/P_Explosion.P_Explosion');
Scale = 2;
};
}
ParticleConfig.ParticleInst = {}
ParticleConfig.ClientPlayParticleFuncName = "ClientPlayParticle"
ParticleConfig.AddParticleAttachPlayerFuncName = "ClientFXAttachPlayer"
---@param InAttachActor AActor* 传入进行网络同步的Actor 最好是GameState比较快而且时序上不会出现差错
function ParticleConfig.Init(InAttachActor)
ParticleConfig.AttachActor = InAttachActor
if UGCGameSystem.IsServer() then
else
InAttachActor[ParticleConfig.ClientPlayParticleFuncName] = function(AttachActor, InParticleType, Pos, Rot, Scale)
ParticleConfig.AddParticleFromPosAndRot(InParticleType, Pos, Rot, Scale)
end
InAttachActor[ParticleConfig.AddParticleAttachPlayerFuncName] = function(AttachActor, InPawn, ParticleType)
ParticleConfig.AddParticleAttachPlayer(InPawn, ParticleType)
end
-- 预加载
ParticleConfig.PreLoad()
end
end
---@param Scale float
function ParticleConfig.ClientPlayParticle(InPlayerKey, InParticleType, Pos, Rot, Scale)
if UGCGameSystem.IsServer() then
UGCSendRPCSystem.ActorRPCNotify(InPlayerKey, ParticleConfig.AttachActor, ParticleConfig.ClientPlayParticleFuncName, InParticleType, VectorHelper.ToLuaTable(Pos), VectorHelper.RotToLuaTable(Rot), Scale)
else
ParticleConfig.AddParticleFromPosAndRot(InParticleType, Pos, Rot, Scale)
end
end
--- 用于服务器调用,发送RPC到客户端播放粒子
function ParticleConfig.ClientAddParticleAttachPlayer(InPlayerKey, InPawn, ParticleType)
if UGCGameSystem.IsServer() then
UGCSendRPCSystem.ActorRPCNotify(InPlayerKey, ParticleConfig.AttachActor, ParticleConfig.AddParticleAttachPlayerFuncName, InPawn, ParticleType)
else
ParticleConfig.AddParticleAttachPlayer(InPawn, ParticleType)
end
end
function ParticleConfig.PreLoad()
for ParticleType, ParticleInfo in pairs(ParticleConfig.ParticleInfoList) do
UGCSystemLibrary.AsyncLoadAsset(ParticleInfo.Path, function(Particle)
ParticleConfig.ParticleInst[ParticleType] = Particle
end, nil, true)
end
end
function ParticleConfig.GetParticleInst(InParticleType)
if ParticleConfig.ParticleInst[InParticleType] == nil then
ParticleConfig.ParticleInst[InParticleType] = UGCSystemLibrary.LoadAsset(ParticleConfig.ParticleInfoList[InParticleType].Path)
end
return ParticleConfig.ParticleInst[InParticleType]
end
--- 在玩家网格中心生成粒子
function ParticleConfig.AddParticleAttachPlayer(InPawn, ParticleType)
if UE.IsValid(InPawn) then
local Position = VectorHelper.VectorZero()
local ComposeRotators = VectorHelper.RotZero()
local Rot = InPawn:K2_GetActorRotation()
local Scale = 1
local AttachLocation = EAttachLocation.SnapToTarget
if ParticleConfig.ParticleInfoList[ParticleType].Position then
Position = ParticleConfig.ParticleInfoList[ParticleType].Position
end
if ParticleConfig.ParticleInfoList[ParticleType].Scale then
Scale = ParticleConfig.ParticleInfoList[ParticleType].Scale
end
if ParticleConfig.ParticleInfoList[ParticleType].Rot then
ComposeRotators = ParticleConfig.ParticleInfoList[ParticleType].Rot
end
if ParticleConfig.ParticleInfoList[ParticleType].AttachLocation then
AttachLocation = ParticleConfig.ParticleInfoList[ParticleType].AttachLocation
end
if ParticleConfig.ParticleInfoList[ParticleType].IsFaseToLocalPlayer then
local CameraManager = UGCSystemLibrary.GetLocalPlayerController().PlayerCameraManager
local CameraPos = CameraManager:K2_GetActorLocation()
Rot = KismetMathLibrary.MakeRotFromX(VectorHelper.Sub(CameraPos, InPawn:K2_GetActorLocation()))
if ParticleConfig.ParticleInfoList[ParticleType].IsZeroYaw then
Rot.Yaw = 0;
end
end
return GameplayStatics.SpawnEmitterAttached(
ParticleConfig.GetParticleInst(ParticleType),
InPawn.Mesh,
ParticleConfig.ParticleInfoList[ParticleType].AttachName,
Position,
KismetMathLibrary.ComposeRotators(InPawn:K2_GetActorRotation(), ComposeRotators),
{ X = Scale, Y = Scale, Z = Scale },
AttachLocation,
false
)
end
return nil
end
function ParticleConfig.AddParticleFromPosAndRot(InParticleType, Pos, Rot, Scale)
if Rot == nil then
Rot = Rotator.New(0, 0, 0)
end
if Scale == nil then
Scale = 1
end
if ParticleConfig.ParticleInfoList[InParticleType].Scale then
Scale = ParticleConfig.ParticleInfoList[InParticleType].Scale * Scale
end
GameplayStatics.SpawnEmitterAtLocation(UGCGameSystem.GameState, ParticleConfig.GetParticleInst(InParticleType), Pos, Rot, Vector.New(Scale, Scale, Scale), true)
end
function ParticleConfig.DestroyParticle(InParticleInst)
if UE.IsValid(InParticleInst) then
InParticleInst:K2_DestroyComponent()
end
end