Unity与Android交互(双端通信)
创始人
2025-05-28 04:41:07
0

前言

最近小编开始做关于手部康复的项目,需要Android集成Unity,以Android为主,Unity为辅的开发;上一篇给大家分享了Unity嵌入Android的操作过程,所以今天想给大家分享一下双端通信的知识;

一. Android与Unity哪个为主?

一般情况下,根据需求来决定Android与Unity的轻重,可以总结为以下两种

1.  将Unity作为Android程序中的一部分进行开发 ,将Unity3D场景当成一个界面或者说是界面的一部分

2.  将Android作为Unity程序中的一部分进行开发,将Android当作一个插件

小编这里由于项目需要,我是以Android为主,Unity辅助

二. Unity端调用Android端方法

实例化AndroidJavaClass对象,用于拿到Android的UnityClass和Activity要用到的接口

实例化AndroidJavaObject对象,是Unity发送消息给Android的关键

//获取Android中com.unity3d.player.UnityPlayer,这个类在Unity3d导出工程的unity-class.jar中
//这是通过反射的机制
AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//获取Android当前正在运行的Activity
AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic("currentActivity");//调用Activity中的无返回值普通方法
androidJavaObject.Call("Android方法名");//调用Activity中的无返回值普通带参方法
androidJavaObject.Call("Android方法名","参数");//调用Activity中返回值String类的普通方法
androidJavaObject.Call("Android方法名");//调用Activity中返回值String类的普通带参方法
androidJavaObject.Call("Android方法名","参数");//调用Activity中返回值int类的普通方法
androidJavaObject.Call("Android方法名");//调用Activity中返回值int类的普通带参方法
androidJavaObject.Call("Android方法名","参数");//调用Activity中的无返回值静态方法
androidJavaObject.GetStatic("Android方法名");//调用Activity中的无返回值静态带参方法
androidJavaObject.GetStatic("Android方法名","参数");//调用Activity中返回值String类的静态方法
androidJavaObject.GetStatic("Android方法名");//调用Activity中返回值String类的静态带参方法
androidJavaObject.GetStatic("Android方法名","参数");//调用Activity中返回值int类的静态方法
androidJavaObject.GetStatic("Android方法名");//调用Activity中返回值int类的静态带参方法
androidJavaObject.GetStatic("Android方法名","参数");

这里列举了一些Unity调用Android的一些初级方法,记住,这种方式的调用最多只能传递一个参数,下一篇将为大家分享高级用法

三. Android端调用Unity端方法 

UnityPlayer.UnitySendMessage("Unity场景物体名","Unity脚本函数名","Unity脚本函数所需参数名");

UnityPlayer为Unity导出包,可以直接引用
UnitySendMessage()方法必须要传递三个参数
第一个参数为Unity场景中脚本挂载的游戏物体名

第二个参数为Unity脚本中的函数名
第三个参数为Unity脚本中函数所需要的参数,可以为空,但必须要有

这里只列举了双端通信的函数调用,可以满足Android与Unity之间参数不多的情况,如果需要大量参数传递的话要采用实现接口的方式在进行,双端通信接口之间的实现下一篇给大家分享

四. 双端通信实战演练

我给大家演示一个Android端控制Unity场景物体移动,并且Unity反过来控制Android端的一个Demo,希望大家能快速喜欢上Unity与Android的乐趣

1. Unity端

我在Unity的场景中创建一个Cube物体,在物体上挂载Move脚本,然后在场景中新建Canvas,Canvas下四个Button按钮,如下图所示

 Move脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Move : MonoBehaviour
{public Button btn_up;public Button btn_down;public Button btn_left;public Button btn_right;private AndroidJavaClass androidJavaClass;private AndroidJavaObject androidJavaObject;private void Start(){androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");androidJavaObject = androidJavaClass.GetStatic("currentActivity");btn_up.onClick.AddListener(AndroidUp);btn_down.onClick.AddListener(AndroidDown);btn_left.onClick.AddListener(AndroidLeft);btn_right.onClick.AddListener(AndroidRight);}public void Up(){transform.Translate(0, 0.5f, 0);Debug.Log("Android端调用了Unity场景Cube物体上的Move脚本中的Up方法");}public void Down(){transform.Translate(0, -0.5f, 0);Debug.Log("Android端调用了Unity场景Cube物体上的Move脚本中的Down方法");}public void Left(){transform.Translate(-0.5f, 0, 0);Debug.Log("Android端调用了Unity场景Cube物体上的Move脚本中的Left方法");}public void Right(){transform.Translate(0.5f, 0 , 0);Debug.Log("Android端调用了Unity场景Cube物体上的Move脚本中的Right方法");}public void AndroidUp(){androidJavaObject.Call("Up");Debug.Log("Unity端调用了Android端的Up方法");}public void AndroidDown(){androidJavaObject.Call("Down");Debug.Log("Unity端调用了Android端的Down方法");}public void AndroidLeft(){androidJavaObject.Call("Left");Debug.Log("Unity端调用了Android端的Left方法");}public void AndroidRight(){androidJavaObject.Call("Right");Debug.Log("Unity端调用了Android端的Right方法");}}

2. Android端

AndroidStudio新建空项目,按照我上一篇集成Unity的文章来操作,然后新建一个类,让这个类继承UntyPlayerActivity,具体步骤如下

MainActivity.java:

package com.example.test;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {private Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this, AndroidToUnityActivity.class);startActivity(intent);}});}
}

activity_main.xml:


AndroidToUnityActivity.java:

package com.example.test;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;import com.unity3d.player.UnityPlayer;public class AndroidToUnityActivity extends UnityPlayerActivity{/*** 声明变量*/private RelativeLayout Unity_View;private Button up_btn,left_btn,right_btn,down_btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_androidtounity);/*** 为变量绑定控件*/Unity_View = (RelativeLayout) findViewById(R.id.UnityView);up_btn = (Button) findViewById(R.id.btn1);left_btn = (Button) findViewById(R.id.btn2);right_btn = (Button) findViewById(R.id.btn3);down_btn = (Button) findViewById(R.id.btn4);/*** 将Unity视图添加到RelativeLayout中*/Unity_View.addView(mUnityPlayer);up_btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {UnityPlayer.UnitySendMessage("Cube","Up","");}});left_btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {UnityPlayer.UnitySendMessage("Cube","Left","");}});right_btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {UnityPlayer.UnitySendMessage("Cube","Right","");}});down_btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {UnityPlayer.UnitySendMessage("Cube","Down","");}});}private void Up(){UnityPlayer.UnitySendMessage("Cube","Up","");}private void Down(){UnityPlayer.UnitySendMessage("Cube","Down","");}private void Left(){UnityPlayer.UnitySendMessage("Cube","Left","");}private void Right(){UnityPlayer.UnitySendMessage("Cube","Right","");}
}

activity_androidtounity.xml:


到此为止,以上就是我的全部源码,大家可以参考一下,要是有问题,我们可以评论区讨论一下

3. 演示效果

Android与Unity双端通信

如果有致力于Android+Unity的小伙伴私信联系我,我们一起交流平时项目中的疑问,一起拓展这片领域

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...