1 个不稳定版本
0.1.0 | 2024 年 6 月 5 日 |
---|
#292 in WebAssembly
525KB
5K SLoC
wasm2usharp
将 WebAssembly 转换为 UdonSharp 的工具
安装
您可以从 发行版 页面下载预构建的二进制文件。
如果您使用 Cargo,您可以从 Cargo 安装。
cargo install wasm2usharp
使用方法
Usage: wasm2usharp [OPTIONS] [INPUT]
Arguments:
[INPUT] Input file. If not provided or if this is `-` then stdin is used
Options:
-o <OUTPUT> Where to place output. If not provided then stdout is used
--test Convert to C# instead of UdonSharp for testing
-h, --help Print help
-V, --version Print version
有关在 VRChat 项目中使用示例的说明,请参阅 示例。
- 在 U# 中,您需要首先调用
w2us_init
方法进行初始化 - Wasm 导出的全局变量、内存和表成为 U# 中的公共字段,Wasm 导出的函数成为 U# 中的公共方法
- Wasm 中的导入创建 U# 中每个模块名的公共字段类型
class_module_name
,并且在转换后的代码中使用module_name.import_name
访问它们 - Wasm 中的标识符
_start
在转换为 U# 后将被替换为w2us_start
。这是为了防止意外调用名为_start
的函数,该函数是 WASI 的入口点,因为它在 Udon 中被视为 Start 事件函数。 - 在 Wasm 内部完成的函数的递归调用被正确处理,但如果函数通过从 Wasm 调用外部函数然后从外部再次调用 Wasm 函数进行递归调用,则递归调用的函数的局部变量值可能不正确
- Wasm 中的整数类型对应于 U# 中的有符号整数类型
- 如果命令中指定了输出文件名,则文件名(减去扩展名)是 U# 中的类名
- 在 Wasm 的导出/导入名称中,非字母数字字符被替换为
_
,如果第一个字母是数字或与 C# 关键字同名,则前面加_
支持的 Wasm 建议
- 可变全局变量的导入/导出
- 非捕获浮点数到整数的转换
- 符号扩展运算符
- 批量内存操作(仅支持
memory.copy
和memory.fill
指令)
日语
从 WebAssembly 转换到 UdonSharp 的工具
安装
您可以从 发行版 页面下载预构建的二进制文件。
如果您使用 Cargo,您可以从 Cargo 安装。
cargo install wasm2usharp
使用方法
Usage: wasm2usharp [OPTIONS] [INPUT]
Arguments:
[INPUT] 入力ファイル。指定されない、または`-`の場合は標準入力が使用される
Options:
-o <OUTPUT> 出力先の場所。指定されない場合は標準出力が使用される
--test テストのためにUdonSharpの代わりにC#へと変換する
-h, --help ヘルプを出力
-V, --version バージョンを出力
有关在 VRChat 项目中使用示例的说明,请参阅 示例。
- 在 U# 中,您需要首先调用
w2us_init
方法进行初始化 - Wasm 导出的全局变量、内存和表成为 U# 中的公共字段,Wasm 导出的函数成为 U# 中的公共方法
- 在Wasm中的导入,U#中将创建名为
class_模块名
类型的public字段,并在转换后的代码中通过模块名.导入名
进行访问。 - Wasm中的
_start
标识符在转换为U#后将替换为w2us_start
。这是因为WASI的入口点名为_start
的函数在Udon中被视为Start事件函数,因此为了避免意外调用,进行了替换。 - 函数的递归调用:Wasm内部完成的递归调用可以正确处理,但如果从Wasm调用外部函数,然后从外部再次调用Wasm函数以实现递归调用,则递归调用的函数的局部变量值可能不会正确。
- Wasm中的整数类型与U#中的符号整数类型相对应。
- 如果通过命令指定输出文件名,则除扩展名外的文件名将成为U#的类名。
- Wasm的导出和导入名称,除英文字母和数字以外的字符将被替换为
_
,如果名称以数字开头或与C#的关键字相同,则名称前将附加_
。
支持的Wasm提案
- 可变全局变量的导入/导出
- 非捕获浮点数到整数的转换
- 符号扩展运算符
- 仅支持批量内存操作(
memory.copy
命令和memory.fill
命令)
依赖项
~8.5MB
~150K SLoC