【问题标题】:Using a custom class in Godot在 Godot 中使用自定义类
【发布时间】:2021-08-24 12:16:40
【问题描述】:

我在 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 函数时,我收到以下错误:

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

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

谢谢。

【问题讨论】:

    标签: godot gdscript


    【解决方案1】:

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

    因此,当您这样做时:

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

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

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

    var sec = Security.Security.new()
    

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

    Inner Classes


    我建议你用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()
    

    【讨论】:

    • 谢谢,这正好回答了我的问题。
    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多