如何在Godot 4.0游戏引擎中实现可组合的角色/技能系统?

2023-12-24

我目前正在使用 Godot 尝试 MOBA 风格游戏的原型。

我正在努力寻找一种管理角色及其技能的方法。

所有角色都将具有相似的属性(姓名、生命值、奔跑速度、力量等)。然而,所有角色的技能都会有所不同(尽管有些角色非常相似,例如基于投射物的技能将具有诸如:距离、速度、纹理/视觉效果等内容),这些技能应该是可配置的,但在可能的情况下允许可重复使用的行为。

我不知道如何构建一些可以进行简单维护/编程的东西。

我尝试将资源用于技能和角色。但是,看起来资源可能不是可行的方法,因为我似乎无法为每个资源实例提供不同的行为/脚本。

IE: 技能资源

名称:冰霜箭 速度:20 纹理:frostarrow.png

但是,我不认为我可以附加代码,或者如果可以的话,我还没有找到如何附加代码。

我也尝试过 PackedScene。虽然我可以使用场景使用自定义代码,但我无法弄清楚如何从打包场景中访问技能名称。

然后,对于角色。我认为对于这个,我可以使用资源。 我会有一个名称、Sprites/3D 模型等等。我希望有一种方法可以为我的角色分配技能。

通过我的玩家控制器,能够访问这些技能并将其显示在屏幕上并在需要时调用它们。


出于本答案的目的:

  • “物”指角色、武器和射弹。
  • “包裹”指的是组合关系,当我说一个对象包裹另一个对象时,意味着它将它作为一个组件。

一般的答案是会使用资源。更具体地说,您将使用自定义资源和场景。


场景堆栈

我将从场景堆栈开始,因为这是其中更清晰的部分。这些都是游戏源码中存在的场景:

  • 资源:在其他软件中创建,具有网格、精灵、材质、着色器、骨骼、动画等。
  • 道具/皮肤:包裹资产。添加碰撞器、骨骼附件和任何其他辅助节点。
  • 特工/角色:包裹道具。添加行为(脚本)。角色控制器就是其中之一。

现在,如果你想改变它的行为方式,你需要一个不同的代理。如果你想改变它的外观,你需要一个不同的道具。

因此,可以有多个具有相同行为但不同外观的事物(由 prop 给出),并且可以有多个具有相同外观但不同行为的事物(由代理给出)。


场景与自定义资源的关系

然而,我上面描述的内容存在于场景树中。事物并不总是存在于场景树中(有时它们存在于菜单或库存容器中)。在那里您需要自定义资源。

将有两种自定义资源类,我将回到这一点......我在这里所说的可以适用于两者。

自定义资源类:

  • 拥有您所需的有关该事物的数据的属性。
  • Have PackedScenes 属性,它们可以实例化。
  • 有一个方法来实例化PackedScenes,它还将实例的属性设置为自定义资源实例本身(这是依赖注入和控制反转的一种形式)。

因此,可以有多个具有相同行为但配置不同的事物(由自定义资源给出)。


有时自定义资源会引用多个PackedScenes。以下是一些案例:

  • 自定义资源还可以包括PackedScene在角色/代理内部实例化为道具/皮肤。
  • 有时您需要多个选项来实例化场景树中的某个事物。例如,您可能有不同的PackedScene在装备时实例化武器,而不是在世界中掉落时实例化武器。
  • 当角色由玩家控制时,您可能会使用一个代理/角色场景,而当角色是机器人时,您可能会使用另一个场景,尽管它们在概念上是相同的。

如果你不认为场景才是问题所在,那就更好了。自定义资源就是问题所在,而场景只是您在需要存在于场景树中时使用的包装器......并且您可能会在不同的场合使用不同的包装器。

当然,如果某些包装器是通用的,则不需要在自定义资源中配置属性。同样,自定义资源不需要具有实例化每种包装场景的方法......只需执行您实际需要的即可。


自定义资源栈

在实践中,您可能需要两种自定义资源类:

  • 通用资源。它具有所有同类事物之间共有的所有数据。
  • 具体资源。包装通用资源,并拥有特定事物所需的所有数据。

例如,一种通用资源可能代表一种武器模型,并且它具有弹药容量等内容。但游戏中可以有多种同型号的武器。特定资源代表其中一种武器,它具有诸如当前拥有的弹药量之类的信息。

您将希望通用资源具有PackedScene代理/角色的,因为他们的行为都是相同的。但具体资源要有PackedScene道具/皮肤的属性,因为每一个都可能被定制为看起来不同。

另外,您要注入到场景实例中的自定义资源是特定资源。这样,场景就可以访问所有数据(因为特定资源具有对通用资源的引用),并且可以控制特定数据(例如,它将更新其弹药数量)。您可能不想在运行时更改通用资源的数据。

此外,一般资源将probably作为资源文件存在于游戏源中。但特定的数据是在运行时创建的(您可以在保存游戏时保存它们的数据,当然也可以在加载游戏时重新创建它们)。事实上,您可能希望在通用资源脚本中包含一个方法来创建特定资源的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Godot 4.0游戏引擎中实现可组合的角色/技能系统? 的相关文章

  • 【Godot】对 Godot 节点设计的思考

    对 Godot 中节点设计的思考 单个节点的功能设计的想法 xff0c 体会 Godot 的设计思想 低耦合 设计单个节点可复用的节点时 xff0c 调用方法尽量只对当前节点可获取到的变量或方法进行使用 xff0c 比如我写一个可以控制 K
  • 【Godot】行为树(一)了解与设计行为树代码

    行为树介绍 行为树是个节点树 xff0c 父节点通过不断遍历子节点 xff0c 根据不同类型的节点执行不同的分支 最终调用叶节点执行功能 行为树也不难理解 xff0c 他就像代码逻辑一样 xff0c 只是用节点的方式展现出来 xff0c 而
  • 【Godot 4.0】一个简单的匿名方法的使用lambda

    Godot 4 0 beta3 Godot 4 0 中添加了 lambda 表达式 xff0c 匿名方法等很多方便的特性 xff0c 这里我写个用于扫描目录下所有文件的功能 可以看到代码非常简洁 span class token keywo
  • Godot Engine:GDScript 4.X中语法的变化(2020年8月4日 更新)

    文章目录 4 X版 GDScript范例支持注解属性 xff08 Properties xff09 的定义格式await关键字代替yield加入super关键字去除了多级调用问题小结 4 X版 GDScript范例 支持注解 从4 x开始
  • Godot 4 源码分析 - 文件读入编码处理

    今天需要读入xml文件进行处理 结果读入一个带中文的文件时 出错了 当然程序还能运行 但编译器一直报错 而且XML解析也不正确 单步调试发现读入的内容出现乱码 具体逻辑 String FileAccess get as text bool
  • 关于在windows使用msys2 + mingw + gcc/g++ 编译godot的笔记

    关于在windows使用msys2 mingw gcc g 编译godot的笔记 编译参数 1 target release debug release debug 2 多线程参数 j数字 3 profile是自定义构建参数 可以启用或者禁
  • 如何创建没有 setter 函数的 getter 函数?

    我的脚本中有多个导出的变量 每当更改一个变量时 我想调用一个通用的 getter 并让值自动设置 tool export float var sample1 setget smthn changed export float var sam
  • 合并多个精灵节点?

    例如 假设我有 2 个精灵节点 但也可以超过 2 个 如下所示 每个人都有自己独立的图像我想要的是将它们组合起来并用单个图像创建一个新的精灵节点 在工具模式下 like this 也许可以通过使用Image 毫无疑问涉及计算 或者也许使用一
  • 如何检测 Godot 中的碰撞?

    我有3个场景 一个名为 KinematicBody2D tscn 的 KinematicBody2D 节点 该场景是一个玩家在屏幕上从左向右移动 我还有一个名为 mob tscn 的场景 它是一个igidbody2d节点 这个场景只有精灵和
  • (Godot 引擎)用 Tilemap 瓷砖填充 2D 多边形

    我在 Godot 引擎中遇到一个无法解决的问题 怎么可能 在代码中 用图块填充 Polygon2D 区域 我尝试过获得点位置 使用 2D for 循环遍历线的顶点 但我无法理解这一点 这是我期待的结果的模型 我有解决方案 有一点 hacky
  • 在 Area2D 中覆盖 KinematicBody2D 运动?

    I m trying to create a windy area within which the player would be pushed continuously to the left lt 到目前为止 这就是我想出的Windy
  • 如何在 GDScript 中实现结构?

    GDScript 中是否有相当于 C 结构 类的东西 例如 struct Player string Name int Level 戈多3 1 1gdscript不支持structs 但使用可以实现类似的结果classes dict or
  • Godot 监听来自同一场景的多个实例的信号

    我有以下场景 玩家 敌人 攻击 当攻击与敌人发生碰撞时 敌人会发出 onHit 信号 播放器监听该信号并反弹 这一切都运行良好 但现在如果我复制敌人 因此有多个敌人场景 我如何收听所有敌人的信号 有没有办法获取场景的所有实例并连接到它们的所
  • 在 godot 游戏引擎中使用不同的编程语言?

    我想要将不同的编程语言绑定到 Godot 游戏引擎 有关于这个主题的指导文件或视频吗 例如 这个项目是如何完成的 戈多锈 https github com godot rust godot rust 如果我能学习基础知识 我就能成功地用不同
  • 如何获取另一个场景godot中的节点?

    我正在制作一个具有多个场景的游戏 需要有 get node 来自另一个场景的节点 变量 并且我不知道如何从另一个场景获取节点 如果我理解正确的话 您想连接到来自另一个场景中的节点的信号 直接方法会起作用 const bullet prelo
  • 如何在戈多中使刚体跳跃而不赋予其飞行能力

    我本来会使用运动体 但我想将现实生活中的物理添加到我的 2d 对象中 但似乎我可以通过多次按向上键来飞行 extends RigidBody2D var velocity Vector2 ZERO const GRAVITY 35 cons
  • Godot:调用外部方法

    经过大量谷歌搜索 我仍然不明白什么可能是一个简单的解决方案 场景 主要 包含一个 TileMap Grid 并附有一个脚本 Grid gd 场景 玩家 包含一个 KinematicBody2D Player 及其附加脚本 Player gd
  • 如何克服 Godot 将按钮字体更改为默认颜色的问题?

    我正在使用 Godot 4 我在容器中手动创建了很多按钮 我在主场景中设置了一个颜色变量 tempcol 当我单击带有 tempcol 设置的按钮时 比如 Color Red 按钮的字体颜色更改为白色 似乎是默认字体颜色 但是当我单击另一个
  • 同一节点的碰撞检测和重叠检测? [第2部分]

    的延续上一个问题 https stackoverflow com questions 71608423 collision detection and overlapping detection in same node 71622366
  • 关闭 Godot 中的游戏

    我正在使用 Godot 创建网页游戏 为了关闭游戏 我尝试使用 get tree quit 如果我在 IDE 上使用它 它就可以工作 当我在我的服务器上尝试它时 导出项目后 它不起作用 我确信导出设置没问题 我怎样才能关闭游戏 并且 如何添

随机推荐