godot - 编辑器中设置的导出值在代码中显示为零
问题描述
我有这个漂亮的脚本,它是一个允许我制作多个单位的资源,在脚本/资源中我有它计算单位损坏、健康等的统计数据,但我将基本统计数据设置为导出值,所以我添加它们在编辑器中,但无论出于何种原因,脚本它自己都会忽略导出值并将它们视为零,但我知道一些导出值有效,因为当我打印时说 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
解决方案
这在过去让我望而却步。然而,通过向我提供资源,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 设置导出值之前运行。并且没有_ready
on 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)
这至少可以让你把它当作一个变量。除非它在您读取它时重新计算值,并且设置它是浪费精力。
推荐阅读
- sql - SQL 小数位前 1 位
- mysql - 有条件问题的 SQL 来获取数据
- python - Python - 如果用户试图中途停止执行,有没有办法让函数优雅地清理?
- c# - 在用户键入类似于来自 wpf 的 PreviewKeyDown 时修改条目的 Text 属性
- android - Zebra RFID getBeeperVolume 抛出 RFID_API_SUCCESS
- vue.js - 在 vue2-editor 中使用 quill-image-resize-module 不会实现 ImageResize
- java - jasper 报告中未显示数据,但显示元数据
- mysql - 如何从多个 id 的字符串中按 id 选择行
- python - 我的 pygame rects 给出的 rect 参数无效错误
- django - 如何在 Djnago 中从多对多关系表中获取数据?