自定义行为:使用事件创建自定义行为
与场景类似,自定义行为是通过事件创建的。每个行为是一个自定义行为,包含可以被任何人编辑的事件。
提示
如果您以前从未制作过扩展,请首先阅读函数的工作原理,因为这是一个重要概念,用于理解自定义行为。
行为事件像场景事件一样在每一帧运行。其主要区别在于行为聚焦于其所附加的对象。行为逻辑中仅能使用附加对象。
虽然这可能看起来具有限制性,实际上它使得行为可以在各种项目中使用,因为它们不与特定场景对象绑定。
社区扩展中选择行为是因为它们能够在许多游戏中发挥作用。当创建适用于您的游戏的行为时,并不一定需要遵循这一标准。行为可用作通过以下方式组织事件的一种方式:
- 仅为某些对象添加动作和条件(而独立函数将显示为所有对象)
- 将与特定对象相关的所有逻辑聚合在一个位置
- 明确定义配置细节(通过可见属性)和对象状态(通过隐藏属性),与变量(列表中列出而没有明确区分的)形成对比
提示
如果您想查看行为如何在游戏中使用的示例,请阅读如何为对象创建行为。这是一个关于如何使用行为架构游戏的逐步解释和良好指南。
创建新行为
行为被分组到扩展中。
点击底部的创建或搜索新扩展。然后,选择创建新扩展以创建新扩展。
默认情况下,扩展没有任何行为。通过点击左侧的添加新行为来添加行为。
您可以选择在用户将行为添加到对象时显示的描述和名称。如果需要使用特定对象(精灵、文本等),可以在底部的下拉列表中选择。
行为还可以嵌入属性,这些属性是存储在行为内部的数字、字符串或布尔值。查看下面关于如何添加和使用属性的部分。
向行为添加函数
单击列表中的行为以查看组成行为的函数列表。它将显示在右侧面板中。
默认情况下,行为为空且什么都不做。为了增加交互性,您可以添加新函数。您可以选择一些预定义函数,称为_生命周期方法_,或自定义函数。生命周期方法将由游戏引擎在游戏的一些关键时刻自动调用。自定义函数将作为条件、动作或表达式(类似于行为外的常规函数)提供给扩展用户。
在对象创建时运行事件
onCreated函数中的事件在创建具有该行为的对象的新实例时运行。这是根据扩展用户设置的值设置行为内部状态的适当位置。
每帧运行事件
onStepPreEvents函数中的事件在每次渲染屏幕上的帧之前(在场景的“传统”事件之前)运行。通常,每秒执行60次。对具有行为的每个对象调用,除非被停用。
以下onStepPreEvents
函数事件会自动删除受损对象:
添加自定义动作、条件或表达式
行为和场景事件通过函数进行通信:
- 动作允许更改行为状态,并在
onStepPreEvents
函数中可能随时间引发效果。例如,跳跃动作将角色状态从站立更改为跳跃,而onStepPreEvents
将在每帧修改角色在Y轴上的位置。 - 条件让场景事件知道行为状态的变化。例如,条件可以允许检查角色是否正在跳跃。
提示
函数页面详细解释了关于自定义函数的概念。
例如,此函数定义了一个可用于给对象添加伤害的动作:
在其他生命周期关键时间运行事件
尽管onCreated和onStepPreEvents生命周期函数最常见,以下函数也可以使用:
- onDestroy:当具有该行为的对象实例被删除时将运行事件(如果多个对象同时被移除,则会为每个对象运行事件)。即使行为被停用,也会执行。
- onDeActivate:在对象上行为被停用后执行一次事件。
- onActivate:在对象上的行为再次被激活后执行一次事件。
- onStepPostEvents:如果行为未被停用,在场景的常规事件之后将为具有该行为的每个对象运行事件。通常,每秒执行60次。建议优先使用
onStepPreEvents
,在事件之前运行逻辑并使场景事件有机会对对象上发生的更改做出反应。### 1. 将行为添加到对象
一旦创建了行为,您可以开始将其附加到对象。最棒的一点是,您基于事件的行为将像GDevelop捆绑的任何其他“内置行为”一样列出。
在这里,您可以看到例如“可破坏对象”行为(在前面的截图中创建):
然后,您创建的自定义行为将显示在对象附加的行为列表中:
您可以运行游戏并查看“doStepPreEvents”函数(或“doStepPostEvents”)中的事件将被执行。例如,在创建的可破坏行为示例中,如果“伤害”变量设置为大于或等于100的数字,对象将被自动销毁。
为了测试这一点,我们将“可破坏”行为添加到对象“平台”。然后,当使用调试器时,我们可以检查“平台”实例,并看到它们有一个“伤害”变量(设置为0)。如果我们使用调试器(或事件)将其设置为100,则对象将从场景中移除:
2. 使用动作、条件和表达式
与任何其他“内置行为”一样,如果您在行为中声明了函数,还可以使用动作/条件(或表达式)。例如,在“可破坏”行为中,我们创建了一个动作来对对象造成一些伤害。我们可以在事件表中找到并使用它:
它显示在事件表中:
正如您所看到的,这允许创建非常具有表现力和易于阅读的事件。然后,您可以使行为更复杂或在其他对象上重复使用它。
添加和使用行为中的属性
属性类似于对象变量,但它们只能从行为事件中使用。如果您曾将行为添加到对象,可能会注意到一系列字段用于设置行为。这些是属性的初始值。
您可以使用这些属性使行为可定制(例如,您可以将速度、伤害量、生命点、能力点、法力等作为行为的属性——根据您的行为正在执行的任务而定)。
注意
如果您不希望让扩展用户选择初始值,属性可以被隐藏。
要显示和添加行为的属性,请编辑它并单击“属性”选项卡。在这个示例中,您可以看到一个名为“生命值”的行为,其中包含用于存储对象生命值和两次击中之间的最小时间的属性:
属性可以是:
- 数字
- 字符串(包括颜色或带有选择的字符串)
- 布尔值(显示为复选框)
属性也可以用于要求行为,如下一部分所述。
使用动作和条件来操作属性
一旦在行为上创建了一些属性,条件和动作将自动添加到事件表中。对于每个属性,将有一个条件用于比较其值,以及用于更改它的动作。字符串和数字还将具有获取其值的表达式。
注意
如果您重命名属性,动作/条件/表达式将自动更新。
这些动作/条件/表达式将无法从行为外部使用。属性被称为“私有”,它们只能被行为操作。如果您希望让扩展用户从场景事件中修改它们,可以从属性的下拉菜单中生成一个动作和一个条件。
行为使用其他行为作为属性
行为可以使用其他“必需行为”作为属性。在这种情况下,GDevelop将确保使用您的行为的任何对象也将使用另一个行为。然后,您可以在自己的行为的动作、条件、表达式和生命周期函数中使用作为属性输入的行为。
提示
这是一个有助于创建基于其他行为的行为的高级功能。例如,您可以创建一个名为“平台敌人”的行为,它使用“平台对象”行为,并添加特定动作、条件和逻辑,使敌人追逐玩家。
如果创建一个行为并希望使用此行为,只需转到此行为的属性并添加一个新属性。为此属性选择类型“必需行为”。然后,您可以在刚刚编辑的行为的事件中使用这个新行为。
要使用基于另一个行为的行为,您无需做任何特殊操作!只需像往常一样将其添加到对象:任何缺少的行为将被添加到您的对象中,因此您可以立即开始使用它们。
行为优势简介
创建自己的行为具有多个优势:
- 封装:通过在自定义行为内添加逻辑,您可以保持清晰的事件表,减少事件数量,使其更易于阅读和维护。行为可以有运行逻辑的动作/条件和表达式,因此您不必在事件表中重复冗长的指令。您可以像通常使用其他行为一样使用行为提供的动作/条件。
- 可重用性:假设您创建了一个行为,使敌人移动并在被玩家击中时失去生命。如果您想创建一个略有不同的敌人,但基于相同原则,您可以创建一个新对象,然后使用具有不同属性的相同行为。几个点击,您的游戏中就有了一个新敌人。
- 协作:假设您正在团队中工作,或希望使您的项目开源,并邀请人们贡献新功能和游戏玩法。自定义行为使任何人都能设计和创建自包含的功能和游戏逻辑,我们可以轻松地将其导入到项目中,并由任何人使用,无需先验知识,包括通常不处理游戏逻辑的关卡和游戏设计人员或至少不希望处理游戏逻辑的人。# 自定义行为的示例/想法
您可以想象各种不同的行为。以下是一些示例:
一个用于管理敌人或boss的生命值的行为。
- 可以有一个动作"打击对象",一个条件"对象死亡了吗?"。该行为将负责更新对象变量以跟踪敌人的生命(例如,当敌人被击中时,您会减少一些生命。然后,生命会在游戏的每一帧逐渐恢复),条件"对象死亡了吗?"将能够检查生命是否达到了0或未达到。
另一个想法是将让敌人根据屏幕上的复杂模式移动的事件放在一个行为中。
- 您可以添加动作/条件来改变移动、改变速度等... 所有这些都将包含在一个行为中,只需点击几下即可添加到任何其他对象。
一个行为可以在游戏中敌人被摧毁或物品被收集时自动更新得分。
- 您可以创建一个行为,在对象被摧毁时增加"Score"变量。然后,您可以创建具有此行为的物品、可收集物品或敌人,当它们被收集或被杀死时,得分将自动增加。