Godot GDScript 键入:无效类型错误

问题描述 投票:0回答:1

最基本的例子:

world.tscn(主场景)

extends Node2D
const MYLIST = preload("res://my_list.tscn")

func _ready() -> void:
    var my_list = MYLIST.instantiate()
    add_child(my_list)
    my_list.initialization(["one", "two", "three"])

和 my_list.tscn

extends Node2D
@onready var item_list: ItemList = $ItemList

func initialization(entries: Array[String]):
    for entry in entries:
        item_list.add_item(entry)


这给了我运行时错误:函数“初始化”中的类型无效。参数 1 的数组(数组)与预期的类型化数组参数的元素类型不同。

我传递给 my_list.initialization 的参数显然是一个 Array[String] 如果我从 func 声明中删除类型提示,它会按预期工作。

有人可以解释一下这里出了什么问题吗?谢谢!

godot typing gdscript
1个回答
0
投票

我不知道你使用的是哪个版本的Godot。

我可以看出它是 Godot 4,因为你输入了

Array
s,但细节因版本而异。

如果我没记错的话,在 Godot 4.0 中,这会默默失败(没有错误,但你得到一个空数组),而在 Godot 4.2 之后,它似乎工作正常。因此,可能是 4.1?


Godot 没有类型化

Array
文字(尽管在最近的版本中,它将扫描数组的内容以查找该文字是否与类型化
Array
兼容)。

因此,

Array
给出的
["one", "two", "three"]
不是
Array[String]
,而只是一个
Array
,而你的Godot版本可能不会检查它是否兼容。


所以,除了尝试更新的版本之外。我为您提供了三种可能的解决方法:

  • 将参数恢复为

    Array
    :

    如果您不使用类型化数组

    entries: Array
    ,则不会出现此问题。但是您会丢失类型信息。

  • 在另一行中声明

    Array[String]

    如果您将变量声明为

    Array[String]
    它可能会起作用:

    var tmp:Array[String] = ["one", "two", "three"] 
    my_list.initialization(tmp)
    
  • 将参数声明为

    PackedStringArray
    :

    如果你像这样声明参数:

    entries: PackedStringArray
    ,Godot应该能够自动进行转换。 这就是我记得当我遇到问题时所做的。

© www.soinside.com 2019 - 2024. All rights reserved.