在 Godot 中使用自定义类

Tri*_*tan 8 gdscript godot

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

class Security:
    extends Resource

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

    func encrypt():
        print("Encrypting.")
Run Code Online (Sandbox Code Playgroud)

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

const Security = preload("res://scripts/security.gd")
var sec = Security.new()
Run Code Online (Sandbox Code Playgroud)

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

func send_message():
    sec.encrypt()
Run Code Online (Sandbox Code Playgroud)

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

无效调用。基础“Rederence (security.gd)”中不存在函数“加密”。

我在创建类时做错了什么,或者我如何将它添加到我的脚本中?或者我正在尝试的操作实际上并不可行(例如,我应该添加一个节点,向其添加脚本并在场景中使用该节点)吗?

谢谢。

The*_*aot 7

class语法创建一个内部类。那class Security不是脚本的类别。

因此,当您执行此操作时:

const Security = preload("res://scripts/security.gd")
Run Code Online (Sandbox Code Playgroud)

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

你可以像这样实例化你的类:

var sec = Security.Security.new()
Run Code Online (Sandbox Code Playgroud)

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

请参阅内部类


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

class_name Security extends Resource

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

func encrypt():
    print("Encrypting.")
Run Code Online (Sandbox Code Playgroud)

另请注意缩进的变化。

那么这个类将是全局的(这也意味着不需要preload),所以你可以简单地这样做:

var sec = Security.new()
Run Code Online (Sandbox Code Playgroud)

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


或者,不要使用类名,而是将函数直接放在脚本上。并使用预载:

安全性.gd

extends Resource

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

func encrypt():
    print("Encrypting.")
Run Code Online (Sandbox Code Playgroud)

别的地方

const Security = preload("res://scripts/security.gd")
var sec = Security.new()
Run Code Online (Sandbox Code Playgroud)