Puerts技术解析:在C中高效调用JavaScript的完整指南

Puerts技术解析:在C#中高效调用JavaScript的完整指南

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

前言

在现代游戏开发中,C#和JavaScript的结合使用变得越来越普遍。Puerts作为一个强大的桥梁,让这两种语言的互操作变得简单高效。本文将深入探讨如何在C#中调用JavaScript函数,以及如何实现更复杂的交互场景。

基础:Delegate调用机制

Puerts最核心的功能之一是将JavaScript函数转换为C#的delegate。这种转换让我们能够在C#侧直接调用JavaScript代码。

基本实现原理

public class TestClass
{
    Callback1 callback1;

    public delegate void Callback1(string str);

    public void AddEventCallback1(Callback1 callback1)
    {
        this.callback1 += callback1;
    }
    
    public void Trigger()
    {
        callback1?.Invoke("test");
    }
}

在JavaScript侧,我们可以这样使用:

const obj = new CS.TestClass();
obj.AddEventCallback1(i => console.log(i));
obj.Trigger();

技术要点

  1. JavaScript函数被转换为C#委托
  2. 调用过程完全遵循C#的事件机制
  3. 类型转换由Puerts自动处理

参数传递:双向数据流动

C#向JavaScript传参

System.Action<int> LogInt = env.Eval<System.Action<int>>(@"
    const func = function(a) {
        console.log(a);
    }
    func;
");

LogInt(3); // 控制台输出3

类型转换规则

  • 基本类型(int, float, bool等)会自动转换
  • 复杂对象会保持引用关系
  • 数组和集合会有特殊处理

获取JavaScript返回值

System.Func<int, int> Add3 = env.Eval<System.Func<int, int>>(@"
    const func = function(a) {
        return 3 + a;
    }
    func;
");

Debug.Log(Add3(1)); // 输出4

性能提示

  • 频繁的跨语言调用会有性能开销
  • 对于性能敏感场景,建议批量处理数据

高级应用:实现MonoBehaviour

结合上述技术,我们可以实现JavaScript版的MonoBehaviour:

public class JsBehaviour : MonoBehaviour
{
    public Action JsStart;
    public Action JsUpdate;
    public Action JsOnDestroy;

    void Awake()
    {
        var init = jsEnv.Eval<Action<MonoBehaviour>>(@"
            class Rotate {
                constructor(bindTo) {
                    this.bindTo = bindTo;
                    this.bindTo.JsUpdate = () => this.onUpdate();
                    this.bindTo.JsOnDestroy = () => this.onDestroy();
                }
                
                onUpdate() {
                    console.log('update...')
                }
                
                onDestroy() {
                    console.log('onDestroy...');
                }
            }

            (function(bindTo) {
                new Rotate(bindTo);
            })
        ");
        
        init?.Invoke(this);
    }
    
    void Update()
    {
        JsUpdate?.Invoke();
    }
}

设计模式分析

  1. 使用桥接模式连接C#和JavaScript
  2. 生命周期方法通过委托绑定
  3. 保持了Unity原有的组件结构

最佳实践与注意事项

  1. 值类型处理

    • 使用值类型参数时,需要添加UsingAction或UsingFunc声明
    • 引用类型可以直接使用
  2. 性能优化

    • 避免在Update中频繁创建委托
    • 考虑使用对象池管理跨语言对象
  3. 内存管理

    • 及时清理不再使用的委托引用
    • 注意循环引用的风险
  4. 调试技巧

    • 使用console.log输出调试信息
    • 可以利用C#的异常捕获机制

结语

通过Puerts,我们实现了C#和JavaScript之间的无缝交互。这种能力为游戏开发带来了更多可能性:

  • 快速原型开发
  • 热更新能力
  • 多语言协作开发
  • 灵活的架构设计

掌握这些技术后,开发者可以根据项目需求,灵活选择在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
发出的红包

打赏作者

段琳惟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值