NotifyOnNewObject

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 许可