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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容