【Unity3D学习记录#2】Android调用Unity界面 与 信息交互

  • Android 调用 Unity
    • Unity项目构建
    • Android项目构建
  • Android 与 Unity 的信息交互
  • 结语
  • 参考文献

Android 调用 Unity

之前一直在Unity平台上进行开发,被Unity的界面设计困扰,于是想将文字、图片的主要功能放到Android平台上,中间踩过很多的坑,现在将我的步骤总结,希望对后面进行类似工作的朋友有所帮助。本文仅进行最基本的功能测试,用例极为简单,如有其它功能需求,还请自行添加。因为没有经过系统Android学习,使用的术语不准确,如对理解产生障碍,还请见谅。

Unity项目构建

本文使用的Unity3D版本:2019.3.0f6

具体步骤:
1、构建新的3D项目
首先,项目发布平台选择Android,这一步的目的是为了对Game视图进行修改,方便界面的设计与实现(本文选择的视图选项为:1920 x 1080 Portrait(1080 x 1920))。这一步的前提是你已经配置好JDK、SDK的配置,配置的过程在论坛中有很多教程,这里推荐直接使用Unity Hub对Unity3D配置、版本进行管理,能够大大降低出错的可能性。(Unity与Android尽量使用同样的JDK和SDK,否则容易出错)

在场景中建立如下物体:
(1)Text:用来显示接收到的信息
建立Text后会自动建立一个Canvas,需要对其参数进行修改

(2)Button:触发测试代码
(3)Cube:早先留做测试,现已弃用,如不需要操作场景和脚本中可以忽略
建立好的界面大致如下图所示:

2、编写并挂载脚本 Test.cs

using UnityEngine;
using UnityEngine.UI;public class Test : MonoBehaviour
{public Text mtext;//一个旋转物体(弃用)public GameObject cube;void Update(){if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) ){Application.Quit();}}public void OnClick(){print("OnClick执行");/* com.njucm.unity2android : Android工程定义的包名* UnityActivity :java方法(函数)所在的类 */using (AndroidJavaClass jc = new AndroidJavaClass("com.njucm.android2unity.UnityActivity")){print("Android包寻找成功");//jc.CallStatic("sendmessage");using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("m_instance")){print("调用m_instance,尝试调用对象下的非静态函数");if (jo != null){jo.Call("sendmessage");}else{print("m_instance获取失败");}}}//m_instance : UnityPlayerActivity类中自己声明 }public void settextView(string str){print("收到了Android信息,str:" + str);mtext.text = str;}
}

这一部分代码的主要功能为:
①通过AndroidJavaClass,利用Android项目中的包名、类名,获取java中的类。

AndroidJavaClass jc = new AndroidJavaClass(“com.njucm.android2unity.UnityActivity”)

②通过AndroidJavaObject,获取类UnityActivity内的静态数据成员作为对象(Android正在运行的界面)

AndroidJavaObject jo = jc.GetStatic(“m_instance”)

③通过AndroidJavaObject.Call(“函数名”),调用java中的函数(可以加入参数值,但是本文的Android项目内方法没有设置参数,具体使用方法可以到论坛上搜索其他的文章)

jo.Call(“sendmessage”);

脚本需要挂载在Main Camera、Button上,请不要忘记将脚本中的参数实例化(绑定脚本后,拖动场景中的物体进行赋值)。
Button点击事件需要绑定OnClick()函数。

3、项目的导出
依次(->) 点击/执行操作
-> File
-> Build Settings
-> 在Scenes in Build中添加创建的场景
-> Player Settings
-> 修改Company Name、Product Name(本文中分别为njucm、android2unity)
-> Other Settings
-> Package Name,对照内容是否为“com.{Company Name}.{Product Name}”。({ }表示必填,[ ]表示选填)
-> 设置Minimun API Level (本文选择的版本为API Level 19)
-> Player Settings页面设置完毕,回到Build Settings
-> 勾选Export Project

-> 点击Export导出,记住放在哪里了,等等要用

Android项目构建

1、新建Android项目
(1)建立一个Empty Activity

(2)设置Android包名、MIni API Level(需与Unity设置一致)

2、引入之前建立好的Unity项目
依次(->) 点击/执行操作
-> File=>New => Import Module
-> 选择刚刚Unity导出的文件夹,保证launcher和unityLibrary选中,导入(图片是已经导入过了,正常情况不会报错)

-> File->Project Structure->Dependencies
-> 给uniyLIbrary加上unity-classes.jar文件依赖(否则会引起UnityPlayer无法使用)给app加上unityLibrary环境依赖,点击OK(新版本的Android Studio可以不修改复杂的代码就可以进行依赖的修改,但是细节处需要自己调整)

-> 修改依赖方式:
资源管理器 => Gradle Scripts => build.gradle(Module:untiyLibrary) => dependencies{} => 修改关于unity-classes.jar的引用语句:

implementation files(‘libs\unity-classes.jar’)

修改成:

api files(‘libs\unity-classes.jar’)

否则会引起UnityPlayer无法使用。
关于api和implementation两种依赖方式的不同还请到论坛查找,这里不做赘述。

->重新Biuld项目,如未报错则说明导入成功,且依赖修改成功

Android 与 Unity 的信息交互

承接上文
3、修改AndroidManifest.xml文件,要修改两个
(1)untiyLibrary=>manifests文件夹下的:注释掉< intent-filter>标签;
(2)app=>manifests文件夹下的:在之前的< activity></ activity>标签后添加Unity项目的activity(根据代码提示工具即可,现有结果为:

< activity android:name=“com.unity3d.player.UnityPlayerActivity”/>’)

另外,如果这个文件有大片的警示,如下图所示,请将光标放在警示的代码段上,按下alt+enter,根据提示修改错误(否则会页面闪退)


4、修改strings.xml文件。
-> 资源管理器(Android视图):app=>res=>values=>strings.xml
-> 在之前的标签下添加如下语句,否则会Unity页面闪退

< string name=“game_view_content_description”>Game view</ string>

5、编辑java文件。
app=>java=>{包名}文件夹下建立 UnityActivity.Java文件(原文件夹下有MainActivity文件,在这里先不做修改,后面会有其他的操作,总之,后面不会使用这个文件,主要原因是Unity的代码已经写好了,懒得再弄一遍了,嘻嘻,后面你可以自己修改),编写代码:

package com.njucm.android2unity;import android.app.Activity;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;public class UnityActivity extends UnityPlayerActivity {private Button loadBtn;protected UnityPlayer mUnityPlayer;public static UnityActivity m_instance=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//loadBtn = findViewById(R.id.loadBtn);//loadBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startActivity(new Intent(UnityActivity.this,UnityPlayerActivity.class));}});m_instance = this;}public void sendmessage(){UnityPlayer.UnitySendMessage("Main Camera","settextView","this is the message from android");}
}

这个时候R.id.loadBtn会报错,是因为还有文件没有编写完,不用担心。
在Android中我们使用

UnityPlayer.UnitySendMessage("{Object Name}",“Function Name”[,“parameter values”);

方法给Unity的脚本发送消息,实现信息的发送
6、编写app=>res=layout=>activity.xml文件
比较简单,不再多说,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/loadBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Open Unity"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.374"tools:ignore="HardcodedText" /></androidx.constraintlayout.widget.ConstraintLayout>

这个时候R.id.loadBtn报错会消失

7、修改app=>manifests文件夹下的AndroidManifest.xml文件
添加新的UnityActivity,并将其设为MainActivity(首先打开的),修改前内容如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.njucm.android2unity"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="GoogleAppIndexingWarning"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="com.unity3d.player.UnityPlayerActivity"/></application></manifest>

修改后内容如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.njucm.android2unity"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="GoogleAppIndexingWarning"><activity android:name=".MainActivity"></activity><activity android:name="com.unity3d.player.UnityPlayerActivity"/><activity android:name=".UnityActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

8、重新Build项目,运行一下试试吧

可以看到,我们成功打开了Unity的界面,并且在Unity的界面调用了android方法,给Unity发送了消息,修改了Unity的场景物体属性值,实现了极为简单的交互。

结语

本文旨在明确 android调用Unity界面并进行信息交互 实现过程中的问题和步骤,更加复杂的内容还是请各位实现,希望这篇文章能给同行者一些帮助。
至此,完本文毕。

参考文献

1、https://blog.csdn.net/m0_38096376/article/details/69567409
2、https://www.jianshu.com/p/b5e3cfcdf081
3、https://www.jianshu.com/p/b4d5a9afcc99
4、https://blog.csdn.net/qq_39091751/article/details/84023996?ops_request_misc=&request_id=&biz_id=102&utm_term=android%20unity%20%E4%BA%A4%E4%BA%92&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-9-84023996.pc_search_result_no_baidu_js

【Unity3D学习记录#2】Android调用Unity界面 与 信息交互相关推荐

  1. IDL学习记录和Java调用IDL方法

    IDL学习记录和Java调用IDL方法 2018年02月06日 08:32:02 回首1949 阅读数:385更多 个人分类: 随想 版权声明:乐呵乐呵得了 https://blog.csdn.net ...

  2. android编译51单片机,GitHub - whaoming/SCMAndroidCommunicate: Android与51单片机的信息交互...

    SCMAndroidCommunicate Android与51单片机的通信 前言 本篇文章将围绕App与单片机的蓝牙通信来说说lz最近进行开发的一些方案与思考 此文分为三部分: 单片机的PWM与串口 ...

  3. 游戏开发学习记录01-关于在Unity开发的游戏中部署后端云的选择

    目前我还是一名在校学生,而且现在还没有学习数据库方面的知识,所以目前我不具备后端搭建服务器和数据库的知识.所以在之前学习安卓开发过程中,了解到了现在有一种服务-后端云,可以不用费时的去完成后端的开发, ...

  4. android调用拨号界面拨打电话功能,Android实现拨打电话功能

    添加权限: 实现: package com.example.call_person; import android.annotation.SuppressLint; import android.co ...

  5. Unity3d 学习记录

    1.代码中的gameObject表示当前的组件资源对象 2.坐标轴: X:调整左右方向,从左往右值不断增大 Y:调整上下方向,从下往上值不断增大 Z:调整前后方向,离屏幕越近值越小,离屏值越远值越大 ...

  6. unity3D学习记录——1.小球碰撞

    为了防止自己那天忘了,记录一下自己学习记录.纯小白,感觉自己记录的特白痴 1.使用物理材质使小球动起来. 2.记录碰撞次数(private int Null;) 3.使用UI,在游戏界面中建立Text ...

  7. 学习笔记之Android调用系统相册选择图片

    文章目录 前言 使用步骤 小结 参考资料 前言 在相册里选择图片上传也是很常见的功能了例如微信朋友圈等等.但是他们是自定义的选择器,可以选择多张图片并修改.这里我们讲一个最简单的:调用系统的相册选择一 ...

  8. 新浪微博Android客户端学习记录一:完成Logo界面

    http://blog.csdn.net/yanghai0321/article/details/7525919 前不久把<Android开发入门教程>看完,并手敲了大部分的示例代码,对a ...

  9. 新浪微博Android客户端学习记录三:完成登录界面和授权界面

    本讲完成的效果为: 登录界面的布局代码(login.xml)为: <?xml version="1.0" encoding="utf-8"?> &l ...

最新文章

  1. java多线程总结图_Java多线程总结之Queue
  2. ansible-playbook jdk安装
  3. 注意力机制并不是关注输入的位置
  4. 详解const和#define
  5. SharePoint 升级 Web Site 模式
  6. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(三)
  7. linux搜索pdf文件,桌面应用|如何使用 pdfgrep 从终端搜索 PDF 文件
  8. 基于 Docker 搭建 LAMP 环境(一 传统虚拟机形式)
  9. centos 对某ip开放 防火墙端口_CentOS操作系统防火墙Firewalld记录日志及用途
  10. 七夕来临!来支付宝“结个婚”吧 全国5个省市可用
  11. 设置为自动获得IP地址,如何查看当前的IP地址
  12. cat3速度 rj45_RJ45公对母延长线 网络线纯铜cat5宽带5类0.3米长线
  13. 最强蜗牛服务器维护祷告bug,最强蜗牛 这个游戏的玩家太难带了,竟然天天希望服务器有事...
  14. html中如何定义python变量,python怎么定义变量?如何给变量赋值?
  15. Android判断网络状态是否断开
  16. 屏蔽百度广告,百度新闻
  17. 除了两个胖子还有easyman,天弘指数基金是漫画营销圈的MVP!
  18. 【计算机网络】环回接口、lo网卡
  19. SpringCloud之踩的坑
  20. cocos2dx wp8 中文字体 解决方案

热门文章

  1. 劫持cookie原理(淘宝,天猫案例)
  2. 奶白现代简约风格装修
  3. 基于FPGA的帧同步设计
  4. 准确度(accuracy)、精确率(precision)、召回率(recall)、F1值 谈谈我的看法
  5. 【WAF】雷池安装及使用体验
  6. log4j 日志格式详解
  7. iOS应用层架构之CDD
  8. Unity3D Pro 利用摄像头产生俯视地图效果
  9. c++实现文本单词查找
  10. tpm2-tools源码分析之tpm2_createprimary.c(2)