我在 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)”中不存在函数“加密”。
我在创建类时做错了什么,或者我如何将它添加到我的脚本中?或者我正在尝试的操作实际上并不可行(例如,我应该添加一个节点,向其添加脚本并在场景中使用该节点)吗?
谢谢。
该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)