在 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()
我有一个用 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()