Unity-Android常见的那些骚操作

老规矩,先安装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

Unity-Android常见的那些骚操作_第1张图片
Unity-Android常见的那些骚操作_第2张图片
一般在AndroidStudio 里面下载SDK ,也可以在网站下载
https://www.androiddevtools.cn/
Unity-Android常见的那些骚操作_第3张图片
如果是IL2Cpp打包方式的话还需要下载NDK
https://developer.android.google.cn/ndk/downloads/
Unity-Android常见的那些骚操作_第4张图片
Unity-Android常见的那些骚操作_第5张图片
Unity-Android常见的那些骚操作_第6张图片
选择custom 可以在后面安装的时候,自己定义选择安装的位置,不然默认安装在C盘,会非常大Unity-Android常见的那些骚操作_第7张图片

三种BuildSystem的简介
Unity-Android常见的那些骚操作_第8张图片
在这里插入图片描述
这两个方便调试和监测性能
Unity-Android常见的那些骚操作_第9张图片
用原生方式创建签名
Win + R
CMD 打开命令行窗口 cd 到你安装jdk 的目录
Unity-Android常见的那些骚操作_第10张图片
使用命令行创建
在这里插入图片描述
是用Unity Remote 记得先在AndroidStudio 里面安装google use driver 谷歌USB 驱动

设置1
Unity-Android常见的那些骚操作_第11张图片
手机开发者选项设置支持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-Android常见的那些骚操作_第12张图片
Unity-Android常见的那些骚操作_第13张图片
Unity Remote 只能进行一些简单的调试,真正运行还是在Unity 编辑器上运行
所以我们接下来可以进行AVD 调试 ,在AndroidStudio 上创建一个虚拟的设备
Unity-Android常见的那些骚操作_第14张图片
Unity-Android常见的那些骚操作_第15张图片
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210202171444561.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BhbmdQYW5nUGlnMTIz,size_16,color_FFFFFF,t_70

Unity-Android常见的那些骚操作_第16张图片
这里可以选更高版本的Oreo x86_64
Unity-Android常见的那些骚操作_第17张图片
Unity-Android常见的那些骚操作_第18张图片
在这里插入图片描述
接下来便能启动一个真正的设备,纯原生安卓系统
然后我们回到unity build and run 在虚拟设备上运行

不使用AndroidStudio的Logcat 去查看日志,可以使用命令行进入ADB 目录下查看日志
Unity-Android常见的那些骚操作_第19张图片
Unity-Android常见的那些骚操作_第20张图片
还有种办法就是运行夜神安卓模拟器 连接AndroidStudio

接下来讲述的事Unity 打出来的包对设备的适应
Unity-Android常见的那些骚操作_第21张图片Unity-Android常见的那些骚操作_第22张图片

无论后面的窗口有多大,小三角和蓝色原点的距离都不会变

如果需要让背景跟随屏幕大小改变,则
Unity-Android常见的那些骚操作_第23张图片
想让图片按一定的百分比显示在父物体上,
Unity-Android常见的那些骚操作_第24张图片
一般是这样拖 ,或者直接四个三角和4个原点

Unity-Android常见的那些骚操作_第25张图片
手动设置缩放比较麻烦
接下来可以使用Canvas 的缩放
Unity-Android常见的那些骚操作_第26张图片
一般填1280 * 720的分辨率
完成Canvas 的自适应后,接下来是设置视口的自适应
Unity-Android常见的那些骚操作_第27张图片
这种模式是高度自适应,宽度裁剪剔除
只能写脚本,让宽度也自适应
在这里插入图片描述
在这里插入图片描述

这方法只对正交的摄像机有效

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
Unity-Android常见的那些骚操作_第28张图片
在这里插入图片描述
Android 和 IOS

不用EasyTouch 虚拟摇杆 ,而是用Unity自带的资源来实现摇杆
Unity-Android常见的那些骚操作_第29张图片
如果之前安装时没勾选Standard 资源的 请在Hub上下载 或者在Asset Store 搜索Standard 下载
Unity-Android常见的那些骚操作_第30张图片
里面有许多控制的案例,要保证控制开着
Unity-Android常见的那些骚操作_第31张图片
Unity-Android常见的那些骚操作_第32张图片
获取摇杆水平方向上的拖动, 使用Input.GetAxis(“Horizontal”) 获取不值
Unity-Android常见的那些骚操作_第33张图片
Unity-Android常见的那些骚操作_第34张图片

接下来是Unity 与安卓的交互****这一节很重要

Unity 跟安卓交互 在打包APK 上
Unity 可以打包APK ,也可以修改好功能后导出包 到AndroidStudio 上打APK ,在AndroidStudio 上写Java 代码来实现对安卓的调用,,当然也可以将Java 代码打包成Jar 包放到Unity 中调用
Unity-Android常见的那些骚操作_第35张图片Android 里面每一个界面或页面都是一个Activity
Unity 里面所有场景界面只有一个Activity ==> MainActivity
可以在Android 里扩充Unity 的MainActivity 也可以让Android提供Plugins 供Unity 使用
调用方式:
方法可以在Android 里用Java 写 ,也可以在Unity里面用C#写
Unity-Android常见的那些骚操作_第36张图片
新建一个AndroidStudio 工程 语言选Java 然后
Unity-Android常见的那些骚操作_第37张图片
Unity-Android常见的那些骚操作_第38张图片
命完名字后点Finish 即可

Unity-Android常见的那些骚操作_第39张图片
新建空的Activity
Unity-Android常见的那些骚操作_第40张图片
Unity-Android常见的那些骚操作_第41张图片
删掉这个Xml布局
Unity-Android常见的那些骚操作_第42张图片
这句话也删掉
Unity-Android常见的那些骚操作_第43张图片
导入Unity 的支持包,这样才能调用Unity 里面的东西扩展MainActivity里面的东西
E:\Unity2019.3.7f1\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
复制里面的classes.jar 包到Android 工程的 上面创建的那个库的 libs 文件夹
Unity-Android常见的那些骚操作_第44张图片
右键点击jar 包
Unity-Android常见的那些骚操作_第45张图片
添加jar到新建的库
添加完后 界面调回Android
把App AndroidManifest 里的代码复制到创建的库文件里的AndroidManifest
Unity-Android常见的那些骚操作_第46张图片
报红色的就删除, Label 改为应用的名字
Unity-Android常见的那些骚操作_第47张图片
删掉这行时要把小尖括号给到上面
android:supportsRtl=“true”>
lable 是应用显示的名字
在这里插入图片描述
加上这句
Unity-Android常见的那些骚操作_第48张图片

接下来在库里的MainActivity里面写代码
2017版本的jar 包有UnityPlayerActivity
Unity-Android常见的那些骚操作_第49张图片
2019版本的Classes Jar 包里面没有
新版的Unity中UnityPlayerActivity类被单独提取出来,放在Editor\2019.3.15f1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player目录下
(将其与mainActivity.java放到一个目录下,不然mainActivity找不到ta)

完成后,添加一个方法
Unity-Android常见的那些骚操作_第50张图片
接下来选中库 然后 Build
Unity-Android常见的那些骚操作_第51张图片
Unity-Android常见的那些骚操作_第52张图片

新版AndroidStudio生成的模块不在Bundles 文件夹了 而是在
output 的 aar 那里
Unity-Android常见的那些骚操作_第53张图片
把aar 包解压出来
Unity-Android常见的那些骚操作_第54张图片
然后删掉libs 里面的Classes.jar 把外层的classes.jar 拖进去 重新压缩成一个aar 文件
把libs res 以及这个文件夹的AndroidManifest 文件拷贝出来出来放桌面,待会还要用到unity 上

修改AndroidManifest 文件里的包名,为unity里面的包名,包名全部写出小写
Unity-Android常见的那些骚操作_第55张图片

你可能感兴趣的:(unity,android,游戏引擎)