首页 > 解决方案 > 编辑器中设置的导出值在代码中显示为零

问题描述

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

这是脚本,我是否在某处犯了错误,这是我第二次实际尝试使用资源,但这可能很烦人。

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

标签: godot

解决方案


这在过去让我望而却步。然而,通过向我提供资源,OS.get_ticks_usec()我弄清楚了这些变量的时间安排。并在我完成步骤的地方更新了答案:here。除了节点,不是资源,但前三个步骤是相同的​​。

所以,当它运行时:

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

Godot 尚未设置导出的值Base_hp。它具有您未指定的默认值。您可以给它一个默认值,如下所示:

export(int) var Base_hp = default_value

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

使用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)

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


推荐阅读