首页 > 其他分享 >【HarmonyOS Next】Unity(团结引擎)对接HarmonyOS

【HarmonyOS Next】Unity(团结引擎)对接HarmonyOS

时间:2024-08-15 17:40:38浏览次数:6  
标签:ArkTS 调用 SDKProxy string C# Next HarmonyOS Unity

一、环境

  • Unity Tuanjie V1.2.3
  • DevEco Studio NEXT Developer Beta1 - Build Version: 5.0.3.402

二、官方资料参考

  1. Unity 鸿蒙https://docs.unity.cn/cn/tuanjiemanual/Manual/openharmony.html
  2. C# 调用鸿蒙 ArkTS https://docs.unity.cn/cn/tuanjiemanual/Manual/openharmony-plugins-typescript-code-from-c-sharp.html

三、对接流程

中国团结引擎团队针对纯血鸿蒙的语言层面调用做了很多封装,比如提供了C# 侧 OpenHarmonyJSClass 类映射到 ArkTS 类实例 ,OpenHarmonyJSObject 类映射到 ArkTS 对象实例。
ArkTS 是 Typescript 的超集 。而 Typescript 和 JavaScript 本身没有像 C# 或 Java 那样内置的完整反射机制。

因此,C# 在调用 ArkTS,需要依靠 ArkTS 侧类的自我注册,让 C# 或是 Unity 知道当前C#可以调用哪个类或是对象实例。

首先,声明你的 ArkTS 类并创建其实例,然后注册它。你的插件扩展名应为 .tslib、.ts 或 .ets。请注意,Tuanjie 只将位于 Plugins/OpenHarmony 目录中的 .ts 和 .ets 文件视为插件。注册函数的名称应匹配以下格式:“Register” + 你的插件名称。

C#侧 SDKProxy 代码示例:

using UnityEngine;

public class SDKProxy : MonoBehaviour
{
    private static OpenHarmonyJSClass openHarmony;

    private static readonly System.Lazy<SDKProxy> LazyInstance = new System.Lazy<SDKProxy>(() =>
    {
        // 定义一个gameobejct挂载脚本
        GameObject gameObject = new GameObject("SDKProxy");
        var instance = gameObject.AddComponent<SDKProxy>();
        // 因为我们在 HarmonyOS 那边调用的是类方法,所以这里需要定义 OpenHarmonyJSClass 类对象作为 C# 的调用入口
        openHarmony = new OpenHarmonyJSClass("SDKHMProxy");

        return instance;
    });

    public static SDKProxy GetInstance()
    {
        return LazyInstance.Value;
    }

    public void Init()
    {
        // 做一些环境初始化等工作。。。
        Debug.Log("SDKProxy Init");
    }

    //C# 层的登录
    public static void Login(string account = "", string pwd = "")
    {
        string userInfo = openHarmony.CallStatic<string>("Login", account, pwd);
        Debug.Log("SDKProxy Login result:" + userInfo);
    }

    //处理来自 HarmonyOS 侧 ArkTS 调用的回调处理
    void NativeBridgeCallback(string msg)
    {
        // 这里需要将 msg 字符串通过约定的json格式,解析成对象,再根据 func 即方法名进行处理,或是对 result 字段进行二次模型转换。处理完,继续C#的逻辑。
        Debug.Log("NativeBridgeCallback:" + msg);
    }
}

C# 调用侧代码示例:

using UnityEngine;

public class Main : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Main Start and SDK init");

        SDKProxy.GetInstance().Init();

        SDKProxy.Login("1111","a123456");
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

ArkTS 侧 SDKHMProxy 代码示例:

import tuanjie from 'libtuanjie.so';

export class SDKHMProxy {
  static Login(account:string, pwd:string){
    console.log("SDKHMProxy account:" + account);
    //调用原生组件处理登录
    //.....

    //在登录成功或是失败的时候,返回结果 .  推荐是 json 格式
    SendMessageToUnity("{func:'Login',result:'{userId:'100001',userName:'test001'}'}");

    //可以通过直接return ,但这需要考虑主线程、多线程一些问题,以及等待、异步操作等因素
    return "{userId:'100001',userName:'test001'}";
  }
}

// 对发送给Unity团结引擎的接口进行二次封装
export function SendMessageToUnity(content:string){
  tuanjie.TuanjieSendMessage("SDKProxy","NativeBridgeCallback",content);
}

export function RegisterSDKHMProxy() {
  let register:object = new Object();
  register["SDKHMProxy"] = SDKHMProxy;
  return register;
}

如果我们导鸿蒙工程的话,需要注意的时候,我们得检查 TuanjieJSScriptRegister.ets 类,确保他注册了我们 RegisterSDKHMProxy的方法.

标签:ArkTS,调用,SDKProxy,string,C#,Next,HarmonyOS,Unity
From: https://www.cnblogs.com/qiyer/p/18361436

相关文章

  • 鸿蒙HarmonyOS NEXT:使用axios方法请求实时天气数据
    通过axios方法请求高德天气查询api,实现获取实时天气数据,接下来是实现步骤:模块导入与数据准备:通过以下语句导入了必要的模块和数据:importaxios,{AxiosResponse,AxiosError}from'@ohos/axios'//导入axiosimport{cities}from'./tools/citys';//调用事先存好的城......
  • 初始化一个Abpvnext项目
    文章目录一、安装ABPCLI安装更新二、使用CLI创建项目命令解析官网连接三、调整项目结构四、配置统一返回结果1.创建响应码枚举2.创建响应实体3.创建响应实体(泛型)五、配置并使用统一返回结果过滤器1.创建NoWrapperAttribute2.创建ResultWrapperFilter3.在HttpApiHost......
  • Unity 通过序列化和反序列化的方式创建深度拷贝Clone方法注意事项
    要将类标记为可序列化在类定义前添加 [Serializable] 属性。[Serializable]publicclassWorkorderAddData{publicintid;publicResponseresponse;[Serializable]publicclassResponse{publicintid;[Serializable]......
  • Unity之UI穿透
    NGUI穿透NGUI出现穿透的时候,通过UICamera.hoveredobject进行判断是否是在UI上即可。问题方法UI穿透到了下方的非UI物体通过EventSystem.current.IsPointerOverGameObject(),if(!EventSystem.current.IsPointerOverGameObject())进行UI逻辑上一层UI穿透到下一层UI(常......
  • 乌尔章6500级超精细插画杰作:绝美女孩的惊艳细节,8K CGUnity壁纸,电影级光影下的羞涩笑容
    6500级乌尔章风格插画,绝美女孩细节惊人,高清CGUnity8K壁纸,光影电影级照明,棕色头发下的光滑肌肤与闪亮流苏上衣,白色高腰短裤,咖啡厅中羞涩微笑,湿润的快乐表情,浅蓝色眼睛,手放腿间,展现顶级品质的官方艺术作品。正向提示词ulzzang-6500,(original:1.2),(realistic:1.3)(m......
  • Unity编辑器批量设置图片格式
    在游戏开发中,经常需要批量设置图片的格式为Sprite类型,手动设置太麻烦,下面的编辑器脚本实现选中文件夹右键/Texture/SetAllImagesToSpriteType实现批量设置图片格式,具体格式参数可自行定义usingSystem;usingSystem.IO;usingUnityEngine;usingUnityEditor;///<summary>......
  • unity中, 二维平面上,求从点A出发,沿着方向B,与线段C的交点
    代码说明:点A:起始点。方向B:一个方向向量,表示从点A出发的方向。线段C:由两个点C1和C2定义。1usingUnityEngine;23publicclassLineIntersection:MonoBehaviour4{5//返回从点A出发,沿着方向B,与线段C的交点。如果没有交点,则返回null6publicstati......
  • Unity中利用遗传算法训练MLP
    Unity中利用遗传算法训练MLP梯度下降法训练神经网络通常需要我们给定训练的输入-输出数据,而用遗传算法会便捷很多,它不需要我们给定好数据,只需要随机化多个权重进行N次“繁衍进化”,就可以得出效果不错的网络。这种训练方式的好处就是不需要训练用的预期输出数据,适合那类可以简单......
  • 在Unity中开发MQTT客户端
    概述:        在Unity环境中使用MQTTnet库(一个流行的.NET库,用于实现MQTT客户端和服务器。它支持.NETCore和.NETFramework,并提供了灵活的API以及高性能的实现)搭建自己的MQTT客户端.我使用的版本:Version=4.3.6.1152        但是在开发客户端之前,你需要......
  • HarmonyOS应用开发者高级认证(一)
    1、依次点击A、B、C、D四个按钮,其中不会触发UI刷新的是:答案: Button("C").onClick(()=>{this.nameList[0].name="Jim"})分析:直接更新非一级数据不会触发UI刷新2、如果要实现Row组件内的子元素均匀排列,且第一个元素与行首对齐,最后一个......