Godot 4中如何通过本地类实例访问该类本身?
在GDScript中访问本地类B的引用方案
针对你遇到的本地类实例无法获取类本身引用的问题,有两种实用的解决办法:
方法一:给本地类添加静态方法返回自身引用
这是最直接的方案,在父类A和子类B中都定义一个静态方法,用来返回类本身的引用,这样实例就能通过调用该方法拿到类对象,进而使用is_instance_of等方法:
class A: # 父类添加静态方法返回自身 static func get_class_ref(): return A class B extends A: # 子类重写静态方法返回自身 static func get_class_ref(): return B func is_subclass(sub: A, sup: A) -> bool: # 调用静态方法获取类引用,传入is_instance_of return is_instance_of(sub, sup.get_class_ref()) var a := A.new() var b := B.new() print(is_subclass(b, a)) # 输出true print(is_subclass(a, b)) # 输出false
方法二:在实例初始化时绑定类引用到元数据
如果不想修改类结构,可以在本地类的_init方法里,把类引用存入实例的元数据中,之后通过get_meta取出:
class A: pass class B extends A: func _init(): # 将B类引用存入实例元数据 set_meta("class_ref", B) func is_subclass(sub: A, sup: A) -> bool: # 从元数据获取类引用 var sup_class = sup.get_meta("class_ref") return is_instance_of(sub, sup_class) var a := A.new() # 注意父类A也需要绑定元数据,否则调用get_meta会报错 a.set_meta("class_ref", A) var b := B.new() print(is_subclass(b, a)) # 输出true print(is_subclass(a, b)) # 输出false
为什么get_class()和get_script()无效?
get_class()返回的是类的名称字符串,而is_instance_of需要的是类对象引用,字符串无法直接传入使用;get_script()返回的是包含本地类的父脚本对象,不是本地类B本身,所以也无法用于类型判断。
内容的提问来源于stack exchange,提问作者Finlay
相关产品推荐
相关产品推荐

