Unity3D-消息机制实现与Android的通信

Posted 却把清梅嗅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D-消息机制实现与Android的通信相关的知识,希望对你有一定的参考价值。

Unity 平台能够提供非常强大的 2D3D 特效,相比 OpenGL 而言,使用 Unity 意味着更低的开发成本,更便捷的可视化开发体验。

本文将针对 Unityandroid 平台之间,如何进行双向通信进行总结。

1. Unity项目搭建

首先创建一个简单的项目,创建一个 Canvas,并放一个简单的 Text 文字控件:

接下来编写一个简单的脚本,并将脚本绑定到 Canvas 上:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UnityAndroidTest: MonoBehaviour
   
    // 0. 该成员就是 Canvas 内部的 Text 控件.
    public Text text1;

    void Start()
    
        // 1. 页面初始化时,初始化 Android 通信对象
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        // 2.定义一个int变量
        int res = 0;

        try
        
            // 3.调用Android平台的 increment 自增方法,该方法会返回一个 int 值
            res = jo.Call<int>("increment", 2);
            // 4.将返回值更新到 Text 上
            text1.text = res.ToString();
        
        catch (Exception e)
        
            text1.text = "error";
        
    

    void Update()
    
        
    

    // 5.这里我们向Android平台暴露一个方法,调用后可以改变Text的颜色
    public void ChangeColor()
    
        text1.color = Color.red;
    

简单概括脚本中的功能,当Unity第一次渲染时,会主动调用Android平台的能力,获取一个数字,并展示在上图的Text中;同时,Android 平台可以调用 ChangeColor() 方法,将文字的颜色,从默认的黑色改成红色。

脚本文件我们命名为 UnityAndroidTest.cs,将脚本绑定到Canvas上:

一切就绪,接下来将该项目导出为Android项目即可。

2. Android消息接收和发送

打开Android项目,默认会提供 UnityPlayerActivity 用于对 Unity 提供渲染展示,这里我们仅需在该Activity中追加increment()方法即可:

public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents 
  // ...  
  // 省略其它代码
  // ...
  
  private int count = 1;
  
  // 1.Unity项目中的 UnityAndroidTest.cs 脚本,会主动唤起该方法
  public int increment(int value) 
      count += value;
      // 2.在这个方法中,我们通过发送消息,让 Canvas 执行 ChangeColor 方法
      //   将文字从黑色变成红色
      UnityPlayer.UnitySendMessage("Canvas", "ChangeColor", "");
      
      // 3.最终,将 int 类型的 count = 3 作为桥接方法的返回值返回
      return count;
  

通过一个小的demo完成了 Android 平台与 Unity 的通信,应用页面上展示了一个内容为 3 的红色文字控件:

参考资料 & 不足

感谢 呆呆敲代码的小Y这篇文章 ,其针对如何 Unity 项目中使用 Android 平台代码进行了详细解释,给与了我很大的帮助。

略为遗憾的是,该方式是通过 建立Unity项目 - 导出Android项目 - 编写并导出aar - 导入Unity再次编辑 - 再次导出apk 来实现,整体过于繁琐,无法满足在双平台的开发过程中,频繁修改、联调 的需求。

因此本文针对这种方式进行了简单的优化,将流程简化为 Unity -> Android 的单向开发,但仍然无法解决 平台间增量修改和调试 的问题,下一篇文章中,我们将针对该问题进行进一步讨论。

关于我

Hello,我是 却把清梅嗅 ,如果您觉得文章对您有价值,欢迎 ❤️,也欢迎关注我的 博客 或者 GitHub

以上是关于Unity3D-消息机制实现与Android的通信的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D-消息机制实现与Android的通信

Unity3D-消息机制实现与Android的通信

Unity3d 下websocket的使用

详解Android广播机制

在Unity3D中基于订阅者模式实现事件机制

Android Handler消息机制从原理到应用详解