【问题标题】:How to get which node invoked getter function?如何获取哪个节点调用了getter函数?
【发布时间】:2022-11-28 15:21:18
【问题描述】:

是否可以获取哪个节点/对象调用了setter函数?

我为什么要问这个?

atm 我有自定义动画播放器:

tool
extends Animation

func track_insert_key(track_idx : int, time : float, key, transition : float = 1) -> void:
    var track_path=track_get_path(track_idx)
    var key_node=<some_function>.get_node(track_path)
    
    if(key_node.get_class()=="some_node"):
         # do something before setting keyframe

    .track_insert_key(track_idx, time, key, transition)

但如果我能拦截调用者,我就可以消除自定义动画播放器的需要 getter 函数,可能是这样的:

tool
extends Node2D

var custom_variable=0 setget ,get_custom_variable

func get_custom_variable(by):
    print("called by=",by)
    if(by.get_class()=="Animation"):
       # do something before setting keyframe

那么这样的事情可能吗?或者一些类似的方法可以消除自定义AnimationPlayer的需要?

【问题讨论】:

    标签: godot gdscript


    【解决方案1】:

    不完全是,但我们可以接近。

    我们可以像这样迭代堆栈跟踪:

    var stack := get_stack()
    for item in stack:
        prints(item)
    

    get_strack 函数返回一个 Array,调用堆栈的每个条目都包含一个 Dictionary,具有以下键:

    • "function":调用方法的名称。
    • "line":呼叫的线路号码。
    • "source":调用脚本的路径。

    所以,不,我们没有得到正在调用的实例。

    顺便说一句,get_stack 返回的第一个条目(索引0)对应于对get_stack 的调用。所以你想要第二个条目(索引1)。此外,如果您的脚本不是从脚本调用的(例如,引擎正在调用 _ready_process 之类的方法,或者正在从 yield 恢复),结果将只有一个条目:

    var stack := get_stack()
    var path_of_the_script := ""
    if stack.size() == 1:
        prints("called from external code")
    else:
        path_of_the_script = stack[1].source
    

    除此之外,我们可以查看 ProjectSettings.get_setting("_global_script_classes") 以找出类的名称(如果它是带有 class_name 的脚本):

    var stack := get_stack()
    var path_of_the_script := ""
    if stack.size() == 1:
        prints("called from external code")
    else:
        path_of_the_script = stack[1].source
        var class_id := path_of_the_script
        if ProjectSettings.has_setting("_global_script_classes"):
            for x in ProjectSettings.get_setting("_global_script_classes"):
                if x.path == path_of_the_script:
                    class_id = x.class
    
        prints("called from:", class_id)
    

    这将是调用您的方法的脚本类的名称(如果有的话)。希望这足够有用。

    【讨论】:

    • 我还没有用 tool 脚本测试过这个。我希望这不是问题。也可能只是检查 get_stack 的大小就足以区分手头的用例。
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多