或许在我们游玩的过程中会有一些有一些原版的玩法不符合我们的期望,这时我们就可以对其进行一些修改,来提升我们的游戏体验。
修改的方法是在实体或者组件(想修改的内容是什么,这里就改什么)初始化的时候,对其代码逻辑进行修改,从而使这个实体或者组件达到我们的预期目标。
一、对预制体进行修改
1.1 使用到的API
如果需要修改某一特定的预制体,则使用AddPrefabPostInit
AddPrefabPostInit("name", function(inst)
if TheWorld.ismastersim then
-- 大多数的实体逻辑只在主机执行,所以加上这句
end
end)
-- 第一个位置的参数为预制体的代码
-- 第二个位置的参数为你要修改的逻辑函数
如果需要修改全部预制体,则使用AddPrefabPostInitAny
AddPrefabPostInitAny(function(inst)
if TheWorld.ismastersim then
-- 大多数的实体逻辑只在主机执行,所以加上这句
end
end)
-- 参数为你要修改的逻辑函数
1.2 具体方法
如果我们想完全修改原有的逻辑,直接使用1.1中的API即可;
如果我们只想在特定情况下修改原有的逻辑,那么我们就需要做两件事:得到原有逻辑、判断是否修改。
这里采用的方法是,将原有逻辑赋值给自己定义的参数,再判断条件是否成立,若成立则用自己的代码直接覆盖原有的逻辑,若不成立则执行原有的逻辑。
修改时要指定你要对原版代码的哪一部分进行修改,比如下面的示例制定了修改inst.Order函数,代码示例如下:
AddPrefabPostInit("name", function(inst)
if TheWorld.ismastersim then
--得到原有函数
local oldOrder = inst.Order
if not () then -- 判断是否要覆盖
-- 用新函数覆盖原有函数
inst.Order = function() -- 新函数的参数与旧函数参数相同
-- 新的代码逻辑
end
end
end
end)
二、对组件进行修改
2.1 使用到的API
AddComponentPostInit("name", function(Name)
-- 你的函数
end)
-- 第一个位置的参数为组件名称
-- 第二个位置的参数为你的函数逻辑,注意这个函数传入的参数为这个组件所返回的名字,一般是这个组件名称的首字母大写
2.2 具体方法
同修改预制体逻辑的方法相同,只需要修改需要变化的代码部分即可。这里指定的修改部分是组件的方法。所谓方法,就是跟在冒号后面的名字。
AddComponentPostInit("name", function(Name)
local oldMatherd = Name:Matherd()
function Name:MAtherd(...,...)
-- 你要修改的逻辑
-- 与预制体的hook不同的是,如果你的代码中使用到了self,则需要将self也一并传入给原有的代码,否则你修改的self将不会生效
-- 如果需要保留原有的方法,则return旧的方法
-- 如果不需要使用旧的方法,则返回需要返回的值或不返回
return oldMatherd(self, ...,...)
end
end)
三、通用全局参数修改
除了使用官方提供的API外,我们还可以自行对一些全局参数进行修改,方法与前面的方法类似:
local oldfn = GLOBAL.name.fn -- 获取并保存原有全局变量
GLOBAL.name.fn = function() -- 覆盖原有全局变量
-- 你的代码逻辑
-- 如果需要原版的代码,则返回原版的代码,否则不用
return oldfn()
end
四、其他修改
除了上面介绍到的方法外,官方还提供了许多其他的API供我们进行hook,其一般名称为Add×××PostInit,字面意思为在某物初始化时增添逻辑。