用Pyrite64节点图(N64 Node Graph)做游戏逻辑:从Start到Load Scene完整示例
【免费下载链接】pyrite64N64 Game-Engine and Editor using libdragon & tiny3d项目地址: https://gitcode.com/GitHub_Trending/py/pyrite64
在 N64 游戏引擎 Pyrite64 中,Pyrite64 节点图(Node Graph)是一种可视化脚本工具:你不需要写 C++,只需把一个个节点拖到画布上、用线连起来,就能描述游戏对象的行为逻辑。编辑器会在构建时把节点图自动转译成原生 C++ 代码运行,因此性能与手写代码完全一致。本文以"从 Start 开始,等待、判断、最后 Load Scene 切换场景"这条最经典的逻辑链为主线,带你从零完整跑通一个 Pyrite64 节点图。
什么是 Pyrite64 节点图:比写代码更直观的游戏逻辑工具 🧩
节点图是 Pyrite64 中三种脚本方式的第三种(另外两种是对象脚本 Object Script 和全局脚本 Global Script),它定位不是通用编程语言,而是编排事件序列的利器。官方文档里给出的典型例子就是:
- 打开一个文本框
- 等待玩家响应并分支
- 等待 5 秒
- 加载一个新场景
由于底层采用基于栈的协程(coroutine),节点图里的Wait/Wait Frame等待事件时不会阻塞游戏主循环——这正是用节点图做"计时器 + 分支"式逻辑的核心优势。完整介绍见 docs/docs/manual/script/intro.md。
创建节点图三步走:给对象添加 Node Graph 组件
节点图通过Node Graph 组件挂载到场景对象上,创建流程只需三步:
- 选中目标对象,添加Node Graph组件;
- 点击Create,为图资产(graph asset)命名——注意这是一个独立资产,同一个图可以复用在任意多个对象上;
- 点击Edit,在节点图编辑器中打开它开始连线。
组件面板包含三个关键选项:
| 选项 | 说明 |
|---|---|
| File | 要运行的节点图资产,可 Edit 打开或 Create 新建 |
| Auto Run | 开启后对象出生时图自动开始运行 |
| Variables | 图中声明的每个变量都会在这里出现,可为每个对象单独设置初始值 |
组件细节参考 docs/docs/manual/editor/components/nodeGraph.md。
认识节点图编辑器:右键建节点、拖线连逻辑 🎛️
打开编辑器后,你会看到一个由节点和连线组成的画布,日常操作非常直接:
| 操作 | 方法 |
|---|---|
| 添加节点 | 在空白处右键打开创建菜单(按分类分组);顶部搜索框会自动聚焦,输入即过滤成扁平列表。也可以从引脚拖出一根线松手在空白处,直接创建一个已连好的节点 |
| 连接节点 | 从一个输出引脚拖到兼容的输入引脚 |
| 布线整形 | 点击连线任意处可加可拖拽的拐点,绕开其他节点;双击拐点删除 |
| 编辑属性 | 节点属性直接显示在节点本体上 |
| 批量操作 | 空白处拖框多选;右键节点可复制/删除 |
| 整理视图 | 左侧面板 Tools 区的Reset View按钮可框选全部节点 |
| 分组 | Tools > Add Group 创建带标题的框,纯粹是视觉分组,方便管理大图 |
| 循环 | 变量面板上方的Repeat复选框勾选后,任何流程路径结束都会等一帧回到Start重新执行——相当于把 Wait Frame 接回开头 |
读懂节点图的关键:逻辑线 vs 值线 ⚡
节点图里有两种线,分清它们是读懂任何一张图的关键:
- 逻辑线(Logic Wire):灰色、以流动虚线绘制,定义"事情发生的顺序"。执行从Start节点出发,顺着逻辑线逐个节点前进,虚线流动方向就是控制流方向。逻辑输出一次只能指向一个下游,但多个上游可以汇入同一个逻辑输入。
- 值线(Value Wire):携带计算出的数值(比较的数、要发消息的对象等)。每个值引脚都有数据类型(整数、浮点、向量、对象引用……),引脚颜色反映类型,只能连接兼容的引脚——数值类型之间可自动互相转换,向量或对象引用不能接到期望数字的引脚上。值输出可以同时喂给多个输入,而一个值输入只接受一个来源。
内置节点按分类组织在创建菜单里,覆盖Flow(Start、Wait、Wait Frame、Repeat、If-Else、Switch-Case、On Extremum)、Value(常量、Argument、Delta Time、Compare)、Math / Vector Math / Quat Math / Easing / Wave(各类运算与振荡器)、Object(Send Event、Delete Object、Get/Set Position、Set Rotation 等)、Scene(Load Scene)、Variables(Get Var / Set Var)、Debug(Log 系列)、Note等。所有标量输入在未接线时都会显示一个可直接填写的小输入框,方便输入常量。
内置节点定义本身也是脚本,入口源码可参考 data/nodes/builtin/flow.js 与 data/nodes/builtin/object.js。
完整示例:从 Start 到 Load Scene 的通关流程 🏁
下面搭一条最常见的"剧情流程":游戏开始 → 等待 5 秒 → 判断玩家状态 → 加载下一关。只需 5 个节点:
- Start:一切逻辑图的入口节点,执行从这里开始,向右拖出第一根逻辑线;
- Wait:从 Flow 分类拖入,在节点上把
sec.属性填成5——游戏会暂停这条流程 5 秒,而主循环照常运转; - If-Else:分支节点。在它的值输入上接一个Compare或直接从对象变量取值,为真走True线,为假走False线;
- Load Scene(Scene 分类):在 True 分支上接一个Load Scene节点,它自带一个场景选择器,直接挑选项目里的目标场景即可,无需填任何代码;
- Note(可选但推荐):在图里加个注释框说明这段流程的用途,团队协作时图会更容易读。
连线完成后整条链就是:
Start → Wait(5s) → If-Else →(True)→ Load Scene(nextLevel)→(False)→ 继续游戏逻辑
点击构建,编辑器会把这张图转译成 C++ 协程代码,Wait变成coro_sleep,分支变成if/else,最终像手写代码一样原生执行——这也是节点图"不通用但够快"的原因:它只负责把事件序列组织得清晰易改。
进阶技巧:用变量和 Repeat 让逻辑循环起来 🔄
想让流程循环(比如"巡逻 → 检测 → 再巡逻"),有两种方式:
- 勾选编辑器上方Repeat复选框:任何流程路径结束后自动回 Start 循环;
- 在图上手动把末尾的Wait Frame接回 Start。
变量(Variables)则让数据在等待之间"存活":
- 在编辑器左侧Variables 面板声明变量(名字 + 类型:Int / UInt / Float / Vec3 / Quat / Object);
- 用Get Var/Set Var节点读写;
Set Var带 Op 选项(Set / Add / Subtract)并输出结果值,一个节点就能完成"自增计数器"; - 因为图是协程运行,变量值会跨
Wait/Wait Frame保持——比如"跳跃次数 +1"这种逻辑天然支持; - 每个声明的变量会出现在每个使用该图的对象组件上,可为不同对象设置不同的初始值,Object 类型变量则是对象选择器,同一张图在不同对象上可指向不同目标。
还不够?给 Pyrite64 节点图扩展自定义节点 🔧
节点图编辑器内置的节点并非硬编码——每个节点都是一个小型 JavaScript 文件声明的外观、引脚、属性和 C++ 代码生成逻辑。你只需在项目根目录建nodes/文件夹、放入*.js文件(如nodes/logMessage.js),打开项目即被加载,编辑器还会监听该文件夹、保存即热重载,无需重启。
一个自定义节点大致就是:id(稳定唯一标识)、name(菜单里的名字)、inputs/outputs(引脚)、props(可编辑属性)、build(生成 C++ 的那段函数)。比如输出调试日志的节点,build里一行ctx.line(...)就能把 C++ 语句写进生成代码。完整 API(引脚、值类型、属性、代码生成器ctx的全部方法)详见 docs/docs/manual/script/nodeGraphCustom.md,内置节点的实现风格可参考 data/nodes/_types.js。
总结:一张图串起 Pyrite64 游戏逻辑 ⭐
- 创建:对象加 Node Graph 组件 → Create 命名 → Edit 打开编辑器;
- 连线:灰色逻辑线管顺序(从 Start 出发),彩色值线传数据(引脚颜色即类型);
- 完整示例:Start → Wait(5s) → If-Else → Load Scene,5 个节点完成"等待—判断—切场景";
- 循环与状态:Repeat 复选框 + 声明变量 + Set Var 自增;
- 扩展:
nodes/*.js自定义节点,保存即热重载。
更多用法与自定义节点指南,请阅读 docs/docs/manual/script/nodeGraph.md。
【免费下载链接】pyrite64N64 Game-Engine and Editor using libdragon & tiny3d项目地址: https://gitcode.com/GitHub_Trending/py/pyrite64
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考