老规矩,先安装unity,再安装安卓平台,安装AndroidStudio ,安装JDK,安装SDK
配置JDK 环境,在Unity里面引用SDK 和 JDK
Unity中的Android Build Support下载
在Unity中的File>Building Settings>Android>Open Download Page
或在Unity官网下载对应版本的Unity安装助手自行追加安装
JDK下载(请勿使用JDK9,JDK8u152,JDK8u151任选,x64版本出现签名错误的话可以尝试x86版本)
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Android Studio下载(能打开哪个用哪个)
https://developer.android.com/
https://developer.android.google.cn/index.html
http://www.androiddevtools.cn/
链接:https://pan.baidu.com/s/1yliepB4sO5qz2df38-vEHQ
提取码:pang
一般在AndroidStudio 里面下载SDK ,也可以在网站下载
https://www.androiddevtools.cn/
如果是IL2Cpp打包方式的话还需要下载NDK
https://developer.android.google.cn/ndk/downloads/
选择custom 可以在后面安装的时候,自己定义选择安装的位置,不然默认安装在C盘,会非常大
三种BuildSystem的简介
这两个方便调试和监测性能
用原生方式创建签名
Win + R
CMD 打开命令行窗口 cd 到你安装jdk 的目录
使用命令行创建
是用Unity Remote 记得先在AndroidStudio 里面安装google use driver 谷歌USB 驱动
设置1
手机开发者选项设置支持USB 调试,USB 安装
失败原因:
其实并不是手机root没root的原因。
真正的原因是我们操作错误导致无法调试的。
正确操作步骤:
1.将手机插到电脑上(并且保证你的手机开启了调试模式)
2.开启手机中的unity remote软件
3.打开unity(注意:在手机没运行unity remote软件的时候千万不可以开启unity!!)
4.将unity中的Edit->ProjectSettings->Editor->UnityRemote(其中的Device选项选择你当前使用的手机系统Android/IOS)
5.现在,运行你的unity工程吧
6.成功
刚开始我一直试也没用
后面先开remote 再开unity 就可以了
太牛了 哈哈哈哈哈哈哈
Unity Remote 只能进行一些简单的调试,真正运行还是在Unity 编辑器上运行
所以我们接下来可以进行AVD 调试 ,在AndroidStudio 上创建一个虚拟的设备
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210202171444561.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BhbmdQYW5nUGlnMTIz,size_16,color_FFFFFF,t_70
这里可以选更高版本的Oreo x86_64
接下来便能启动一个真正的设备,纯原生安卓系统
然后我们回到unity build and run 在虚拟设备上运行
无论后面的窗口有多大,小三角和蓝色原点的距离都不会变
如果需要让背景跟随屏幕大小改变,则
想让图片按一定的百分比显示在父物体上,
一般是这样拖 ,或者直接四个三角和4个原点
手动设置缩放比较麻烦
接下来可以使用Canvas 的缩放
一般填1280 * 720的分辨率
完成Canvas 的自适应后,接下来是设置视口的自适应
这种模式是高度自适应,宽度裁剪剔除
只能写脚本,让宽度也自适应
这方法只对正交的摄像机有效
using UnityEngine;
public class CamearAdaptation : MonoBehaviour
{
public float initOrthoSize;
public float initWidth;
public float initHeight;
float factWidth;
float factHeight;
void Start ()
{
factWidth = Screen.width;
factHeight = Screen.height;
//实际正交视口 = 初始正交视口 * 初始宽高比 / 实际宽高比
GetComponent().orthographicSize = (initOrthoSize * (initWidth / initHeight)) / (factWidth / factHeight);
}
}
移动端的触屏 Touch 类的一些常见方法
using UnityEngine;
using UnityEngine.UI;
public class TouchDemo : MonoBehaviour
{
public GameObject effectPrefab;
public Text infoText;
GameObject markGo;
string info;
Vector2 touchOrigin;
void Start()
{
Input.backButtonLeavesApp = true;
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
info += "Escape\n";
}
//所有Touch类在PC端均不生效
//每当一个手指触摸屏幕时,Unity都会为其生成一个Touch对象
//Input.touchCount可以获取当前Touch对象的个数
if (Input.touchCount > 0)
{
info = string.Empty;
//以下三行在移动端也生效,带来方便的同时也会带来隐患
info += "GetMouseButton(0) : " + Input.GetMouseButton(0) + "\n";
info += "GetAxis(\"Mouse X\") : " + Input.GetAxis("Mouse X") + "\n";
info += "GetAxis(\"Mouse Y\") : " + Input.GetAxis("Mouse Y") + "\n";
info += "touchCount : " + Input.touchCount + "\n";
//Unity会将当前存在的所有Touch对象放在Input.touches这个数组中
//另一种方式获取指定Index的Touch对象:Input.GetTouch(index);
Touch myTouch = Input.touches[0];
//fingerId是用来识别当前手指的唯一标示
info += "fingerId : " + myTouch.fingerId + "\n";
//deltaPosition当前位置与上次位置之间的差
info += "deltaPosition : " + myTouch.deltaPosition + "\n";
//deltaTime本次记录Touch对象状态与上次记录Touch状态之间的时间差
info += "deltaTime : " + myTouch.deltaTime + "\n";
//Touch对象的生命周期的结束并不是手指离开屏幕后立刻销毁
//如果一根手指在同一位置快速点击,则视作同一Touch对象
//tapCount为Touch对象所对应的手指点击屏幕的次数
info += "tapCount : " + myTouch.tapCount + "\n";
//phase表示当前手指所对应的Touch对象的阶段(状态)
info += "phase : " + myTouch.phase + "\n";
//rawPosition为当前Touch对象所对应的手指的初始(刚按下时)屏幕坐标
info += "rawPosition : " + myTouch.rawPosition + "\n";
//position为当前Touch对象所对应的手指的屏幕坐标
info += "position : " + myTouch.position + "\n";
switch (myTouch.phase)
{
//当一个手指刚按下时,其对应的Touch对象的Phase是Began
case TouchPhase.Began:
touchOrigin = myTouch.position;
markGo = Instantiate(effectPrefab, Camera.main.ScreenToWorldPoint(myTouch.position) + new Vector3(0, 0, 10), Quaternion.identity);
break;
//当一个手指在屏幕上移动时,其对应的Touch对象的Phase是Moved
case TouchPhase.Moved:
//当一个手指在屏幕上按住不动时,其对应的Touch对象的Phase是Stationary
case TouchPhase.Stationary:
markGo.transform.position = Camera.main.ScreenToWorldPoint(myTouch.position) + new Vector3(0, 0, 10);
break;
//当一个手指离开屏幕时,其对应的Touch对象的Phase是Ended
case TouchPhase.Ended:
//当因为某些原因(系统原因)取消对某个手指的追踪时,其对应的Touch对象的Phase是Canceled
case TouchPhase.Canceled:
**滑动手势判断**
if (touchOrigin.x >= 0 && touchOrigin.y >= 0)
{
Vector2 touchEnd = myTouch.position;
float x = touchEnd.x - touchOrigin.x;
float y = touchEnd.y - touchOrigin.y;
if (Mathf.Abs(x) > Mathf.Abs(y))
{
if (x > 0.25f)
{
info += "dir : Right\n";
}
else if (x < -0.25f)
{
info += "dir : Left\n";
}
else
{
info += "dir : Unknow\n";
}
}
else
{
if (y > 0.25f)
{
info += "dir : Up\n";
}
else if (y < -0.25f)
{
info += "dir : Down\n";
}
else
{
info += "dir : Unknow\n";
}
}
}
Destroy(markGo);
break;
default:
break;
}
}
infoText.text = info;
}
}
unity 打包的app 返回键由uniy app 接管
添加此方法可以把返回键功能交还给Android 接管
接管后,app 不会执行Exscap 键里面的功能,而是直接退出app
Android 和 IOS
接下来是Unity 与安卓的交互****这一节很重要
Unity 跟安卓交互 在打包APK 上
Unity 可以打包APK ,也可以修改好功能后导出包 到AndroidStudio 上打APK ,在AndroidStudio 上写Java 代码来实现对安卓的调用,,当然也可以将Java 代码打包成Jar 包放到Unity 中调用
Android 里面每一个界面或页面都是一个Activity
Unity 里面所有场景界面只有一个Activity ==> MainActivity
可以在Android 里扩充Unity 的MainActivity 也可以让Android提供Plugins 供Unity 使用
调用方式:
方法可以在Android 里用Java 写 ,也可以在Unity里面用C#写
新建一个AndroidStudio 工程 语言选Java 然后
命完名字后点Finish 即可
新建空的Activity
删掉这个Xml布局
这句话也删掉
导入Unity 的支持包,这样才能调用Unity 里面的东西扩展MainActivity里面的东西
E:\Unity2019.3.7f1\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
复制里面的classes.jar 包到Android 工程的 上面创建的那个库的 libs 文件夹
右键点击jar 包
添加jar到新建的库
添加完后 界面调回Android
把App AndroidManifest 里的代码复制到创建的库文件里的AndroidManifest
报红色的就删除, Label 改为应用的名字
删掉这行时要把小尖括号给到上面
android:supportsRtl=“true”>
lable 是应用显示的名字
加上这句
接下来在库里的MainActivity里面写代码
2017版本的jar 包有UnityPlayerActivity
2019版本的Classes Jar 包里面没有
新版的Unity中UnityPlayerActivity类被单独提取出来,放在Editor\2019.3.15f1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player目录下
(将其与mainActivity.java放到一个目录下,不然mainActivity找不到ta)
新版AndroidStudio生成的模块不在Bundles 文件夹了 而是在
output 的 aar 那里
把aar 包解压出来
然后删掉libs 里面的Classes.jar 把外层的classes.jar 拖进去 重新压缩成一个aar 文件
把libs res 以及这个文件夹的AndroidManifest 文件拷贝出来出来放桌面,待会还要用到unity 上