【问题标题】:Godot: How to pass texture as a parameter to a sceneGodot:如何将纹理作为参数传递给场景
【发布时间】:2022-02-17 20:58:33
【问题描述】:

我有一个代表一种 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 帧的空闲动画,而另一个 NPC 可能有更长的 20 帧空闲动画。

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

【问题讨论】:

    标签: textures godot gdscript


    【解决方案1】:

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

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


    scene/animation/animation_tree.cpp:828 - 条件“!track_cache.has(path)”为真。继续。

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


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

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

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

    另外,您可能想要使用 setter(使用 setget)。


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

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

    但是,这是每个实例且仅在场景面板中添加的实例。因此,还要考虑使用修改创建继承的场景。您可以从文件系统面板创建继承的场景,在通过二次单击场景文件打开的上下文菜单中选择“新建继承的场景”。

    【讨论】:

    • 谢谢。可编辑的孩子似乎确实是一种更好的方法。我试着把它变成一个工具脚本,它似乎也可以工作,但是在编辑器中运行所有这些代码感觉不太对劲。该错误可能确实无关,尽管重新启动没有帮助。一定是在摆弄的时候搞砸了。将不得不恢复到较早的状态并重新创建这些场景。
    • 是的,使用继承的实例效果更好。感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多