在 Godot 中使用自定义 class

Using a custom class in Godot

我有一个用 Godot 创建的简单网络聊天程序,我用它来向高中生教授基本的加密。我想添加一个自定义的内置加密 class 以允许学生创建自己的密码。这是我创建的一个简单实现来测试 class:

class Security:
    extends Resource

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

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

在我的主脚本中,我有这段代码来初始化 class(我在顶部,在变量 space 中,在任何函数定义之前):

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

然后这是我在脚本中的一个函数:

func send_message():
    sec.encrypt()

任何时候都不会在控制台中显示打印消息。当我触发 send_message 函数时,出现以下错误:

Invalid call. Nonexistent function 'encrypt' in base 'Rederence (security.gd)'.

我在创建 class 或如何将其添加到我的脚本时做错了什么?或者我正在尝试的是不是真的可行(例如,我应该只添加一个节点,向其添加脚本并在我的场景中使用该节点)?

谢谢。

class 语法创建一个内部 class。也就是说class Security不是脚本的class。

因此,当您这样做时:

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

您没有获得您定义的安全 class。相反,它是一个包含您定义的 class 的 class。

您可以像这样实例化您的 class:

var sec = Security.Security.new()

第一个 Security 是引用脚本 class 的常量名称。而第二个Security就是你定义的内classSecurity

参见 Inner Classes


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

class_name Security extends Resource

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

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

另请注意缩进的变化。

然后 class 将是全局的(这也意味着不需要 preload),所以你可以简单地这样做:

var sec = Security.new()

同样,不需要预加载,class 是全局的。


或者,不要使用 class 名称,而是直接在脚本中使用函数。并使用预加载:

scurity.gd:

extends Resource

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

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

其他地方:

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