Godot:如何将纹理作为参数传递给场景

Godot: How to pass texture as a parameter to a scene

我有一个代表一种 NPC 的场景。这些 NPC 具有相同的行为和相同的动画。唯一的区别是它们看起来略有不同(例如,它们穿着不同颜色的衣服)。所以我有多个略有不同的 spritesheets PNG 文件(它们都包含完全相同数量的帧)。

如何使特定的 spritesheet 图像易于为场景实例配置?

我试过的

用这个场景结构:

我设法实现了这样的东西:

extends KinematicBody2D

export(Texture) var texture

func _ready():
    $Sprite.texture = texture

这种方法有效,但给我带来了一堆错误,例如:

scene/animation/animation_tree.cpp:828 - Condition "!track_cache.has(path)" is true. Continuing.

它也创造了一种非常糟糕的体验,因为图像不再显示在编辑器中 - 只有在实际 运行 游戏中才能看到它。

另外

实际上,并非所有这些 NPC 都具有完全相似的精灵表。他们有同名的动画,但一个 NPC 可能有 2 帧空闲动画,而另一个可能有更长的 20 帧空闲动画。

我想知道是否可以为这个 NPC 场景的每个实例同时配置 SpriteSheet 和 AnimationPlayer(为每个动画定义帧)?

How could I make the specific spritesheet image easily configurable for a scene instance?

在场景面板上使用二次单击实例,并在上下文菜单中启用“可编辑子项”。


scene/animation/animation_tree.cpp:828 - Condition "!track_cache.has(path)" is true. Continuing.

如果一切正常,这些应该通过重新加载项目消失。事实上,我认为这无关紧要,除非你正在为纹理设置动画。


It also creates a really crappy experience as the image no more shows up in the editor - one can only see it when actually running the game.

如果您希望您的代码在编辑器中 运行,请将您的代码设为 tool 脚本。

您可以通过检查 Engine.editor_hint 来检查您的代码是否 运行ning 在编辑器上。

此外,您可能想使用 setter(带 setget)。


I'm wondering whether I could configure both the SpriteSheet and AnimationPlayer (defining frames for each animation) for each instance of this NPC scene?

保持简单。尽管您可以使用 tool 脚本等,但我相信“可编辑子项”是更好、更简单的解决方案。这将允许您配置在场景面板中添加的实例。

但是,这是按实例计算的,并且仅是在场景面板中添加的实例。因此,还可以考虑创建具有修改的继承场景。您可以从文件系统面板创建继承场景,在通过二次单击场景文件打开的上下文菜单中 select“新继承场景”。