You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取调用getter/setter函数的节点对象?

问题:能否获取调用setter/getter函数的节点/对象?

疑问背景

我目前使用自定义动画播放器处理关键帧插入前的逻辑,代码如下:

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"):
         # 插入关键帧前执行自定义逻辑
         pass

    .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"):
       # 插入关键帧前执行自定义逻辑
       pass

请问是否存在此类实现方式,或无需自定义AnimationPlayer的替代方案?


回答

Godot官方并没有提供直接在getter/setter函数中获取调用者对象的API,你期望的通过参数传递调用者的写法无法直接实现。

给你两个可行的替代方案:

方案一:调用栈解析(hack方式,谨慎使用)

可以通过Engine.get_stack_trace()获取当前调用栈,遍历栈帧判断是否来自Animation相关逻辑。这种方法依赖栈帧的函数名称,可能会在Godot版本更新后失效,仅适合临时场景:

tool
extends Node2D

var custom_variable = 0 setget , get_custom_variable

func get_custom_variable():
    var stack = Engine.get_stack_trace()
    for frame in stack:
        # 检查栈帧中是否包含Animation相关的调用
        if "Animation.track_insert_key" in frame.function or "AnimationPlayer" in frame.function:
            print("调用来自Animation相关逻辑")
            # 执行你的自定义逻辑
            pass
    return custom_variable

方案二:保留自定义Animation扩展(更可靠)

你最初的自定义Animation方案其实是更稳定可控的选择。直接在track_insert_key方法中获取目标节点并处理逻辑,不会受版本更新影响,逻辑也更清晰,推荐继续使用这种方式。


内容的提问来源于stack exchange,提问作者cak3_lover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:30:44