Puerts技术解析:如何在JavaScript中高效调用C代码

Puerts技术解析:如何在JavaScript中高效调用C#代码

puerts PUER(普洱) Typescript. Let's write your game in UE or Unity with TypeScript. puerts 项目地址: https://gitcode.com/gh_mirrors/pu/puerts

前言

在Unity游戏开发中,Puerts作为连接JavaScript和C#的桥梁,为开发者提供了极大的灵活性。本文将深入探讨如何在Puerts环境下从JavaScript调用C#代码,帮助开发者充分利用两种语言的优势。

基础调用:Hello World

让我们从最简单的例子开始:

void Start() {
    Puerts.JsEnv env = new Puerts.JsEnv();
    env.Eval(@"
        console.log('hello world');
    ");
}

这个例子中,console.log实际上被Puerts拦截并转换为UnityEngine.Debug.Log调用。这种无缝转换是Puerts的核心能力之一。

对象创建与访问

创建C#对象

在JavaScript中直接创建C#对象非常简单:

console.log(new CS.UnityEngine.Vector3(1, 2, 3));
// 输出: (1.0, 2.0, 3.0)

通过CS命名空间可以访问任何C#类,包括Unity的内置类型。为了简化代码,可以创建别名:

const Vector2 = CS.UnityEngine.Vector2;
console.log(Vector2.one);  // 输出: (1.0, 1.0)

属性与方法访问

访问对象属性和方法与在C#中几乎一致:

const rect = new CS.UnityEngine.Rect(0, 0, 2, 2);
console.log(rect.Contains(CS.UnityEngine.Vector2.one)); // true
rect.width = 0.1;
console.log(rect.Contains(CS.UnityEngine.Vector2.one)); // false

处理特殊语法

ref/out参数和泛型

对于C#特有的ref/out参数和泛型,Puerts提供了专门的解决方案:

// 处理out/ref参数
let p1 = puer.$ref();      // out参数
let p2 = puer.$ref(10);    // ref参数,初始值10
let ret = CS.Example.InOutArgFunc(100, p1, p2);

// 处理泛型
let List = puer.$generic(CS.System.Collections.Generic.List$1, CS.System.Int32);
let lst = new List();

puer.$ref创建可用于out/ref参数的引用变量,puer.$generic用于构造泛型类型。

typeof和运算符重载

在JavaScript中模拟C#的typeof和运算符重载:

// typeof等效
go.AddComponent(puer.$typeof(CS.UnityEngine.ParticleSystem));

// 运算符重载
let ret = Vector3.op_Multiply(Vector3.up, 1600);

异步编程

处理C#的async/await模式:

(async function() {
    let task = obj.GetFileLength('xxxx');
    let result = await puer.$promise(task);
    console.log('file length is ' + result);
})()
.catch(err => {
    console.error(err);
});

通过puer.$promise包装C#的Task对象,可以在JavaScript中使用await语法。

最佳实践

  1. 类型别名:为常用类型创建别名提高代码可读性
  2. 错误处理:始终处理异步调用可能产生的异常
  3. 性能考虑:频繁调用的方法考虑性能影响
  4. 内存管理:注意跨语言调用的内存管理

总结

Puerts为JavaScript调用C#提供了近乎原生的体验,从基础的对象创建到复杂的异步处理,都能优雅地实现。掌握这些技巧可以显著提升Unity开发的效率和灵活性。

在下一篇文章中,我们将探讨反向操作——如何在C#中调用JavaScript代码,完成双向交互的闭环。

puerts PUER(普洱) Typescript. Let's write your game in UE or Unity with TypeScript. puerts 项目地址: https://gitcode.com/gh_mirrors/pu/puerts

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骆万湛Rebecca

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值