gpt4 book ai didi

godot - 检查一个对象是否属于给定字符串中的类名的类?

转载 作者:行者123 更新时间:2023-12-03 07:54:47 25 4
gpt4 key购买 nike

假设我有一个对象,并且在字符串中给出了一个类名
如何检查对象是否属于该类?

extends Node2D

func _ready():
var given_class_name="KinematicBody2D"
if($Obj is given_class_name):
...

最佳答案

您可以使用get_class()查找Object的类,忽略Script。在这种情况下应该足够了:

var given_class_name="KinematicBody2D"
prints($Obj.get_class() == given_class_name)

但这并不是所有情况,不是吗?也许您想检查基类,那么这不起作用:

var given_class_name="PhysicsBody2D"
prints($Obj.get_class() == given_class_name)

我们可以使用 is_class:

var given_class_name="PhysicsBody2D"
prints($Obj.is_class(given_class_name))

或者我们可以询问ClassDB:

var given_class_name="PhysicsBody2D"
var obj_class := $Obj.get_class()
prints(
obj_class == given_class_name
or ClassDB.is_parent_class(given_class_name, obj_class)
)

但是 Script 类呢?

也许你还记得,我们可以通过查看_global_script_classes来找到脚本的类名,如下所示:

var obj_class_name := $Obj.get_class()
var script:Script = $Obj.get_script()
if script != null:
obj_class_name = script.resource_path
for x in ProjectSettings.get_setting("_global_script_classes"):
if str(x["path"]) == script.resource_path:
script_class_name = str(x["class"])

上面的代码将 obj_class_name 设置为:

  • $Obj 脚本的类名(如果有)。
  • $Obj 脚本的路径(如果有)。
  • $Obj的内置类。

但是,由于我们想要检查它是否属于给定类型,所以这是不够的。因为我们还需要检查 Script 继承。事实证明,更方便地找出我们给出的名称是什么类型的类并从那里开始工作:

func is_instance_of(obj:Object, given_class_name:String) -> bool:
if ClassDB.class_exists(given_class_name):
# We have a build in class
return obj.is_class(given_class_name)
else:
# We don't have a build in class
# It must be a Script class
# Try to find the Script
var class_script:Script
for x in ProjectSettings.get_setting("_global_script_classes"):
if str(x["class"]) == obj_class_name:
class_script = load(str(x["path"]))
break

if class_script == null:
# Unknown class
return false

# Get the script of the object and try to match it
var check_script := obj.get_script()
while check_script != null:
if check_script == class_script:
return true

check_script = check_script.get_base_script()

# Match not found
return false

我们快到了。如您所知,在 GDScript 中,您可以使用脚本路径进行扩展(请参阅 Classes )。因此,我们可能会考虑脚本有效类名的资源路径...我们也可以支持:

func is_instance_of(obj:Object, given_class_name:String) -> bool:
if ClassDB.class_exists(given_class_name):
# We have a build in class
return obj.is_class(given_class_name)
else:
# We don't have a build in class
# It must be a script class
var class_script:Script
# Assume it is a script path and try to load it
if ResourceLoader.exists(given_class_name):
class_script = load(given_class_name) as Script

if class_script == null:
# Assume it is a class name and try to find it
for x in ProjectSettings.get_setting("_global_script_classes"):
if str(x["class"]) == obj_class_name:
class_script = load(str(x["path"]))
break

if class_script == null:
# Unknown class
return false

# Get the script of the object and try to match it
var check_script := obj.get_script()
while check_script != null:
if check_script == class_script:
return true

check_script = check_script.get_base_script()

# Match not found
return false

您可以加倍努力,支持变体而不是对象。然后你可以使用typeof检查它的类型...如果它是TYPE_OBJECT那么你就继续检查一个类。如果不是,您将需要一个巨大的开关来检查构建类型的名称(类似于 here ,但带有类型名称)。


对于任何试图在 GODOT 4 中执行此操作的人:ProjectSettings.get_setting("_global_script_classes") 不再起作用。请改用 ProjectSettings.get_global_class_list()

关于godot - 检查一个对象是否属于给定字符串中的类名的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76313724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com