跳到主要内容

PuerTS 3.0 三语言对比速查表

本表汇总了 JavaScript、Lua、Python 在 PuerTS 中与 C# 交互的语法差异,方便快速查阅。

📖 各语言详细教程:JS | Lua | Python


1. 环境创建

语言C# 代码
JavaScriptvar env = new ScriptEnv(new BackendV8());
Luavar env = new ScriptEnv(new BackendLua());
Pythonvar env = new ScriptEnv(new BackendPython());

三种语言共享统一的 ScriptEnv + Backend 架构,仅 Backend 类型不同。


2. C# 命名空间 / 类型访问

语言语法
JavaScriptCS.UnityEngine.Vector3 — 全局 CS 对象直接访问
Lualocal CS = require('csharp') 然后 CS.UnityEngine.Vector3
Pythonimport UnityEngine.Vector3 as Vector3puerts.load_type('UnityEngine.Vector3')

3. 对象创建

语言示例
JavaScriptlet v = new CS.UnityEngine.Vector3(1, 2, 3);
Lualocal v = CS.UnityEngine.Vector3(1, 2, 3) — 无 new
Pythonv = Vector3(1, 2, 3) — 无 new

4. 实例方法调用

语言示例说明
JavaScriptrect.Contains(point)点号语法
Luarect:Contains(point)冒号语法(自动传入 self)
Pythonrect.Contains(point)点号语法

5. 静态方法调用

语言示例
JavaScriptCS.UnityEngine.Debug.Log('msg')
LuaCS.UnityEngine.Debug.Log('msg') — 点号语法
PythonDebug.Log('msg') — 需先 import

Lua 中静态方法用点号 .,实例方法用冒号 :;JS 和 Python 统一使用点号。


6. 属性读写

语言读取写入
JavaScriptlet w = rect.widthrect.width = 0.1
Lualocal w = rect.widthrect.width = 0.1
Pythonw = rect.widthrect.width = 0.1

三种语言的属性读写语法完全一致,均使用点号。


7. ref/out 参数

语言创建容器传入参数获取结果
JavaScriptlet p = puer.$ref(初始值)Func(p)puer.$unref(p)
Lualocal p = {初始值}{}Func(p)p[1]
Pythonp = [初始值][None]Func(p)p[0]

示例对比(out int b, ref int c):

// JavaScript
let outB = puer.$ref();
let refC = puer.$ref(10);
Example.InOutArgFunc(100, outB, refC);
console.log(puer.$unref(outB), puer.$unref(refC)); // 100, 20
-- Lua
local outB = {}
local refC = {10}
CS.Example.InOutArgFunc(100, outB, refC)
print(outB[1], refC[1]) -- 100, 20
# Python
outB = [None]
refC = [10]
Example.InOutArgFunc(100, outB, refC)
print(outB[0], refC[0]) # 100, 20

8. 泛型类型创建

语言泛型类名写法创建 List<int>
JavaScriptList$1puer.$generic(CS.System.Collections.Generic.List$1, CS.System.Int32)
LuaList_1puerts.generic(CS.System.Collections.Generic.List_1, CS.System.Int32)
PythonList__T1(import 时)或 List`1(load_type 时)puerts.generic(List, System.Int32)

三种语言中反引号 ` 的替代符不同:JS 用 $,Lua 用 _,Python import 时用 __T


9. 泛型方法调用

语言语法
JavaScript直接调用,V8 自动推断类型参数
Luapuerts.genericMethod(类型, '方法名', 泛型参数...)
Pythonpuerts.genericMethod(类型, '方法名', 泛型参数...)
-- Lua 示例
local func = puerts.genericMethod(CS.MyClass, 'MyMethod', CS.System.Int32)
func(obj)

10. 数组与索引器访问([] 操作符)

C# 的 [] 操作符(数组、List、Dictionary、自定义索引器)在三种语言中都不能直接使用 [],必须使用 get_Item() / set_Item() 方法。

语言读取(C# arr[0]写入(C# arr[0] = val
JavaScriptarr.get_Item(0)arr.set_Item(0, val)
Luaarr:get_Item(0)arr:set_Item(0, val)
Pythonarr.get_Item(0)arr.set_Item(0, val)

⚠️ Lua 使用冒号 : 语法(实例方法),JS 和 Python 使用点号 . 语法。此规则适用于所有带索引器的 C# 类型(数组、List、Dictionary 等)。


11. typeof

语言语法
JavaScriptpuer.$typeof(CS.UnityEngine.ParticleSystem)
Luarequire('puerts').typeof(CS.UnityEngine.ParticleSystem)
Pythonpuerts.typeof(ParticleSystem)

12. null 表示

语言脚本侧 null说明
JavaScriptnull / undefined标准 JS 空值
Luanil标准 Lua 空值
PythonNone标准 Python 空值

13. 回调函数 / Lambda

语言示例
JavaScriptobj.Callback = (msg) => { console.log(msg); }
Luaobj.Callback = function(msg) print(msg) end
Pythonobj.Callback = lambda msg: print(msg)

C# 侧获取脚本函数为 delegate:

// 三种语言通用
Action<string> fn = env.Eval<Action<string>>("脚本代码");
fn("hello");

14. 异常抛出

语言语法
JavaScriptthrow new Error('msg')
Luaerror('msg')
Pythonraise Exception('msg')

脚本侧抛出的异常在 C# 侧会被封装为对应的异常类型,可通过 try/catch 捕获。


附:关键 API 对照表

功能JavaScript (puer.xxx)Lua (require('puerts').xxx)Python (puerts.xxx)
泛型类型puer.$generic()puerts.generic()puerts.generic()
泛型方法— (自动推断)puerts.genericMethod()puerts.genericMethod()
typeofpuer.$typeof()puerts.typeof()puerts.typeof()
ref/out 创建puer.$ref(){} (table)[] (list)
ref/out 取值puer.$unref()[1][0]
async/awaitpuer.$promise(task)
索引器读取 []obj.get_Item(idx)obj:get_Item(idx)obj.get_Item(idx)
索引器写入 []obj.set_Item(idx, val)obj:set_Item(idx, val)obj.set_Item(idx, val)

📖 各语言详细教程: