NotifyOnNewObject
每当 UE4 通过 StaticConstructObject_Internal 构造指定类的实例时,NotifyOnNewObject 函数都会执行回调。
此函数会考虑继承关系,因此当类参数为 "/Script/Engine.Actor" 时,构造任意 AActor 对象或其派生对象都会触发回调。
回调可以返回 true,以移除(注销)该 NotifyOnNewObject 回调。
调用此函数时,传入的类不必已经存在。
参数
| # | 类型 | 说明 |
|---|---|---|
| 1 | string | 要监听其实例构造通知的类的完整名称,不含类型前缀 |
| 2 | function | 指定类的实例被构造时要执行的回调 |
回调参数
| # | 类型 | 说明 |
|---|---|---|
| 1 | UObject | 构造出的对象 |
回调返回值
| # | 类型 | 说明 |
|---|---|---|
| 1 | boolean | 如果为 true,移除当前回调,使其不再接收通知 |
示例
NotifyOnNewObject("/Script/Engine.World", function(ConstructedObject)
print(string.format("World Constructed: %s\n", ConstructedObject:GetFullName()))
end)
NotifyOnNewObject("/Script/Engine.Actor", function(ConstructedObject)
print(string.format("Actor Constructed: %s\n", ConstructedObject:GetFullName()))
-- Unregister this callback after the first actor is found,
-- meaning this current function will only be called exactly once
return true
end)
应避免的做法
请不要针对同一个类重复调用多次 NotifyOnNewObject;多个 Mod 都这样做时可能造成性能问题(实际使用中已出现过这种情况)。
例如,下面的写法:
NotifyOnNewObject("/Script/Engine.PlayerController", function(PlayerController)
PlayerController.bShowMouseCursor = true
end)
NotifyOnNewObject("/Script/Engine.PlayerController", function(PlayerController)
PlayerController.bForceFeedbackEnabled = false
end)
NotifyOnNewObject("/Script/Engine.PlayerController", function(PlayerController)
PlayerController.InputYawScale = 2.5
end)
NotifyOnNewObject("/Script/Engine.PlayerController", function(PlayerController)
PlayerController.InputPitchScale = -2.5
end)
NotifyOnNewObject("/Script/Engine.PlayerController", function(PlayerController)
PlayerController.InputRollScale = 1.0
end)
应合并为:
NotifyOnNewObject("/Script/Engine.PlayerController", function(PlayerController)
PlayerController.bShowMouseCursor = true
PlayerController.bForceFeedbackEnabled = false
PlayerController.InputYawScale = 2.5
PlayerController.InputPitchScale = -2.5
PlayerController.InputRollScale = 1.0
end)
原文:docs/lua-api/global-functions/notifyonnewobject.md · 固定提交 560411f18512 · 来源与 MIT 许可