当前位置: 首页 > news >正文

Godot 3.5 VisualScript 入门:从零实现Web版2D物体移动与导出

1. 项目概述与核心思路

最近在捣鼓一个用Godot引擎做的Web小项目,版本用的是比较稳定的3.5。这次没打算用GDScript或者C#,而是想试试看VisualScript这个可视化脚本系统,用它来实现一个最基础的功能:让场景里的一个物体能左右移动。这个想法听起来简单,但对于刚接触Godot或者想从Unity等引擎转过来、不习惯写代码的朋友来说,VisualScript是个不错的切入点。它能让你用“连连看”的方式搭建逻辑,直观地看到数据流和控制流,对于理解游戏对象(Node)之间的交互和信号机制特别有帮助。

这个项目虽然小,但麻雀虽小五脏俱全。它涉及到Godot项目的基础设置、场景树的构建、节点的属性配置,以及最核心的VisualScript编辑器的使用。最终的目标是把这个项目导出为HTML5格式,能在浏览器里直接运行。无论你是想做个简单的网页小游戏Demo,还是想验证某个交互逻辑,这个流程都是基础中的基础。我会把从创建项目到最终导出运行的每一步都拆开揉碎了讲,特别是VisualScript里那些容易让人迷糊的细节和坑点。

2. 环境准备与项目初始化

2.1 Godot 3.5的获取与确认

首先,你得确保自己安装的是Godot 3.5版本。虽然Godot 4已经发布并带来了很多激动人心的特性,但3.5版本依然是一个非常成熟、稳定且文档齐全的长期支持版本,特别适合用于Web导出,因为其HTML5导出模板的兼容性和稳定性经过了更长时间的考验。你可以从Godot官网的下载页面找到历史版本,选择3.5.x系列的最新版本下载。安装包很小,解压即用,非常绿色。

启动Godot后,在编辑器右下角或“帮助”菜单的“关于”里,确认版本号。这里有个小细节:Godot 3.5有Mono版本(支持C#)和标准版本。如果你只用GDScript或VisualScript,下载标准版即可,体积更小。我们这次的项目用不到C#。

2.2 创建新项目与关键设置

点击“新建项目”,给你的项目起个名字,比如“VS_Move_Demo”。选择项目存储路径时,建议用一个干净的、没有中文和特殊字符的文件夹,这能避免后续一些潜在的路径解析问题,尤其是在导出环节。

在“渲染器”选项上,Godot 3.5默认使用GLES3。对于Web项目,GLES2的兼容性通常更好,特别是对于一些较旧的或移动端浏览器。不过,GLES3能提供更好的图形效果。考虑到我们这只是个2D移动Demo,对图形要求极低,为了最大化兼容性,我建议选择GLES2。你可以在项目创建后,在“项目设置” -> “渲染” -> “质量”里随时更改,但一开始选好能省事。

创建完成后,你会进入空荡荡的编辑器界面。第一件事是保存主场景:点击场景面板的“+”号,添加一个“Node2D”节点作为根节点,然后按Ctrl+S将场景保存为Main.tscn。同时,在“项目设置” -> “应用” -> “运行” -> “主场景”中,将这个Main.tscn设置为主场景。这样,你点击运行按钮时,Godot就知道该加载哪个场景了。

2.3 准备测试物体:Sprite节点

我们的移动需要一个载体。在场景中,右键点击根节点“Node2D”,添加一个“Sprite”节点。Sprite用于显示2D图像。你需要为它指定一张纹理(Texture)。在Godot中,资源管理非常直观。你可以将一张图片(比如PNG格式)直接从电脑文件夹拖拽到Godot编辑器的“文件系统”面板中,它会被导入到项目里。

然后,在Sprite节点的属性检查器(Inspector)中,找到“Texture”属性,点击它旁边的空槽,选择“加载”,找到你刚拖进来的图片,或者更简单,直接从“文件系统”面板把图片拖到“Texture”属性槽里。这样,Sprite就显示为你的图片了。为了后续操作方便,我把这个Sprite节点重命名为“Player”。

3. VisualScript核心概念与编辑器初探

3.1 VisualScript是什么?为什么用它?

VisualScript是Godot内置的一种可视化编程语言。它不要求你书写传统的文本代码,而是通过将各种功能的“节点”(Node)用“线”(Connections)连接起来,形成程序逻辑。每个节点代表一个操作,比如获取一个变量的值、执行一个数学运算、或者调用一个内置函数。连线则代表了数据流(数据从哪个节点的输出端口流向哪个节点的输入端口)或执行流(程序下一步执行哪个节点)。

对于编程新手、美术或策划人员,或者只是想快速原型验证一个简单逻辑的情况,VisualScript降低了门槛。你能“看见”逻辑是如何运行的,这对于理解事件驱动和信号回调特别直观。当然,它也有局限性,比如构建复杂逻辑时,图表可能变得庞大难以管理,调试也不如文本代码方便。但对于我们“物体移动”这个目标,它绰绰有余,且是一个很好的学习工具。

3.2 为节点创建并附加VisualScript

在Godot中,脚本(无论是GDScript、C#还是VisualScript)都是附加在场景节点上,从而赋予节点行为的。我们要让Player移动,就需要给Player节点附加一个VisualScript。

选中场景树中的“Player”节点,在属性检查器最下方,找到“脚本”属性。点击旁边的“新建脚本”按钮。在弹出的对话框中,关键的一步来了:在“语言”下拉菜单中,选择“VisualScript”。Godot会自动生成一个以.vs为后缀的脚本文件,建议命名为Player.vs,并保存到你的项目目录中。

创建完成后,Godot会自动打开VisualScript编辑器。这个界面分为几个主要区域:左侧是“节点面板”,里面分类列出了所有可用的节点类型,如“常量”、“变量”、“函数”、“操作符”等;中间是巨大的“图表编辑区”,你将在这里进行连线操作;右侧是“属性检查器”,用于查看和编辑选中节点的具体属性。

3.3 理解事件流:从“_ready”到“_process”

在文本编程中,我们熟悉_ready()(初始化)和_process(delta)(每帧更新)这样的回调函数。在VisualScript中,这些概念以“事件节点”的形式存在。

在空白的图表区右键点击,选择“添加节点”。在节点面板的“事件”分类下,你可以找到“_ready”和“_process”。把它们都添加进来。

  • _ready事件节点:当节点进入场景树并准备就绪时触发,只执行一次。通常用于初始化操作,比如设置初始位置、获取对其他节点的引用。
  • _process事件节点:每帧都会触发一次。参数delta表示上一帧到这一帧所经过的时间(以秒为单位)。所有与连续运动、实时输入检测相关的逻辑都应该放在这里。delta是关键,用它来控制移动速度可以使运动与帧率无关,在任何刷新率的设备上速度一致。

这两个节点都有一个绿色的“执行”(Execute)输出端口。程序流(先执行什么,后执行什么)就是通过连接这些绿色的端口来定义的。数据流则通过连接其他颜色的端口(如蓝色的数据端口)来传递。

4. 实现左右移动的核心逻辑拆解

4.1 捕获键盘输入

物体的移动需要由玩家控制,我们使用键盘的左右方向键(A/D键或左箭头/右箭头键)。在VisualScript中,检测输入需要使用“Input”类相关的节点。

_process事件节点下方,右键添加节点。在“函数” -> “Input”分类下,找到“is_action_pressed”节点。这个节点用于检测某个“动作”(Action)是否被持续按下。Godot的输入系统是基于“动作”抽象的,而不是直接检测具体键位,这有利于支持多种输入设备。

is_action_pressed节点需要两个输入参数:一个是动作的名称(字符串),我们待会儿会定义“move_left”和“move_right”;另一个是“精确”(exact)参数,通常保持默认false即可。它有一个布尔(bool)类型的输出:如果动作被按下,输出true;否则输出false

我们需要两个这样的节点,分别检测“向左”和“向右”。

4.2 定义输入映射(Input Map)

在连接节点之前,我们必须先定义“move_left”和“move_right”这两个动作具体对应哪些物理按键。这不在VisualScript编辑器里完成,而是在Godot的“项目设置”中。

点击编辑器顶部的“项目” -> “项目设置”,打开设置窗口。切换到“输入映射”标签页。在这里,你可以添加新的动作。在“动作”输入框里,键入“move_right”,然后点击“添加”按钮。这个动作就出现在下方的列表里了。

接着,需要为这个动作分配物理按键。点击“move_right”旁边的“+”号,选择“键”。会弹出一个小窗口,此时你按下键盘上的“D”键或“右箭头”键,它就会被捕获并显示。点击“确定”,这个键位就绑定到“move_right”动作了。你可以用同样的方法为“move_right”添加另一个备用键位(比如右箭头),Godot会认为它们是“或”的关系。

重复这个过程,添加“move_left”动作,并绑定“A”键和“左箭头”键。完成后关闭项目设置。现在,我们的is_action_pressed节点就可以通过动作名来识别按键了。

4.3 构建移动向量

在游戏开发中,2D移动通常用一个二维向量(Vector2)来表示。Vector2有x和y两个分量。向右移动可以表示为Vector2(1, 0),向左则是Vector2(-1, 0)。我们需要根据按键输入,组合出每帧应有的移动方向向量。

  1. 创建向量节点:右键添加节点,在“类型” -> “核心”分类下找到“Vector2”。你可以直接创建一个常量向量,比如Vector2(1, 0)。但我们需要的向量值是根据输入动态决定的。
  2. 使用条件判断:我们需要一个逻辑来判断:如果按下“move_right”,则x分量为正速度;如果按下“move_left”,则x分量为负速度;如果都没按,则x分量为0。这可以用“if”条件节点来实现。
  3. 构建逻辑流
    • _process的绿色执行端口拉出一根线,连接到第一个if节点的“执行”输入端口。
    • is_action_pressed(“move_right”)节点的布尔输出,连接到if节点的“条件”(condition)输入端口。
    • if节点有“True”和“False”两个绿色执行输出端口。如果条件为真(按下了右键),程序流就走“True”分支;否则走“False”分支。
    • 在“True”分支后,我们可以放置一个“设置变量”节点,将一个变量(比如direction_x)的值设为1。在“False”分支后,需要再嵌套一个if节点,用来判断“move_left”,从而决定是设为-1还是0

这个过程用VisualScript搭建会稍微繁琐,因为涉及到多个条件分支的串联。一个更简洁的思路是:分别计算左右输入对x分量的贡献,然后相加。

  • 添加一个“浮点数”常量节点,值为0.0,作为x方向的初始值。
  • 添加一个“减法”操作节点。将is_action_pressed(“move_right”)的布尔输出(True/False)连接到一个“布尔转浮点”节点(在“类型转换”分类里),True转为1.0,False转为0.0。将这个浮点数作为减法的被减数。
  • 同样,将is_action_pressed(“move_left”)的布尔输出转为浮点数,作为减法的减数。
  • 这样,1.0 - 0.0 = 1.0(仅按右键),0.0 - 1.0 = -1.0(仅按左键),0.0 - 0.0 = 0.0(都没按)。这个减法的结果,就是我们需要的x方向分量。
  • y方向分量暂时为0

最后,使用“构造Vector2”节点(在“函数” -> “@GDScript”分类下可以找到),将计算好的x分量和常量0作为输入,输出一个完整的direction向量。

4.4 应用移动与帧率无关处理

得到方向向量后,还不能直接用它来修改位置。我们需要考虑两个因素:速度和帧时间。

  1. 速度标量:定义一个移动速度,比如每秒200像素。添加一个浮点数常量节点,值设为200.0,可以重命名为move_speed
  2. 与帧率无关的移动:这是新手极易忽略但至关重要的点。直接在每个_process调用中将位置加上方向 * 速度,那么物体每帧移动的距离是固定的。如果一台电脑帧率是60 FPS,另一台是30 FPS,那么后者物体移动的速度看起来就只有前者的一半。为了解决这个问题,必须引入delta时间。物体每帧应该移动的距离是:方向 * 速度 * delta。这样,“速度”的单位是“像素/秒”,乘以时间(秒)得到像素,确保了在任何帧率下,每秒移动的像素数是恒定的。
  3. 计算位移:添加一个“乘法”操作节点。首先将direction向量与move_speed相乘,得到每秒钟的像素速度向量。然后再添加一个乘法节点,将上一步的结果与_process事件节点提供的delta参数相乘,得到本帧真正的位移向量movement
  4. 应用位移:最后,需要修改Player节点的position属性。添加一个“设置”节点(在“函数”分类下)。在设置节点的属性中,需要指定设置哪个对象的哪个属性。
    • 首先,获取当前脚本所附加的节点自身。添加一个“Self”节点(在“节点”分类下)。
    • 将“Self”节点输出连接到“设置”节点的“实例”(Instance)输入端口。
    • 在“设置”节点的“属性”输入中,填入position(或者从下拉菜单中选择)。
    • 获取当前的position:添加一个“获取”节点,同样连接“Self”到其实例端口,属性填position
    • 将“获取”到的当前position与计算出的movement向量通过“加法”节点相加。
    • 最后,将这个加法结果连接到“设置”节点的“值”(Value)输入端口。
    • _process的执行流(绿色线)引导至“设置”节点的“执行”输入端口,完成整个逻辑链。

至此,一个完整的、帧率无关的键盘控制左右移动逻辑就通过VisualScript搭建完成了。图表看起来会是一个由事件、条件判断、运算节点和函数调用节点组成的网络。

5. 可视化脚本搭建的详细步骤与技巧

5.1 逐步搭建图表

让我们更具体地走一遍流程,并标注一些操作技巧:

  1. 建立事件入口:在Player.vs的图表区,确保已添加_process(delta)事件节点。
  2. 添加输入检测
    • 右键 -> 添加节点 -> 函数 -> Input ->is_action_pressed。创建两个,分别双击节点标题栏,重命名为“Check Right”和“Check Left”。
    • 分别点击这两个节点,在右侧属性检查器中,找到“action”参数,手动输入字符串move_rightmove_left。注意大小写必须与你在“输入映射”中设置的一模一样。
  3. 布尔转浮点
    • 为两个输入检测节点各添加一个后续节点:右键 -> 添加节点 -> 类型转换 -> 布尔转浮点。将is_action_pressed的“pressed”输出(布尔量)连接到“布尔转浮点”节点的输入。
    • 这样,按下键时,输出1.0;未按下时,输出0.0
  4. 计算方向分量
    • 添加一个“减法”操作节点(在“操作符”分类下)。
    • 将“Check Right”对应的“布尔转浮点”输出连接到减法的“a”端口(被减数)。
    • 将“Check Left”对应的“布尔转浮点”输出连接到减法的“b”端口(减数)。
    • 减法节点的输出结果就是我们需要的x方向分量,范围在-1.01.0之间。
  5. 构建方向向量
    • 添加一个“构造Vector2”节点(可以通过搜索“Vector2”找到,通常在“函数”->“@GDScript”下)。
    • 将减法节点的输出连接到“构造Vector2”节点的“x”输入端口。
    • 为“y”输入端口创建一个浮点常量0.0。现在,“构造Vector2”节点的输出就是(x, 0)的方向向量。
  6. 引入速度与时间
    • 创建一个浮点常量,值设为200.0,重命名为“Speed”。
    • 添加第一个“乘法”节点。将“构造Vector2”的输出连接到“a”端口,将“Speed”常量连接到“b”端口。输出是“像素/秒”的速度向量。
    • 添加第二个“乘法”节点。将上一步的速度向量连接到“a”端口。将_process事件节点的“delta”输出端口连接到第二个乘法节点的“b”端口。输出就是本帧的位移向量movement
  7. 获取并设置位置
    • 添加一个“Self”节点。
    • 添加一个“获取”节点。将“Self”节点连接到“获取”的“实例”端口,在“获取”节点的属性中填写position
    • 添加一个“加法”节点。将“获取”到的position连接到“a”端口,将计算出的movement向量连接到“b”端口。
    • 添加一个“设置”节点。将“Self”节点连接到“设置”的“实例”端口,在属性中填写position。将加法节点的输出连接到“设置”节点的“值”端口。
  8. 连接执行流
    • 最后,用绿色的执行线将它们串起来:从_process节点的绿色输出端口拖出,连接到第一个“乘法”节点?不对,执行流应该驱动整个计算和设置过程。一个清晰的做法是:从_process拉出线,连接到一个“序列”(Sequence)节点(在“流程控制”分类下)的输入。“序列”节点可以有多个输出端口,按顺序执行。
    • 将“序列”的第一个输出连接到计算movement相关节点的起始端(例如第一个乘法节点),但VisualScript中数学节点没有执行端口。实际上,执行流只需要确保在设置位置前,所有计算都已完成。更常见的做法是:将_process的执行输出直接连接到“设置”节点的执行输入。因为数据依赖关系(连线)已经确保了计算会先于赋值发生。Godot VisualScript的数据流是自动的,只要数据线连好了,当执行流到达“设置”节点时,它需要的(即加法结果)必然已经计算完毕。
    • 所以,最简单的连接是:_process[执行输出] -> “设置(position)”[执行输入]。所有蓝色的数据线已经定义了计算的先后顺序。

5.2 可视化脚本编辑器的使用技巧

  • 整理与注释:当节点增多时,图表会显得混乱。你可以框选多个节点,右键选择“创建函数”,将它们打包成一个子图,简化主视图。也可以添加“注释”节点,用文字描述某一块逻辑的功能。
  • 端口类型匹配:连接线时,Godot会强制进行类型检查。只有数据类型匹配的端口才能连接(例如,浮点数输出不能直接连到向量输入)。如果类型不匹配,你需要中间插入一个类型转换节点。
  • 调试查看:在编辑器运行游戏时,你可以选中VisualScript图表中的某个节点,其输出端口的值会实时显示在端口旁边,这对于调试非常有用。
  • 复制粘贴:你可以选中一组节点(Ctrl+点击多选或框选),使用Ctrl+C和Ctrl+V在同一个或不同的VisualScript之间复制粘贴,提高效率。

6. 项目导出为Web(HTML5)

逻辑完成后,在Godot编辑器中点击运行(F5),你应该能通过A/D或方向键控制Sprite左右移动了。接下来,我们要把它导出到网页上。

6.1 配置导出模板

Godot需要特定的“导出模板”才能将项目编译成目标平台(如Web)的可执行文件。对于HTML5,这个模板就是一个.wasm.js等文件的集合。

  1. 点击编辑器顶部的“项目” -> “导出”。
  2. 在导出窗口中,点击“添加…”按钮,选择“Web”。
  3. 右侧会出现Web平台的导出选项。最重要的部分是“模板”选项卡。如果你从未下载过Web导出模板,这里可能是空的。
  4. 点击“管理导出模板”,会打开一个对话框。点击“下载”按钮,Godot会自动下载与当前引擎版本匹配的Web导出模板。下载完成后关闭对话框。
  5. 回到导出设置,在“模板” -> “导出模板”下,现在应该可以选择你刚下载的模板了。

6.2 关键导出设置

在“选项”选项卡下,有一些设置需要注意:

  • 名称/描述:可以自定义,会体现在HTML标题等地方。
  • 导出目录:选择一个空文件夹作为导出目标。
  • HTML
    • “导出图标”:可以设置网页标签页的图标。
    • “自定义HTML Shell”:如果你有特殊的HTML包装需求,可以指定一个自定义的HTML文件。一般留空,使用Godot默认的Shell即可。默认Shell已经处理了Canvas创建、全屏切换、启动加载等常见功能。
  • 资源
    • “导出模式”:对于小项目,选择“内嵌所有资源”最简单,所有内容都会打包进一个.html文件。如果项目较大,可以选择“将资源打包到PCK文件”,这样会生成一个.pck数据文件和一个轻量的.html文件。
    • “压缩模式”:可以选择Zstandard压缩以减小文件体积,但注意浏览器兼容性。对于超小型项目,不压缩也无所谓。
  • 属性:这里可以覆盖“项目设置”中的一些属性,比如窗口初始大小、是否可调整大小等。我们可以在“项目设置” -> “显示” -> “窗口”里预先设置好,比如设为1280x720。

6.3 执行导出并测试

设置好后,点击窗口底部的“导出项目”按钮。选择一个路径和文件名(例如index.html),点击保存。Godot会开始编译和导出过程。

导出完成后,进入你指定的导出文件夹。你会看到至少一个.html文件和一个.wasm文件(可能还有.js.pck等)。重要:你不能直接在浏览器中通过双击打开这个.html文件来运行,因为WebAssembly(.wasm)需要在一个HTTP服务器环境下运行,而不是file://协议。

你需要一个本地HTTP服务器来测试。有几种简单方法:

  1. 使用Godot内置服务器(推荐用于快速测试):在导出时,勾选“选项” -> “HTTP服务器”下的“在导出后启动HTTP服务器”。Godot会在导出完成后自动启动一个微型本地服务器,并打开浏览器访问。这是最方便的方法。
  2. 使用Python:如果你安装了Python,在导出目录打开命令行,运行python -m http.server 8000(Python 3)或python -m SimpleHTTPServer 8000(Python 2),然后在浏览器访问http://localhost:8000
  3. 使用Node.js的http-server:通过npm安装http-server,然后在导出目录运行http-server -p 8080

启动服务器后,用浏览器访问对应的本地地址(如http://localhost:8000),就能看到你的Godot Web项目在运行了,并且可以用键盘控制物体移动。

7. 常见问题、调试与优化心得

7.1 VisualScript特有问题排查

  • 节点执行顺序混乱:确保绿色的执行流连线符合你的逻辑顺序。数据流(蓝线)不决定执行顺序,只决定数据依赖。如果A节点必须在B节点之后执行,必须用绿线连接。
  • 端口类型错误:这是最常见的错误。如果连线时端口变成红色,说明类型不匹配。仔细检查输出和输入端口的数据类型,必要时插入“类型转换”节点。例如,将整数转换为浮点数,或将单个浮点数组合成Vector2。
  • 变量未定义或作用域错误:如果你使用了“变量”节点,确保在“变量”面板中已经定义了这个变量,并且作用域(Instance/本地变量)选择正确。对于简单的临时值,使用“常量”或“表达式”节点可能更直接。
  • 脚本没有生效:检查场景树中Player节点的“脚本”属性是否确实指向了你创建的Player.vs文件。有时双击.vs文件打开编辑器和节点实际附加的脚本可能不是同一个。

7.2 Web导出相关问题

  • 导出后无法运行,白屏或控制台报错
    • 未通过HTTP服务器访问:这是首要原因,务必确认是通过http://localhost访问,而不是file://
    • 导出模板不匹配:确保下载的Web导出模板版本与你的Godot引擎版本(3.5.x)完全一致。
    • 服务器MIME类型设置:某些服务器需要对.wasm文件设置正确的MIME类型(application/wasm)。Godot自带的服务器或Python的简单服务器通常能自动处理。如果你使用其他服务器(如Nginx、Apache),可能需要手动配置。
    • 浏览器控制台错误:按F12打开开发者工具,查看“控制台”(Console)标签页。常见的错误信息会给你线索,例如“Failed to fetch wasm file”可能是路径或MIME类型问题。
  • 性能问题
    • 初始加载慢.wasm文件需要下载和编译。确保在导出时启用了压缩(如Zstandard),可以显著减小文件体积。对于真正发布的项目,可以考虑使用CDN和浏览器缓存。
    • 运行时卡顿:我们的Demo极简,一般不会卡顿。但如果未来项目复杂了,在VisualScript中要避免在_process里进行过于复杂的计算或每帧查找大量节点。复杂的逻辑应考虑用GDScript实现。
  • 输入无效
    • 浏览器焦点问题:确保游戏Canvas获得了焦点。有时需要点击一下游戏画面才能捕获键盘输入。Godot默认的HTML Shell通常会处理这个,但如果你用了自定义Shell需要注意。
    • 输入映射未导出:输入映射(Input Map)是项目设置的一部分,会随项目一起导出,通常没问题。如果怀疑,可以在Web运行时通过JavaScript控制台检查Godot的输入系统状态(这需要更深入的调试)。

7.3 从VisualScript到GDScript的思维过渡

虽然本次全程使用VisualScript,但了解其对应的GDScript代码有助于深化理解。我们实现的移动逻辑,在GDScript中大致如下:

extends Sprite var speed = 200 func _process(delta): var direction = Vector2.ZERO if Input.is_action_pressed("move_right"): direction.x += 1 if Input.is_action_pressed("move_left"): direction.x -= 1 position += direction.normalized() * speed * delta

可以看到,VisualScript中的每一个节点(输入检测、减法、乘法、获取/设置属性)都对应着GDScript中的一行或一个表达式。VisualScript的连线对应着数据的流动和函数的调用。理解这种对应关系,能帮助你在未来更顺畅地过渡到文本编码,或者至少能读懂大部分Godot社区分享的GDScript代码。

7.4 项目优化与扩展建议

  • 使用_physics_process代替_process:如果你的游戏涉及物理碰撞,移动逻辑最好放在_physics_process回调中。这个回调以固定的频率(默认为60Hz)执行,与物理引擎同步,能避免在_process中因帧率波动导致的物理抖动。在VisualScript中,只需将事件节点从_process换成_physics_process即可,它同样提供delta参数(但此时是固定的物理步长时间)。
  • 归一化方向向量:在我们的例子中,同时按住左和右,方向向量会是(0,0),这符合预期。但如果以后加入上下移动(斜向),方向向量如(1, 1)的长度(模)会大于1,导致斜向移动比轴向移动快。更严谨的做法是在应用速度前,对方向向量进行“归一化”(使其长度为1)。在VisualScript中,可以使用“函数”->“@GDScript”下的normalized()节点来处理方向向量。
  • 封装可复用逻辑:如果你发现同样的移动逻辑需要用在多个角色上,可以考虑将这部分VisualScript保存为一个“自定义节点”或“函数”。在VisualScript编辑器中,框选相关节点,右键“创建函数”,可以将其封装。之后就可以在其他VisualScript中像调用内置函数一样调用它。
  • 探索更多节点:Godot的VisualScript提供了非常丰富的节点,包括动画控制、资源加载、场景管理、网络等。通过这个移动Demo熟悉了基本操作后,可以尝试用VisualScript实现跳跃、射击、生成敌人等更多功能,全面体验可视化编程的流程。
http://www.jsqmd.com/news/1245125/

相关文章:

  • 青岛打包带在电商包装中适用吗
  • 宝珀中国售后服务中心|电话和详细地址权威信息声明(2026年7月最新) - 宝珀官方售后服务中心
  • NVIDIA Triton客户端安装与配置指南
  • Rerank 不是银弹:8 个精排 badcase 的证据链
  • AI 软件简报 07.18-07.22 大模型定价 ,MCP协议,投资
  • 零跑Lafa5:10万级激光雷达电动车解析
  • OpenSSL与SSL握手
  • 不吹不黑,花了一下午把BuildingAI部署上线,说说它的真实定位
  • PHP-FPM核心机制与高并发优化实战
  • TI C2000 ePWM核心寄存器深度解析:从CMPA到死区控制的实战指南
  • DevExpress XtraPrinting Library核心功能与实战应用
  • 社区共享厨房改造:适老化设计与智慧管理实践
  • 装箱与接口和抽象类的理解
  • 亲身到店探访太原亨得利名表服务中心|最新地址和维修热线(2026年7月更新) - 亨得利官方
  • 2026年7月万国沈阳售后网点地址及全国客服热线最新公告 - 万国中国官方服务中心
  • 掌握这3个AI技术方掌握这3个AI技术技术的隐藏用法,看完恍然大悟方法,效率提升100%
  • 怎么证明 Rerank 真的有用?nDCG、P95 延迟与冻结测试集
  • AI对话平台未成年人保护机制:技术实现与工程实践
  • SolidWorks军工级建模实战:辽宁舰三维可视化技术解析
  • 外文翻译平台哪个好?深度测评2026年主流翻译工具,推荐专业小语种人工翻译平台
  • Python实现自动化新闻播报系统:从采集到语音合成
  • Ray 2.55正式支持TPU与KubeRay多主机切片编排实践
  • 相城区黄埭镇打井找哪家公司靠谱?苏州工业重镇的专业钻井服务推荐 - 瑞溪泉水利
  • Jumamo语音生成工具:本地部署与实战应用指南
  • 大学生圈子里火了,Chromium内核还支持动态背景!
  • 2026年7月最新芝柏常州武进万达广场维修保养服务电话 - 亨得利官方服务中心
  • YOLO26中的SKAttention机制:多尺度目标检测优化实践
  • [英辰朗迪GEO知识库第58期]注意!llms.txt才是AI搜索引擎的「VIP通行证」
  • Python函数修炼指南:从重复复制到一招封装,匿名lambda顺带拿捏
  • DaVinci异构平台网络音视频开发:从架构设计到GStreamer实战优化