-
Notifications
You must be signed in to change notification settings - Fork 72
如何从原有的PuerTS项目中迁移过来?
僵尸浩 edited this page Jan 26, 2024
·
6 revisions
因为本项目是直接使用宿主引擎,所以实际上只有一个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的需求,则需要你手动做上述的迁移。
/////////////// 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 }
/////////////// 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)