戈多,1000件小事

最近发现了Godot引擎,这是一个开源游戏引擎。我分享一些技巧和注释,主要来自3d,代码或一般要点。





总的来说,戈多(Godot)以其更像是2D引擎而闻名,这种引擎的效果相当不错,但是不久之前,3D功能使我们能够制作3D游戏。尤其是如果您能够自己优化某些东西,不要制作过于繁琐的游戏,并且对当前的渲染选项也感到满意。或者,您可以等待将来的优化和vulkan的出现。



引擎中的“开箱即用”存在一些物理特性,包括关节和轮式车辆。没有内置的地形编辑器,但是您可以使用插件,从专门的程序导入,或者就像从3D包中获取网格一样。在后一种情况下,为了提高生产率,您将必须将景观独立地切成大块碎片,并且很可能使它们成为单独的网格以进行碰撞。至于用于景观碰撞形状的网格-为了避免视觉上的不一致,您需要在从3D包导出的过程中对模型进行三角剖分。例如,在Blender中执行此操作的最简单方法之一是以collada(.dae)格式导出网格,默认情况下有一个三角剖分复选框。

有时,Blender模型必须在Godot内翻转180度,因此,如果看不到您的地形,也不要感到惊讶-它很可能是由法线向错误的方向旋转的。



戈多特实行“一切都是场景”的方法,并针对元素的树结构。在实践中,这意味着将一个级别上的新对象作为分支添加到已经存在于其上的节点上,它们可以折叠成预制件并单独打开,就好像它们是它们各自独立的小型本地世界一样。因此,编辑各种保存的合成对象非常方便,唯一的事情是,如果在您的水平上曝光了灯光,例如,进入角色内部,进入他的局部场景,您将不会看到此灯光并设置他的材质,也将无法理解它们的外观。光。这个问题可以通过不同的方式解决,例如,在将角色的场景保存在那里之后,切换到级别窗口并评估角色所发生的变化。或只是将带有角色的光源暂时扔在预制件内。





theEnergy, . Area, , , .



对于语言,如果您不考虑底层方法,则最常见的选项是GDScript和C#脚本语言,以及一些简单的可视脚本。 GDScript更好地集成到引擎中,具有更多示例,不需要启动外部环境,就一般结构而言,一切都将如C#版本中那样发生-声明变量,调用初始化函数,过程循环,物理过程循环等。因此,选择GDScript作为主要的开发脚本语言很有意义。更改为本地C#后,我们只能获得录音的更多准确性和详细信息,失去了简洁性,但是提高了清晰度和对情况的控制-大括号代替了使用制表符,换行符和更正式的键入方式。





附加到上述对象的代码(在GDScript中)。设置了一个变量标识符,可以在编辑器中设置其值,然后是一次初始化函数,其中没有什么特别的事情发生(并且可以删除)。以下描述了将删除对象的信号处理程序方法。



至于全局变量,为了同时在GDScript和C#中使用它们,您需要在项目参数中添加一个或多个全局脚本以启动,这些变量可以全局访问。

Godot也有一个限制-每个对象不能有多个脚本。但是,例如,可以通过将第二个脚本挂在子对象上来避免这一点。



讯号



要在Godot中的节点之间交换数据,您还可以使用层次结构,因为对象彼此相连,就像树的分支一样。的确,这种方法有其陷阱,因为在我们的游戏中,层次结构可以动态更改。此外,引用同一场景中的层次结构是一回事,但是当您在某个场景中的某个场景中拥有一个场景时,即使仅纯粹了解正在发生的事情,也会因此而产生一些困难。

一种管理所有这些并且不会过于依赖特定的当前层次结构的方法是通过信号。已经预先设置了一定数量的公共信号-您可以查看对象信号面板,在场景中将一行接收到同一对象的脚本或带有脚本的另一个对象的处理附加到一行。如果您需要制作自己的信号,则可以这样操作:





我们启动信号我们会



在按下按钮或其他条件时以相同的脚本发出信号



,只要您不需要将信号从一个场景传输到另一个场景,一切都很好。例如,由于您从场景中编写了一个关卡,因此您需要知道何时需要销毁当前关卡,例如组装下一个关卡。

在这种情况下,您可以将信号处理程序附加到对象,该对象将在通过代码构造关卡时立即将信号发送到根场景。因此,可以这么说,我们在这个生成的线程中得到了一个间谍代理,并听听他告诉我们的内容。





在进行水平组装时,我们在其上找到一艘太空飞船,并紧贴着它的信号监听器,这表明我们将处理该信号消息的方法。



您还可以在信号上附加一些变量,这很有用。例如,与其在对象上生成不同的信号,不如通过它获得信号,但是我们将以不同的参数发送该信号,并在接收到信号后对其进行处理。





这是我们上面开始的方法本身的描述。收到信号后,他处理随其发送的变量。



减少不必要信号数量的另一有用之处是,一个对象可以敲击另一个对象,而不是发送个人信号,以便他本人可以发送已经存在于其中的信号。例如,爆炸接收到它碰到玩家的信号,然后在信号处理程序中查找玩家是否具有自毁方法,如果发现该方法则将其启动。播放器以这种称为方法的方式向根场景发送一个信号,表明他已经死了。在根场景的脚本中,玩家的死亡信号处理程序会擦除世界并收集游戏菜单。





发生一个事件,我们查看进入该区域的对象是否具有正确的方法。





, , . , , .



CSG-





Godot中有用的3D工具之一是构造实体几何图元。简而言之,这些是支持布尔运算的对象-相交,排除,并集。除了一组图元之外,还有一个通用的CSG网格,可以将任意网格设置为形状。







如果在组装某些复杂结构时有必要,则需要在层次结构中使用CSG组合器虚拟变量来控制操作应用程序的优先级。





从中切出一对子球的一对球。



CSG的主要应用是对水平静态及其一些元素进行原型制作的便利性和简便性。实际上,除非必须在游戏编辑器之外进行此操作,否则可以在3D程序包中制作网格并在其中重复相同的结果形状。



静态CSG的下一个应用是模拟可破坏性和损坏。为此,您需要以排除模式排列CSG基元,例如孔,“桩”和凹痕,然后在适当的时候临时隐藏(包括可见性)。这里的限制是我们只能“损坏” CSG对象的表面,此外,“损坏”必须首先作为子对象附加到它,或者通过代码作为后代附加。但是,与3D程序包中准备的可破坏对象相比,此选项在自定义灵活性方面已经赢得了巨大的成功。





在排除模式下,桥中内置了3个圆柱体。当它们隐藏时,桥是完整的。



如果启用,则会切出它们排除的区域。



接下来,我们将推动南玻集团。通过代码或录制的动画。通常,通过此方法,您可以实现某种效果,但是非常希望此类动画不要在舞台上循环旋转。多个动画CSG会对性能产生重大影响,而Godot并不会优化所有事情,而且如果您自己不剪裁动画CSG,它们将继续消耗摄像机的可视性。

尽管如此,动画CSG的效果已经很难用3D封装解决方案替代,因此您可能会对使用它们感兴趣(至少如果您不打算通过代码绘制高级3D)。最主要的是找到它们的正确用法,最好是在某些地方,包括触发器上的动画,逐点使用它们。作为打开通道的效果或其他一次性特效。自然,CSG对象的形状越简单越好。并且它们在运动接触的过程中精确地施加了主要的计算负荷,而且,哪个对象相对于另一个对象移动没有特别的区别。





视频中有一瞬间,当动画的CSG胶囊通过带有桥模型的CSG网格穿过时,机器会从桥上的孔中掉下来。



多重网格





如果需要大量复制网格,例如按级别散布石头或树木,则“ MultimeshInstance”节点在这里很有用。

将多网格添加到场景后,您需要指定要将副本散布到哪个对象上,以及指定要作为克隆样本的对象。在此过程中,您可以选择克隆的大小及其数量。当“烘焙”多网格时,它是一组克隆,如果不再需要它们,则可以删除用于生成它的目标。





选择多媒体目标时,将在右上方的编辑器窗口中显示一个用于选择多媒体目标的按钮。如果按此按钮,则该窗口中的生成设置将退出。





在这里,我们将两个对象作为MeshInstance节点添加到场景中。接下来,我们将左边的对象留在右边。





我们得到了多重网格。在这种情况下,在设置中设置了10,000个克隆。顺便说一句,如果有3-4千个,那么从视觉上看结果不会有太大差别。



“烘焙的”多重网格可以移动到任何地方,此外,它还具有“可见实例”参数,该参数最初显示在生成过程中指定的克隆数量。通过更改此值,您可以控制当前显示多少个克隆。默认情况下为-1,但这是用于显示最大克隆数的特殊值。如果放置10,则将有10个克隆,如果是100,则是100,如果最大值是50,则分别是100、1000,-1。

您可以通过代码或录制的动画对“可见实例”参数设置动画,从而使用此多网格功能创建特殊效果。为了更好地控制克隆的密度,您可以使用3D软件包在需要最大克隆密度的地方精确地制作一个带有实体网格的单独网格,而那些不应被克隆的地方则不应被多边形覆盖或在它们之间留出缝隙。





将“可见实例”设置为500,填充密度急剧下降。







可以通过在顶部编辑器窗格中打开“ 项目”项来配置Godot中的管理。接下来,在“ 项目设置”中,选择“操作列表”





您可以查看调用默认按钮的方式,以了解通过代码访问的名称。并添加您自己的。



例如,对于PgUP按钮,默认名称为“ ui_page_up”,并且可以通过在GDScript中按以下行中的代码进行处理-如果Input.is_action_pressed(“ ui_page_up”):

如果需要单击一次操作,则is_action_pressed必须替换为is_action_Just_pressed。按下结束-按下更改为释放。







如果需要动画材质的闪烁,可以通过自定义着色器进行。为此,请选择“ New ShaderMaterial”作为对象材料









然后在空白字段中选择“ VisualShader”





单击它,在编辑器下方打开可视化编辑器。



添加一对节点,首先是Input-All- Time,然后是Scalar-Common- ScalarFunc,将其设置在其下拉列表中,例如,罪。原则上,这样的设计已经可以在黑色和白色之间产生闪烁,但更好的是,添加另一个Scalar节点-Common - ScalarFunc然后在那里选择Abs。我们将节点连接在一起(请注意,通过单击每个节点的闭合眼睛可以打开它,并查看图片在每个阶段的变化),然后连接到Alpha,Emission或Albedo通道。就是这样,我们的对象现在正在闪烁。







自然,这不是唯一的方法,而是非常简单的选择之一。而且,如果您希望对闪烁进行着色,则需要制作几个具有颜色的节点,将它们混合在一个特殊的节点(面向Albedo)中,并附加上面收集的该节点链的输出。因此,该链将充当这些颜色的混合因子。







要将所选节点变成一个单独的场景,请右键单击它,然后选择选项“将分支另存为场景”。然后为此场景设置一个名称。此后,“在编辑器中打开”图标将出现在节点名称旁边,您可以从此处继续在新窗口中编辑生成的场景。

例如,要执行反向操作,例如,如果我们需要将保存的分支的对象移到当前场景以便以某种方式重建或修改它们,请右键单击这样一个将场景自身隐藏起来的节点,然后选择“设为本地”。他曾经保存过的场景不会同时被破坏。







使用全局变量,你需要创建一个脚本,把它扔进自动加载:项目 -项目设置 - 启动。必须检查单例。





SaveTheWorld脚本的内容,我们想将其用作全局变量。目前,这里宣布了一定的健康指标和一系列敌人状态,并在初始化步骤中进行了填写。



要从代码中访问这些全局变量,您首先需要获得指向单例的链接,然后使用其变量:





找到我们的SaveTheWorld,然后检查该特定敌人的状态是否为零。如果是这样,则将敌人清除。



UPD。您可以直接通过单例的名称访问单例的变量,也就是说,在上面的示例中,我们不必链接,并且可以代替Save.World.enemy_arr [myID]来访问main.enemy_arr [myID]。但是,您必须确保此节点在启动时的“单例”列中具有复选标记。







将AnimationPlayer节点添加到场景中,以记录和播放动画。它可以在层次结构中的任何位置。为了给他录制动画的机会,您需要单击打开的时间轴上方的“动画”按钮,然后创建一个新的动画。

之后,在当前场景中的每个选定节点上,关键图标将出现在检查器的右侧。如果单击该键,则动画师将提供添加新动画轨道的功能。







接下来,将时间轴滑块移动到所需的点,然后在每个点中,我们在对象检查器中更改该动画值,再次按下该键,以使该点出现在时间轴上。您可以使用时钟在字段中扩展可用的时域,在右侧,默认情况下为1秒。手表的右侧是一个循环的动画按钮。下面,该行的第一个是常用选项之一,它设置了抽搐的离散或连续平滑动画。

带有动画名称的中央面板右侧是自动运行按钮,如果按下该按钮,则在应用程序启动时将播放选定的动画。如果您需要不断循环播放多个动画对象,则可以通过为它们创建一个通用动画来在一个AnimationPlayer中对其进行跟踪。如果需要为特定对象切换动画,则可以为其启动单独的AnimationPlayer并为不同的状态为其创建多个动画,而其中只有一个可以标记为自动启动。







对于各种节点,例如MeshInstance或CollisionShape,在Mesh(形状)字段中,您可以从准备好的基元列表中进行选择(对于MeshInstance,包括加载自定义模型)。







对于MeshInstance,最昂贵的图元之一将是球体和胶囊,因为它们很可能包含许多多边形。因此,对于3D粒子,最好选择多边形,立方体或棱镜之类的东西。相反,对于碰撞,由于其参数只有一个半径,因此球形的形状将是最快读取的。实际上,以上内容不仅适用于Godot,还适用于其他游戏引擎。

Godot还可以自动为MeshInstance生成碰撞表单,为此,您需要单击“ Array”按钮,该按钮在选择MeshInstance时显示在编辑器的右上方。然后从建议的选项中进行选择,但是通常,对于相同的地形,这将是第一项-“创建凹形静态物体”(此后,嵌套有精确碰撞的StaticBody节点将附加到该对象)。在所有其他情况下,如果不需要特别精确的碰撞,则可以使用独立暴露的CollisionShape基元来获得,或在3D程序包中收集碰撞的最佳网格,然后通过MeshInstance添加它们,并通过“数组”按钮基于其形状来创建碰撞。







例如,如果在检查器的任何数字字段中都需要向参数中添加特定数字,将值相乘等等,那么您可以通过以下方式删除:“ 315-180”,“ 20 + 40”,“ 64 * 5” ...编辑器将在现场计算并替换操作的最终结果。



All Articles