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

在这里插入图片描述
在这里插入图片描述
一般在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 在虚拟设备上运行

不使用AndroidStudio的Logcat 去查看日志,可以使用命令行进入ADB 目录下查看日志
在这里插入图片描述
在这里插入图片描述
还有种办法就是运行夜神安卓模拟器 连接AndroidStudio

接下来讲述的事Unity 打出来的包对设备的适应
在这里插入图片描述在这里插入图片描述

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

如果需要让背景跟随屏幕大小改变,则
在这里插入图片描述
想让图片按一定的百分比显示在父物体上,
在这里插入图片描述
一般是这样拖 ,或者直接四个三角和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<Camera>().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

不用EasyTouch 虚拟摇杆 ,而是用Unity自带的资源来实现摇杆
在这里插入图片描述
如果之前安装时没勾选Standard 资源的 请在Hub上下载 或者在Asset Store 搜索Standard 下载
**加粗样式**
里面有许多控制的案例,要保证控制开着
在这里插入图片描述
在这里插入图片描述
获取摇杆水平方向上的拖动, 使用Input.GetAxis(“Horizontal”) 获取不值
在这里插入图片描述
在这里插入图片描述

接下来是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)

完成后,添加一个方法
在这里插入图片描述
接下来选中库 然后 Build
在这里插入图片描述
在这里插入图片描述

新版AndroidStudio生成的模块不在Bundles 文件夹了 而是在
output 的 aar 那里
在这里插入图片描述
把aar 包解压出来
在这里插入图片描述
然后删掉libs 里面的Classes.jar 把外层的classes.jar 拖进去 重新压缩成一个aar 文件
把libs res 以及这个文件夹的AndroidManifest 文件拷贝出来出来放桌面,待会还要用到unity 上

修改AndroidManifest 文件里的包名,为unity里面的包名,包名全部写出小写
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值