Skip to main content

ProtoGraph 使用介绍

ProtoGraph

ProtoGraph 是一个社区制作的声明式编程语言,旨在与 ProtoFluxResonite 生态系统中协同工作。它允许创作者以简洁、可读的文本格式编写逻辑,并直接编译为 ProtoFlux 节点——从而更轻松地构建、测试和维护复杂系统。

概述 (Overview)

谁应该考虑 ProtoGraph?

  • 希望超越可视化脚本的创作者
  • 构建模块化、可重用系统的开发者
  • 在大型项目上协作的团队

优势 (Benefits)

  • 可读性强:简洁的语法,与 ProtoFlux 一一对应
  • 模块化:使用模块(嵌套节点)实现可重用且易于重构的代码
  • 版本控制:使用行业标准工具存储、比较、分享和版本控制源代码
  • 可靠性高:编译器检查有助于及早捕获错误,甚至可以构建不完整的程序
  • 易于上手:即使作为第一门编程语言,对熟悉 ProtoFlux 的人也很友好
  • 兼容性好:底层仍是 ProtoFlux,能与 Resonite 的其他部分无缝协作,无需模组或插件

什么时候 ProtoGraph 不是好选择?

  • 快速原型:对于小型测试和一次性示例,ProtoFlux 设置起来更快、更容易。
  • 高性能要求:请等待 WASM 集成。ProtoGraph 的速度仅与 ProtoFlux 虚拟机相当。
  • 纯可视化创作者:ProtoGraph 是 ProtoFlux 的文本版本,需要打字。

在 Resonite 中构建与使用

入门指南

  1. 编写您的 .pg 文件。
  2. 编译它:
    flux-sdk build MyModule.pg 
  3. .brson 文件导入 Resonite。
  4. 在对应槽位下检查生成的 ProtoFlux。

Flux UI

可以在 Resonite 中使用 Flux UI 来连接生成的 ProtoFlux 中的源和驱动。

示例 (Examples)

叉积模块 (Cross Product Module)

这是一个简单的纯模块,将输入数据转换为输出。

/// 使用叉积计算两个三维向量的乘积
module CrossProduct

/// 第一个向量
in A: float3
/// 第二个向量
in B: float3

/// (A X B) 的结果
out this: float3

where {
    // 输入
    Ax, Ay, Az = A->unpack;
    Bx, By, Bz = B->unpack;

    // 计算
    Cx = (Ay * Bz) - (Az * By);
    Cy = (Az * Bx) - (Ax * Bz);
    Cz = (Ax * By) - (Ay * Bx);

    // 最终结果
    pack<float3>(Cx, Cy, Cz);
}

计数器对象 (Counter Object)

展示了如何编写一个维护内部状态并公开可调用方法的对象。

/// 一个可以向上和向下计数的简单对象状态机
module Counter

/// 计数器的当前值
out this: int

/// 增加计数的公开方法
out Increment: Impulse
/// 减少计数的公开方法
out Decrement: Impulse
/// 将计数器设置为 0 的公开方法
out Reset: Impulse

where {
    // 变量不与其他节点共享,它们是私有的
    sync CounterVar: int;

    // out 脉冲是对象上的方法,用于向其发送消息以执行不同操作
    Reset = CounterVar <- 0;

    Increment = CounterVar <- ValueInc(CounterVar);

    Decrement = CounterVar <- ValueDec(CounterVar);

    // 我们也可以暴露普通数据。这类似于 getter。
    CounterVar;
}

弹跳球 (Bouncing Ball)

一个抛体运动的物理模拟,每次撞击地面时能量会损耗。

参见 (See Also)