团结引擎和鸿蒙的消息交互

这篇具有很好参考价值的文章主要介绍了团结引擎和鸿蒙的消息交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

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

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

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

正文

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

鸿蒙 团结引擎是不是只能在真机测试,团结引擎发布鸿蒙,harmonyos,华为

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

鸿蒙 团结引擎是不是只能在真机测试,团结引擎发布鸿蒙,harmonyos,华为

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

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

鸿蒙 团结引擎是不是只能在真机测试,团结引擎发布鸿蒙,harmonyos,华为

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

跟安卓和Ios差不多,下边是具体的代码文章来源地址https://www.toymoban.com/news/detail-849884.html

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;
  }
}

到了这里,关于团结引擎和鸿蒙的消息交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】判断是不是闰年

    闰年的判断方法(两个条件都满足): 1)年份能被4整除 ,但不能被100整除。 2)年份能被400整除。 输入一个年份,判断它是不是闰年  我们可以利用bool或者_Bool的返回值来判断是否为闰年(bool(布尔类型)是一种数据类型,只有真(true)和假(false)两个值) 判断1000~2

    2024年02月06日
    浏览(52)
  • 运维是不是没有出路了?

    瑞典马工的​​《是时候让运维集体下岗了》一出,就让运维人为之一颤,​人人自危。文章开篇就提到:​​明人不说暗话,在云原生和DevOps成熟的今天,运维作为一个岗位和团队已经完成了历史任务,应该退出舞台了。文中​观点令人振聋发聩,虽然我们都知道,随着科

    2023年04月15日
    浏览(38)
  • PostgreSQL 是不是大小写敏感

    如果你踩过 MySQL 的大坑的话就知道:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。 如果你稍加不注意就会出现在本机开发的程序运行一切正常,发布到服务器行就出现表名找不到的问题。 这是我们前一个项目遇到的巨大问题,开发是在 Windows 下进行,但是

    2024年01月25日
    浏览(54)
  • AIGC是不是有点虎头蛇尾

    一、前言 2023年上半年AI与AIGC真是风风火火,不管是技术界还是资本界还是其他任何领域,如果你不知道chatgpt和AIGC,你就是个跟不上时代的人儿。如今大半年过去了,好像这个chatgpt和AIGC比没有太多的人提起,是不是有点虎头蛇尾了呢。了解本博主的人应该知道,本博主并不

    2024年02月09日
    浏览(51)
  • 如何查看自己的网卡是不是千兆网卡

    1、打开自己的设备管理器 2、打开网络适配器 3、右键自己的网卡(第二个) 4、 选择属性,再选择\\\"高级\\\"选项

    2024年02月11日
    浏览(51)
  • Java判断一个实体是不是空的

    在Java中,我们可以使用以下方法来判断一个实体是否为空: 对象是否为null 可以使用Java中的 == 运算符来判断一个对象是否为null,如果对象为null,则表示对象为空。 例如: 字符串是否为空 可以使用Java中的 isEmpty() 方法来判断一个字符串是否为空,如果字符串为空,则返回

    2024年02月13日
    浏览(45)
  • 程序员未来是不是会大量失业?

    程序员宝藏库 :https://gitee.com/sharetech_lee/CS-Books-Store 会,但是主要原因并不是来自最近爆火的AIGC。 生成式AI对比与传统的工具的确很强大,但是要说替代某种工作岗位还为时尚早。最近铺天盖地的相关推文,热度一波未平又起一波,想想前两年的元宇宙、web3就知道,这背后

    2023年04月10日
    浏览(47)
  • bash: 睡觉的冒号;是不是两个点?

    在bash里冒号和躺着的冒号的用法不一样一定要注意别用错。 难道正常的不是两个点)的作用: A sequence expression takes the form {x…y[…incr]}, where x and y are either integers or single characters, and incr, an optional increment, is an integer. When integers are supplied, the expression expands to each number between x

    2024年02月15日
    浏览(41)
  • 3DTile是不是没有坐标的选择?

    可参考以下内容: 一、坐标参考系统(CRS) 3D Tiles 使用右手笛卡尔坐标系;也就是说,x和y的叉积产生z。3D Tiles 将z轴定义为局部笛卡尔坐标系的向上。tileset的全局坐标系通常位于WGS 84地心固定(ECEF)参考系(EPSG4978)中,但它不是必须的,例如,发电厂可以在其本地完全定义用于没

    2024年02月22日
    浏览(47)
  • Flutter页面刷新失败?看看是不是这个原因

    我用flutter开发了一个页面,页面上有一些自己写的控件A,A控件里有一个button,我点击这个A控件里的button的时候,直接在onPressed里调用setState发现页面并没有刷新。 要实现控件A所在页面的整体刷新要怎么实现呢? 在Flutter中,要实现点击控件A中的按钮后刷新整个页面,你可

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包