Unity-Android常见的那些骚操作

news2025/1/18 6:50:08

老规矩,先安装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里面的包名,包名全部写出小写
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/678150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware Ubuntu忘记密码修改密码

目录 一、重启 二、重置密码 三、补充 一觉醒来&#xff0c;刚想去虚拟机爽一下Linux却发现忘记了密码&#xff1f; 没关系&#xff0c;这里有详细的步骤帮你修改密码&#xff01; 一、重启 重启虚拟机&#xff0c;在进度条未读完前&#xff0c;长按shift进入GRUB系统引导…

56 KVM工具使用指南-安装 LibcarePlus

文章目录 56 KVM工具使用指南-安装 LibcarePlus56.1 安装软件依赖56.2 安装 LibcarePlus56.3 查看安装是否成功 56 KVM工具使用指南-安装 LibcarePlus 56.1 安装软件依赖 LibcarePlus 运行依赖于 libunwind、 elfutils 和 binutils&#xff0c;在配置了 yum 源的 openEuler 系…

SpringSecurity中授权时fastjson序列化问题

最近在复习Spring Security&#xff0c;复习的鉴权的时候出现问题。26.封装权限信息_哔哩哔哩_bilibili 如果是从B站中看到&#xff0c;直接说问题可能出现的原因&#xff1a;可能是private List<String> authorities;中的权限信息命名不规范&#xff0c;去掉get&#x…

Python基础篇(十一):装饰器

装饰器 前言1. 装饰器的定义2. 装饰器的应用3. 装饰器的语法4. func(*args, **kwargs) 前言 装饰器是Python中一种强大的函数或类修饰机制&#xff0c;用于在不修改原始函数或类代码的情况下&#xff0c;对其进行功能扩展或修改。装饰器基于函数式编程的概念&#xff0c;通过将…

【计算机网络详解】——知识点复习(期末不挂科版)

配套视频&#xff1a;湖科大教书匠 配套教材&#xff1a;计算机网络&#xff08;第8版&#xff09; 谢希仁 根据学习通要求“掌握”的部分总结的&#xff0c;有亿点点长 &#xff0c;时间来不及就掌握画 ☆ 的就好啦 目录 &#x1f552; 1. 概述&#x1f558; 1.1 三种数据交换…

[英语单词] gated; cycle gated

gate *[geit] n. 门, 牌楼, 大门, 通道, 闸 vt. 装门于 门的原始作用就显示出来了&#xff0c;就是为了在主人自由进出的同时&#xff0c;保护私有财产的安全。 如果加了-ed&#xff0c;就代表使用了动词性&#xff0c;相当于给谁谁加了一个门&#xff0c;限制其行为的自由度。…

SpringBoot 如何使用 ACL 进行访问控制

SpringBoot 如何使用 ACL 进行访问控制 在现代 Web 开发中&#xff0c;访问控制是一个非常重要的问题。访问控制可以帮助我们保护敏感信息、防止恶意攻击、维护系统安全等。Spring Security 是一个非常流行的安全框架&#xff0c;它提供了一系列的认证和授权功能&#xff0c;可…

【网络1】协议及相关命令

文章目录 1.局域网&#xff1a;CSMA/CD2.互联网&#xff1a;ARP&#xff0c;DHCP&#xff0c;NAT3.TCP协议&#xff1a;telnet&#xff0c;tcpdump&#xff0c;syn/accept队列4.HTTPS协议&#xff1a;摘要&#xff08;sha、md5、crc&#xff09;。win对文件MD5校验&#xff1a;…

【博弈论笔记】第三章 完全且完美信息动态博弈

文章目录 第三章 完全且完美信息动态博弈3.1 动态博弈的表示法和特点3.2 策略的可信性和纳什均衡的不稳定问题3.2.1 相机选择和策略的可信性问题3.2.2 纳什均衡的不稳定问题3.2.3 逆推归纳法 3.3 子博弈和子博弈完美纳什均衡3.3.1 子博弈3.3.2 子博弈完美纳什均衡 3.4 四个经典…

规则引擎--函数式编程和and/or操作符的设计

目录 Java函数编程的一些基础知识BiFunctionBinaryOperatorstream reduce And, Or操作符and 逻辑 的 Combiner 如下:or 逻辑 的 Combiner 如下:and, or的执行 接上一篇博文&#xff1a;规则引擎–规则逻辑形如“1 & (2 | 3)“的抽象&#xff0c; 重点分析一下And, Or操作符…

反射(reflection)详细讲解

反射(reflection) 反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息&#xff08;比如成员变量&#xff0c;构造器&#xff0c;成员方法等等&#xff09;&#xff0c;并能操作对象的属性及方法。反射在设计模式和框架底层都会用到加载完类之后&#xff0c;在堆…

【博弈论笔记】第四章 重复博弈

文章目录 第四章 重复博弈4.1 重复博弈引论4.1.1 重复博弈定义和意义4.1.2 重复博弈的基本概念 4.2 有限次重复博弈4.2.1 两人零和博弈的有限次重复博弈4.2.2 唯一纯策略纳什均衡博弈的有限次重复博弈4.2.3 多个纯策略纳什均衡博弈的有限次重复博弈4.2.4 有限次重复博弈的民间定…

Python学习笔记(3)--字符串定义、拼接、格式化,表达式格式化,数据输入,布尔数据类型,比较运算符

传送门>B站黑马python入门教程 目录 1.字符串定义方式2.字符串拼接3.字符串格式化3.1 常用占位符3.2 格式化时的数字精度控制3.3 快速格式化字符串 4. 表达式格式化5. 数据输入-input语句6.布尔数据类型、比较运算符 1.字符串定义方式 在 python 语法中,字符串有三种定义方式…

Python爬虫 从小白到高手 Urllib

Urllib 1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序就是一只小蜘蛛&#xff0c;沿着蜘蛛网抓取自己想要的数据 解释1&#xff1a;通过一个程序&#xff0c;根据Url(http…

行为型模式--访问者模式

目录 概述 结构 案例实现 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 概述 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这 些元素的新的操作。 结构 访问者模式包含以下主要角色: 抽象访问者&am…

采用SpringBoot+Tinymce实现文章的在线预览和上传

采用SpringBootTinymce实现文章的在线预览和上传 资源在gitee中 输入信息 预览

canvas详解09-像素操作

到目前为止,我们尚未深入了解 Canvas 画布真实像素的原理,事实上,你可以直接通过 ImageData 对象操纵像素数据,直接读取或将数据数组写入该对象中。稍后我们也将深入了解如何控制图像使其平滑(反锯齿)以及如何从 Canvas 画布中保存图像。 #ImageData 对象 ImageData对象…

el-table渲染二级对象数组

1、序言 项目地址如下&#xff1a;https://gitee.com/liu-wenxin/complexELTable.git 想要渲染这样的数据&#xff1a; el-table官网给的例子都是一级对象数组&#xff0c;如果想要渲染二级对象数组&#xff0c;直接 :table tableData 这样el-table渲染是不成功的&am…

RadEx Pro处理电火花数据操作步骤(下)

RadEx Pro处理电火花数据操作步骤&#xff08;上&#xff09;主要讲述RadEx Pro读取电火花数据&#xff0c;查看数据的质量&#xff0c;以及简单的滤波和振幅纠正。 6、海底拾取&#xff0c;建立流程060 seafloor pick Trace Input加载stack数据集 Trace Header Math&#x…

【人工智能】— 维度灾难、降维、主成分分析PCA、获取旧数据、非线性主成分分析

【人工智能】— 维度灾难、降维、主成分分析PCA、获取旧数据、非线性主成分分析 高维数据与维度灾难维度灾难降维为什么需要降维&#xff1f;PRINCIPLE COMPONENT ANALYSIS主成分的几何图像最小化到直线距离的平方和举例主成分的代数推导优化问题计算主成分&#xff08;Princip…