Unity模块嵌入到Android中
嗨,大家好,小黑在沉寂了6个月之后,终于要继续写一篇博客了。
先吐槽一波上家公司PHD&&OMS,不吐不快。上家公司的小黑,每天不是在弄UIWidgets,就是再弄UIWidgets,不然就是和它的开发者沟通反馈。。相关的使用项目更是推了重来、推了重来!扯淡的是没有项目经理,没有产品经理,要啥没啥,就让UI出图,那UI只是负责美啊,她们能管得了逻辑么?逻辑有冲突了我不得更改么,然后就让让人作呕的领导喷了,后来学聪明了,逻辑不对去找领导询问怎么更改或者是商量,又让喷了。。啊这?就这? 呵呵呵呵,tui~~
小黑见看不到希望了,所以小黑就开始学习,因为想进游戏公司,就开始学数据结构、学lua(上家公司也是用lua,但是从来没让小黑碰过!),通过学习数据结构了解到了什么是代码严谨性,lua不说了,做为轻量级语言,两天带着元表搞完。然后开始了面试,在五一前后面了不到10家吧,面试官对小黑的态度总结下来就是:打击、激励、安慰、嘲讽、赞赏。。。嘲讽的这个真的是小黑心态崩了,面试官问了很多,但是第一道很简单:问点是否在圆内。面完之后小黑本人还觉得面的不错,但最后接到的反馈:勾股定理都不会??。。。。。FUCK,那我回答的时候,面试官想知道勾股定理倒是点我一下啊,我给你说不就好了?? 问题是驴唇,要的答案是马嘴,啥也不说了,也怪小黑自己菜,回答解题思路时应该把能想到的都说一遍!!!
吐槽完了,言归正传,我们开始学习。
目录
今天学习:Unity模块嵌入到Android中
版本:
1、Unity 2020.3.10f1
2、Android Studio 4.2.1
1、在Unity准备自己相应的工程文件
1、搭建简单场景
2、创建并且编写脚本
代码很简单,有错误的地方大家指出,我来更改。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class RoutationTest : MonoBehaviour
{
public Toggle _toggle;
public Button _button;
void Start()
{
_toggle.onValueChanged.AddListener(delegate
{
if (_value == 0000.1f)
_value = -0000.1f;
else
_value = 0000.1f;
});
_button.onClick.AddListener(()=>
{
Debug.Log("输出: 返回按钮被触发.");
backNavtive();
});
}
float _value = 0000.1f;
void Update()
{
this.transform.RotateAround(Vector3.up, _value);
}
//用来调用Java端的函数
private void backNavtive()
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaClass __javaClass = new AndroidJavaClass(" 包名 . java类名");
//AndroidJavaObject __jo = __javaClass.Get<AndroidJavaObject>("currentActivity");
__javaClass.CallStatic("BackToNative", "输出:给原生传递的返回参数");
#endif
}
//用来给Java端调用的函数
public void ChangeRotation(string msg)
{
Debug.LogWarning("Unity端输出:" + msg);
_toggle.isOn = !_toggle.isOn;
}
}
3、挂载脚本
注意事项:
①、既然是要嵌入到Android中并且进行交互,那包名最好一样(当然也可以不一样,不过就需要多做些事情);
②、Android再与Unity交互中,是通过UnityPlayer.UnitySendMessage(物体名 , 函数名 , 参数 );所以场景中的名字要记住,本文中交互代码挂载到了Cube上,其下边交互函数为ChangeRotation。
③、构建框架要选择ARMv7
4、打包发布Unity为Andoird工程
5、查看发布文件
下边的文件夹中,缺一不可(当然,成功打包也是不会缺少的,除非自己删除掉、或者打包失败)。
2、准备在Android端嵌入Unity工程文件。
目前就小黑自己摸索来说有两个办法:
1、你是一个Andoird工程师
你是一个Andoird工程师,会使用Android Studio,那么到了这里你也知道知道怎么与你的工程相融合了。
Ⅰ、直接File > New > Import Moudle > 选择路径 > 导入
Ⅱ、开始解决各种报错(目前小黑遇到的是一些SDK版本不一致问题,直接改掉就好)
2、非Andoird工程师
非Andoird工程师,和小黑一样只会一些基础,直接用Android Studio打开我们刚才发布出来的工程。
1、导入编译
经过一点时间编译后,系统会在AS某个角落(通常是右下角)提示更新Gradle,直接更新。
2、解决报错
然后看我们的结构目录:里边launcher下的build.gradle与unityLibrary下的build.gradle可能会出现SDK版本问题。这时候改为自己的SDK版本号,然后同步Sync Now就ok了。
3、Make Project and Run
①、创建AS自带的虚拟机,然后打包至虚拟机运行,看我们的交互逻辑是否能被正常触发。
②、为了保险起见,我们打开自己的Android测试机,然后打开开发者开启调试,安装至真机测试。
好了,伙伴们都没有问题了吧? (什么?不行? emmmmm,从上面再来一遍)。没问题的我们接着往下走啊。
4、完成双端交互
①、Unity 给 Android 发送消息
我们在测试的时候,发现我们Unity端的按钮点击后会报错,不要慌张,我们现在开始解决!他报错内容无非就是在com.unity3d.player这个包体下边,缺少UnityPlayerActivityTest这个类,那我们直接创建一个就好了。
那我们创建好了之后,发现还是报错,简单不是?接着创建,别忘了是静态函数啊,我们在Unity端写的是CallStatic。
好了,至此unity给android发送消息成功了。
②、Android 给 Unity 发送消息
如果我们没有原生交换按钮,那为了方便测试,我们就直接可以在AS里被Unity调用的函数中,再次调用给Unity发送消息。
然后我们Run起来,点击程序中左上角按钮:返回Navtive。
这时候我们看Log,发现成功了。是不是nice~~
那么,至此, Unity与Android之间的交互算是彻底完成。我们接下来要进行在Android中嵌入Unity了。
5、在Android中嵌入Unity
上面我们只是简单的创建了一个Java类,那我们启动时,其实是启动的Unity的Activity,而这个东西小黑暂时不会获取,那如何嵌入?怎么办? 没办法,所以只能自己把上边的类增加了一个Activity,这个类继承Activity就好了,如果继承了AppCompatActivity,就需要实现AppCompat了。
接着我们发现res的目录结构中,多了一个layout,下边的xml文件就是我们可以自己操作的UI面板,右上角上边有三个不同的展示面板,我们做一个很简单的事情,例如增加一个文本?
正事儿开始:
①、增加一个LinerLayout(unityPanel),用来呈现Unity端内容
②、增加一个LinerLayout(navtivePanel),用来呈现Unity端内容
③、增加一个按钮(btn_CallUnity),用来给Unity发送消息。
④、增加一个按钮(btn_Activity)用来控制原生页面显隐。
⑤、开始写代码,不要介意小黑的代码风格啊。。。。。
package com.unity3d.player;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
/**
* 用来和Unity交互并且展示原生按钮
*/
public class UnityPlayerActivityTest extends UnityPlayerActivity {
private static UnityPlayerActivityTest _Instance;
@Override
protected void onCreate(Bundle savedInstanceState) {
_Instance = this;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_unity_player_test);
_btnCallUnity = findViewById(R.id.btn_CallUnity);
_btnActivity = findViewById(R.id.btn_Activity);
_AndroidLiner = findViewById(R.id.navtivePanel);
_unityLiner = findViewById(R.id.unityPanel);
_unityLiner.addView(mUnityPlayer.getView());
_btnActivity.setOnClickListener((vb)->
{
openActivity(true);
});
_btnCallUnity.setOnClickListener((view)->
{
CallUnityMessage("我来自Android端,要改变Unity中Cube的旋转方向");
});
}
Button _btnCallUnity, _btnActivity;
//ConstraintLayout ;
static LinearLayout _unityLiner,_AndroidLiner;
/**
* 用来控制原生的面板显隐
* @param isopen:开关选项
*/
private static void openActivity(boolean isopen){
if (!isopen){
_AndroidLiner.setVisibility(View.INVISIBLE);
}
else{
_AndroidLiner.setVisibility(View.VISIBLE);
}
}
/**
* 用来给Unity发送消息
* @param msg:要给Unity发送的消息
*/
private void CallUnityMessage(String msg){
//因为我们直接用的Unity的包名,所以我们不需要增加引用
UnityPlayer.UnitySendMessage("Cube","ChangeRotation",msg);
}
/**
* 用来接收Unity端口发来的消息
* @param msg :Unity发的消息
*/
public static void BackToNative(String msg){
Log.w("BackToNative: ", "Android端接收到内容为:" + msg);
openActivity(false);
}
}
6、Make And Run
随便点击开始吧,不同的按钮我们都能区分出来是Andorid原生按钮还是UnityUI按钮。
至此,我们在Android中嵌入Unity已经全部完成了
别忘了打包真机进行测试,我们做程序的一定要严谨,一定要真机测试!
唠家常
- 小黑的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加小黑的QQ:841298494,大家一起进步。
今日无推荐
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
Unity模块嵌入到Android中的更多相关文章
- (转载)Android中的Service:Binder,Messenger,AIDL(2)
前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...
- h5学习-h5嵌入android中
嵌入Android中的h5界面: 将此页面复制到android项目中的assets目录下边: <!DOCTYPE html> <html lang="en"> ...
- Android中添加自己的模块 【转】
本文转载自:http://wallage.blog.163.com/blog/static/17389624201021791333695/ 转:http://blog.csdn.net/yili_x ...
- Android中JNI编程的那些事儿(1)
转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...
- Unity 发布到IOS,Android的各种坑
Unity 发布到IOS的注意事项1.开发环境MAC环境:Xcode环境 7.2.1Unity环境:Unity5.32.基本说明首先,我说一下,这是我在对Unity发布到IOS的实际使用中,总结出来的 ...
- 面向Unity程序员的Android快速上手教程
作者:Poan,腾讯移动客户端开发 工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 随着Unity.cocos2dx等优秀跨平台游戏引擎的出现,开发者可以把 ...
- Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...
- Android中通信协议
一.TCP/IP协议(传输层协议) 1.Socket与ServerSocket Socket是应用层与TCP/IP协议簇通讯的中间抽象层,Socket是一组接口,在设计模式中,Socket的设计就是门 ...
- Android中仿IOS提示框的实现
前言 在Android开发中,我们有时需要实现类似IOS的对话框.今天我就来总结下,如何通过自定义的开发来实现类似的功能. 自定义Dialog 我们知道Android中最常用的对话框就是Dialog及 ...
- Ionic中使用Chart.js进行图表展示以及在iOS/Android中的性能差异
Angular Chart 简介 在之前的文章中介绍了使用 Ionic 开发跨平台(iOS & Android)应用中遇到的一些问题的解决方案. 在更新0.1.3版本的过程中遇到了需要使用图表 ...
随机推荐
- Dropout原理分析
工作流程 dropout用于解决过拟合,通过在每个batch中删除某些节点(cell)进行训练,从而提高模型训练的效果. 通过随机化一个伯努利分布,然后于输入y进行乘法,将对应位置的cell置零.然后 ...
- OpenFOAM 编程 | 求解捕食者与被捕食者模型(predator-prey model)问题(ODEs)
0. 写在前面 本文问题参考自文献 \(^{[1]}\) 第一章例 6,并假设了一些条件,基于 OpenFOAM-v2206 编写程序数值上求解该问题.笔者之前也写过基于 OpenFOAM 求解偏分方 ...
- perl静态变量
state操作符功能类似于C里面的static修饰符,state关键字将局部变量变得持久. state也是词法变量,所以只在定义该变量的词法作用域中有效,举个例子: #!/usr/bin/perl u ...
- 使用位运算优化 N 皇后问题
使用位运算优化 N 皇后问题 作者:Grey 原文地址: 博客园:使用位运算优化 N 皇后问题 CSDN:使用位运算优化 N 皇后问题 问题描述 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇 ...
- CPU cache知识 —— ARM架构cache结构和细节
cache如何寻址 处理器访问cache时,cache电路会将CPU地址进行解码,分成3个部分,分别是: offset: 用于某个cache line -- 字抽取: index: 用于匹配某个cac ...
- Spring Boot 多数据源配置
第一种方式: AbstractRoutingDataSource 1.1. 手动切换数据源 application.properties # Order # 如果用Druid作为数据源,应该用url属 ...
- Linux面试题2:网络IO模型 & IO多路复用
网络IO 先确定一下范围,我们讨论的都是网络IO,现阶段计算机早已经从CPU密集型转换成网络IO密集型,所以网络io的类型对于服务响应而言更重要. 五种IO模型 依据Unix的IO分类,网络IO分为五 ...
- js 金钱3位格式化
function formatCash(str) { return str.split('').reverse().reduce((prev, next, index) => { return ...
- 2022年鲜为人知的CSS 特性了解起来~
前言 随着CSS的不断发展,一些很酷且有用的属性要么完全被忽视,要么由于某种原因不像其他常见属性那样被开发者熟练应用.这篇文章我们将一起学习那些CSS中陌生但非常有用的CSS属性,这些属性你可能听说过 ...
- ArcGIS QGIS学习二:图层如何只显示需要的部分几何面数据(附最新坐标边界下载全国省市区县乡镇)
目录 前言 准备SHP数据 ArcMap 的筛选 QGIS 的筛选 如何编写查询条件 前言 当我们用GIS软件打开一个SHP文件的时候,会显示出里面全部的几何图形,假如我只想要其中的一部分数据显示出来 ...