如何获取调用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
相关产品推荐
相关产品推荐

