简介

该文章主要参考的是团结社区的一个提问如何实现鸿蒙与团结引擎间的通信 - 技术问答 - Unity官方开发者社区

还有技术开放日广州站 | 全面支持 OpenHarmony,团结引擎共建游戏新生态 - 技术专栏 - Unity官方开发者社区

因为没有真机来测试,也无法知道真机上的具体效果,有知道怎么真机或者模拟器测试API10的hap的可以私信或者留言,谢谢了。

正文

1.在Assets\Plugins\OpenHarmony下创建一个.tslib文件,例如NativeBridge.tslib

创建的时候可以在DevEco Studio中建一个.ts脚本,直接修改其中的代码,然后再修改后缀名放到Unity中,.tslib 文件用于设置导出对象给 C# 使用,把需要导出给 C# 的 ts 对象注册上去,C# 就可以用到这些对象,这个文件的形式有点类似于 Web GL。做的原因也是和安卓有些差异的地方,因为 ts 并没有像 JAVA 有反射的调用,所以我们必须要像 Web GL 平台一样通过导出的行为告诉引擎到底哪些 ts 的接口可以给 C# 来调用。

然后再写一个脚本来测试互相调用的方法,比如HarmonyForTuanjie.ts,这个libtuanjie.so就是主要的库文件,可以export出来OpenHarmony工程来看一下结构,在现有工程上编写代码。

2.把.tslib 文件和.ts文件放到Unity中,export出来可以看到都变成了.ts的文件,可以看下跟Unity端的是不是一致。再查看entry/scr/main/ets/common/TuanjieJSScriptRegister.ts里面是否进行了注册自己写的方法

C#端调用就是使用OpenHarmonyJSClass直接调用静态方法,OpenHarmonyJSObject直接调用普通方法,然后ts向Unity传递消息使用的是tuanjie.TuanjieSendMessage();

跟安卓和Ios差不多,下边是具体的代码

import { StaticClassTest } from  "./HarmonyForTuanjie";
import { ClassTest } from  "./HarmonyForTuanjie";
import sensor from '@ohos.sensor';
export function RegisterNativeBridge(){
  var register = {}
  register["StaticClassTest"] = StaticClassTest;//静态类,使用OpenHarmonyJSClass
  register["ClassTest"] = new ClassTest();//实例类,使用OpenHarmonyJSObject,注意此处需要实例化
  register["senor"] = sensor; //系统api,使用OpenHarmonyJSClass
  return register
}
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("StaticClassTest", "Call")
  static Call(): void {
    console.log("NativeBridge StaticTestClass.Call() 方法被调用了!");
  }

  // 定义一个带参数的静态方法CallX C#调用如下
  // OpenHarmonyJSClass openHarmonyJsClass = new OpenHarmonyJSClass("StaticClassTest");
  // openHarmonyJsClass.CallStatic("StaticClassTest", "CallX", 50)
  static CallX(x: number, callback: Callback<Msg2Unity>): void{
    console.log("NativeBridge StaticTestClass.CallX() 方法被调用了!"+x);
    callback(new Msg2Unity(x.toString(),""));
  }

  // 发送消息到unity C#调用如下
  // OpenHarmonyJSClass openHarmonyJsClass = new OpenHarmonyJSClass("StaticClassTest");
  // openHarmonyJsClass.CallStatic("StaticClassTest", "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() 方法被调用了!");
  }

  // 定义一个带参数的方法CallX C#调用如下
  // OpenHarmonyJSObject jsObject = new OpenHarmonyJSObject("ClassTest");
  // jsObject.Call("CallX", 500);
  CallX(x: number, callback: Callback<Msg2Unity>):void {
    console.log("NativeBridge ClassTest.CallX() 方法被调用了!"+x);
    callback(new Msg2Unity(x.toString()));
  }

  // 定义一个带参数与返回值的方法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{
    return DeviceInfo.deviceType;
  }
  GetUdid(): string{
    // @ts-ignore
    return DeviceInfo.udid;
  }
}

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐