在编辑器中设置的导出值在代码中显示为零

A export value set in the editor shows its a zero in the code

我有这个漂亮的脚本,它是一种允许我制作多个单位的资源,在 script/resource 我用它计算单位伤害、健康等的统计数据,但我设置了基本统计数据作为导出值,所以我将它们添加到编辑器中,但出于某种原因,脚本自身会忽略导出值并将它们视为零,但我知道某些导出值有效,因为当我打印时说 base_hp 它打印正确但是当我尝试只打印 hp 它只有 5 时,(似乎最后添加的 5 有效,至少对我来说有意义)但是整数不记得除非我使它成为调用它们的函数 return 正确。

这是脚本,我是不是哪里出错了这是我第二次实际尝试使用资源,但这可能很烦人。

extends Resource
class_name Monster

export(Texture) var front_sprite
export(Texture) var back_sprite
export(String) var name
export(int) var level
# Gets the types and gives the monster a type
export(TypeData.types) var type_1 = TypeData.types.none
export(TypeData.types) var type_2 = TypeData.types.none
# Base stats the limit the amount of points a monster can get
export(int) var Base_hp
export(int) var Base_attack
export(int) var Base_special_attack
export(int) var Base_defence
export(int) var Base_special_defence
export(int) var Base_speed
# The avaliable moves the monster can use to attack or other actions
export(Array,Resource) var move_slot = [null,null,null,null]
# The monsters stats based on the level
var hp  = ((float(Base_hp * level) / 100.0) + 5.0)
var attack = ((float(Base_attack * level) / 100.0) + 5.0)
var special_attack = ((float(Base_special_attack * level) / 100.0) + 5.0)
var defence = ((float(Base_defence * level) / 100.0) + 5.0)
var special_defence = ((float(Base_special_defence * level) / 100.0) + 5.0)
var speed = ((float(Base_speed * level) / 100.0) + 5.0)
# So when the monster takes damage we can takeaway the hp
var current_hp = hp

过去我没有想到这一点。但是,通过向 OS.get_ticks_usec() 提供资源,我弄清楚了这些变量的时间安排。 并更新了我检查步骤的答案:。除了是节点,不是资源,前三步是一样的

所以,当这个 运行s:

var hp  = ((float(Base_hp * level) / 100.0) + 5.0)

Godot还没有设置Base_hp的导出值。它有它的默认值,您没有指定。你可以像这样给它一个默认值:

export(int) var Base_hp = default_value

我的第一直觉是使用 _init,但是在 Godot 设置导出值之前,这也会 运行。 Resource 上没有 _ready,也没有任何方便的信号、通知或覆盖方法。

使用 setget 来跟踪初始化的导出变量会过大而且容易出错。

这让我们只需为这些变量制作 getter 方法:

func get_hp(): return ((float(Base_hp * level) / 100.0) + 5.0)

或者做一些额外的工作:

var hp setget , get_hp; func get_hp(): return ((float(Base_hp * level) / 100.0) + 5.0)

这至少会让你把它当作一个变量来对待。除非它在您读取时重新计算值,并且设置它是浪费精力。