Unity官方文档:团结引擎 - 手册: Call TypeScript plug-in code from C# scripts
首先,声明 TypeScript 类并创建一个它的实例,然后注册它。插件扩展名应该是 .tslib、.ts 或 .ets。请注意,Tuanjie 仅当 .ts 和 .ets 文件放置在 Plugin/OpenHarmony 中时才将它们视为插件。注册函数的名字应该遵循以下格式:“Register” + 插件文件名称。例如创建NativeBridge.tslib插件文件注册函数的名字为RegisterNativeBridge。
注意:Plugins下文件夹名称只能为OpenHarmony,这里的注册函数名称格式为 “Register” + 插件文件名称。例如示例代码中RegisterNativeBridge函数名称。
创建的时候可以在DevEco Studio中建一个.ts脚本,直接修改其中的代码,然后再修改后缀名放到Unity中,.tslib 文件用于设置导出对象给 C# 使用,把需要导出给 C# 的 ts 对象注册上去,C# 就可以用到这些对象,这个文件的形式有点类似于 WebGL。做的原因也是和安卓有些差异的地方,因为 ts 并没有像 JAVA 有反射的调用,所以必须要像 WebGL 平台一样通过导出的行为告诉引擎到底哪些 ts 的接口可以给 C# 来调用。
然后再写一个脚本来测试互相调用的方法,比如HarmonyForTuanjie.ts,这个libtuanjie.so就是主要的库文件,可以export出来OpenHarmony工程来看一下结构,在现有工程上编写代码。
其次,把.tslib 文件和.ts文件放到Unity中,export出来可以看到都变成了.ts的文件,可以看下跟Unity端的是不是一致。再查看entry/scr/main/ets/common/TuanjieJSScriptRegister.ts里面是否进行了注册自己写的方法。
下面是具体的示例代码
- NativeBridge.tslib
import { StaticClassTest } from "./HarmonyForTuanjie";
import { ClassTest } from "./HarmonyForTuanjie";
import sensor from '@ohos.sensor';
// “Register” + 你的插件名称
export function RegisterNativeBridge() {
var register = {}
register["StaticClassTest"] = StaticClassTest; //静态类,使用OpenHarmonyJSClass
register["ClassTest"] = new ClassTest(); //实例类,使用OpenHarmonyJSObject,注意此处需要实例化
register["senor"] = sensor; //系统api,使用OpenHarmonyJSClass
return register
}
- HarmonyForTuanjie.ts
import { Callback } from '@ohos.base'
import tuanjie from 'libtuanjie.so'
import DeviceInfo from '@ohos.deviceInfo'
//自定义回调给unity的数据对象
//C#在callback中通过arg.Get<string>("msg") arg.Get<string>("err")获取值
class Msg2Unity{
msg:string;
err:string;
constructor(msg:string, err:string = "") {
this.msg = msg;
this.err = err;
}
}
//静态方法测试
export class StaticClassTest {
// 定义一个静态方法 Call C#调用如下
// OpenHarmonyJSClass openHarmonyJsClass = new OpenHarmonyJSClass("StaticClassTest");
// openHarmonyJsClass.CallStatic("Call")
static Call(): void {
console.log("NativeBridge StaticTestClass.Call() 方法被调用了!");
}
// 定义一个带参数的静态方法CallX C#调用如下
// OpenHarmonyJSClass openHarmonyJsClass = new OpenHarmonyJSClass("StaticClassTest");
// openHarmonyJsClass.CallStatic("CallX", 50)
static CallX(x: number): void{
console.log("NativeBridge StaticTestClass.CallX() 方法被调用了!" + x);
tuanjie.TuanjieSendMessage("Main Camera","OnMessageCall","test CallX x = " + x);
}
// 发送消息到unity C#调用如下
// OpenHarmonyJSClass openHarmonyJsClass = new OpenHarmonyJSClass("StaticClassTest");
// openHarmonyJsClass.CallStatic("SendMsgUnity")
static SendMsgUnity(): void{
console.log("NativeBridge StaticTestClass.SendMsgUnity() 方法被调用了!");
tuanjie.TuanjieSendMessage("Main Camera","OnMessageCall","test SendMsgUnity");
}
}
//非静态方法测试
export class ClassTest{
// 定义一个方法 Call C#调用如下
// OpenHarmonyJSObject jsObject = new OpenHarmonyJSObject("ClassTest");
// jsObject.Call("Call");
Call(): void {
console.log("NativeBridge ClassTest.Call() 方法被调用了!");
tuanjie.TuanjieSendMessage("Main Camera","OnMessageCall","test Call");
}
// 定义一个带参数的方法CallX C#调用如下
// OpenHarmonyJSObject jsObject = new OpenHarmonyJSObject("ClassTest");
// jsObject.Call("CallX", 500);
CallX(x: number):void {
console.log("NativeBridge ClassTest.CallX() 方法被调用了!"+x);
// callback(new Msg2Unity(x.toString()));
tuanjie.TuanjieSendMessage("Main Camera","OnMessageCall","test CallX " + x);
}
// 定义一个带参数与返回值的方法CallInt C#调用如下
// OpenHarmonyJSObject jsObject = new OpenHarmonyJSObject("ClassTest");
// jsObject.Call<int>("CallInt", 500);
CallInt(x: number): number{
console.log("NativeBridge ClassTest.CallInt() 方法被调用了!");
return x+x;
}
GetDeviceType(): string{
console.log("NativeBridge ClassTest.GetDeviceType() 方法被调用了!");
return DeviceInfo.deviceType;
}
GetUdid(): string{
console.log("NativeBridge ClassTest.GetUdid() 方法被调用了!");
return DeviceInfo.brand;
}
}
- demo中文件位置
- C# 中进行调用
public void StaticClassTest()
{
// 静态类,使用OpenHarmonyJSClass
Debug.Log("StaticClassTest Click");
OpenHarmonyJSClass openHarmonyJsClass = new OpenHarmonyJSClass("StaticClassTest");
openHarmonyJsClass.CallStatic("Call");
openHarmonyJsClass.CallStatic("CallX", 50);
}
public void ClassTest()
{
// 实例类,使用OpenHarmonyJSObject
Debug.Log("ClassTest Click");
OpenHarmonyJSObject jsObject = new OpenHarmonyJSObject("ClassTest");
jsObject.Call("Call");
jsObject.Call("CallX", 500);
var sum = jsObject.Call<int>("CallInt", 500);
var deviceType = jsObject.Call<string>("GetDeviceType");
var udid = jsObject.Call<string>("GetUdid");
Debug.Log("NativeBridge ClassTest Click sum = " + sum + ", deviceType = " + deviceType + ", brand = " + udid);
}
- HarmonyCallBack.cs
using UnityEngine;
public class HarmonyCallBack : MonoBehaviour
{
public void OnMessageCall(string msg)
{
Debug.Log("NativeBridge HarmonyCallBack OnMessageCall msg = " + msg);
}
}