Skip to content

如何从原有的PuerTS项目中迁移过来?

僵尸浩 edited this page Jan 26, 2024 · 6 revisions

有哪些差异?

JsEnv单例化

因为本项目是直接使用宿主引擎,所以实际上只有一个JS虚拟机。PuerTS本体虽然可以new多个JsEnv,但WebGL下可不能这样干。

你可以在WebGL下直接使用本项目的接口创建JsEnv单例。

#if UNITY_WEBGL
                jsEnv = Puerts.WebGL.MainEnv.Get();
#else 
                jsEnv = new JsEnv();
#endif 

脚本加载流程

首先,在JS加载过程上,puer-webgl和原生puer有一些区别,需要你自己重新实现一套类似Loader的逻辑。参见教学步骤中,构建实际做了什么?

其次,如果你上的是小游戏,小游戏有两点是普洱所无法左右的:不支持Eval不支持自定义require

受此影响,普洱在官方1.4以后版本作了相应的改动,并建议开发者切换为新的使用方式,包括:

  • JsEnv.Eval切换为JsEnv.ExecuteModule,同时require尽量改为import
  • import xxx from 'csharp'切换为CS.xxx

当然这两个改动不仅是为了WebGL,也是为了更贴近JS生态发展标准。

对于旧版本已有的代码,普洱绝不会随意地放弃支持。但如果你有发布至WebGL的需求,则需要你手动做上述的迁移。

迁移例子 - Eval切换为ExecuteModule

/////////////// old style ///////////////
JsEnv.Eval<Action<int, int>>("require('./math-util.js').add");

// math-utils.js
exports.add = function(a, b) { return a + b }

/////////////// new style /////////////////
JsEnv.ExecuteModule<Action<int, int>>("math-util.mjs", "add");

// math-utils.mjs
export function add(a, b) { return a + b }

迁移例子 - import xxx from 'csharp' 切换为 CS.xxx

/////////////// old style ///////////////
import { UnityEngine, PuertsTest } from 'csharp'

/////////////// new style ///////////////
import UnityEngine = CS.UnityEngine;
import PuertsTest = CS.PuertsTest;
  • 示例:可以用一段简单的脚本,通过正则来作以上替换:
var fileContent;
var matcher = fileContent.match(/import\s\{([\w\d\s\,]*)\}\sfrom\s[\'\"]csharp[\'\"]/)
var replacer = matcher[1].split(',').map(i=> i.trim()).map(item=> {
    return `import ${item} = CS.${item}`
}).join('\n');
fileContent = fileContent.replace(/import\s\{([\w\d\s\,]*)\}\sfrom\s[\'\"]csharp[\'\"]/, replacer)