HarmonyOS与Unity团结引擎交互

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里面是否进行了注册自己写的方法。

1280X1280.JPEG

下面是具体的示例代码

  • 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中文件位置
f6032c6f-17a9-42f1-92f9-b72d81c93505.jpg
  • 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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容