在Godot中使用自定义类

7

我在Godot中创建了一个简单的网络聊天程序,用于向高中学生教授基本的加密知识。我希望添加一个自定义的加密类,以便学生可以创建自己的密码。这是我创建的一个简单实现,用于测试这个类:

class Security:
    extends Resource

    func _init():
        print("Started.")

    func encrypt():
        print("Encrypting.")

在我的主脚本中,我有以下代码来初始化这个类(我将其放在顶部,在任何函数定义之前的变量空间中):
const Security = preload("res://scripts/security.gd")
var sec = Security.new()

接下来是我脚本中的一个函数:

func send_message():
    sec.encrypt()

在控制台中从未出现任何打印消息。当我触发send_message函数时,出现以下错误:

调用无效。 在基类'Reference (security.gd)'中不存在'encrypt'函数。

我在创建类或将其添加到脚本中的方式上有什么问题吗?还是我所尝试的不可行(例如,我应该只添加一个节点,在其中添加一个脚本并在场景中使用该节点)?

谢谢。

1个回答

6

class语法可以创建内部类。也就是说,class Security不是脚本的类。

因此,当你执行以下操作时:

const Security = preload("res://scripts/security.gd")

您没有获得您定义的安全类,而是包含您定义的类的类。

您可以按照以下方式实例化您的类:

var sec = Security.Security.new()

第一个Security是指向脚本类的常量名称。第二个Security是您定义的内部类Security

请参阅内部类


我建议您使用class_name语法定义您的类:

class_name Security extends Resource

func _init():
    print("Started.")

func encrypt():
    print("Encrypting.")

同时请注意缩进的变化。

然后这个类将是全局的(这也意味着不需要 preload),所以你只需要这样做:

var sec = Security.new()

再次强调,不需要预加载,该类是全局的。


另一种方法是不使用类名,而是直接在脚本上使用函数。并使用预加载:

scurity.gd

extends Resource

func _init():
    print("Started.")

func encrypt():
    print("Encrypting.")

在别处:

const Security = preload("res://scripts/security.gd")
var sec = Security.new()

谢谢,这正好回答了我的问题。 - Tristan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接