【Unity3D】摄像机适配场景以及Canvas适配

目录

宽度不变策略

高度不变策略


宽度不变策略

开发分辨率 750*1334     (宽高比:0.56)
真机分辨率 1170*2532   (宽高比:0.46)   
真机宽高比<开发宽高比,采用宽度不变策略

理由:小于代表真机高度比开发高度更大,因此不需要担心高度上的遮挡,而应担心宽度的遮挡,为了避免宽度上有遮挡问题,因此保证宽度不变策略;

左图是开发分辨率下的情况(宽度和高度均正常 设计上就是如此)

右图是真机分辨率下适配后的情况,保证宽度不变(可见宽度上的绿色边缘处是紧贴着屏幕边缘),但是高度绿色边缘没有紧贴白色的UI(问题1)(下面的一行白色是UGUI UGUI紧贴着屏幕底下边缘)

不启用适配状况:若不启用摄像机适配会呈现如下图:

宽度会被遮挡一部分!因此我们要保证宽度不变

问题1(高度绿色边缘没有紧贴白色的UI)解决思路:

将整个3D场景所有元素放于一个根节点下,往下移动一定距离来紧贴白色UI

移动的相对距离是  (适配后的摄像机size - 开发时摄像机size),移动后得到如下图

注意相对的是指摄像机空间下的相对距离(Y轴,即上下位移)

如下脚本挂载摄像机下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class CameraAdapt : MonoBehaviour
{//开发宽度private int width = 750;//开发高度private int height = 1334;//摄像机原始sizeprivate float cameraSize;//场景物体根节点public Transform levelTrans;//CanvasScaler组件public CanvasScaler canvasScaler;//场景物体根节点世界位置Vector3 levelWorldPos;void Start(){//记录原始大小cameraSize = GetComponent<Camera>().orthographicSize;//场景世界位置levelWorldPos = levelTrans.position;AdaptCamera();}private void AdaptCamera(){Camera camera = Camera.main;float devRate = (750f / 1334f);float nowRate = (Screen.width * 1.0f / Screen.height);Debug.Log("开发宽高比:" + devRate);Debug.Log("真机宽高比:" + nowRate);//真机宽高比 > 开发宽高比时 , 例如  0.75 > 0.56  (目前是0.56) 说明真机更倾向高度不变策略  少于时更倾向宽度不变bool useHeight = false;if (nowRate > devRate){useHeight = true; //你可尝试注释这一行来查看ipad之类的适配情况,如果依旧保持宽度不变 会发生某些场景物体可能会因高度变小而无法看到。}Debug.Log("Screen.width :" + Screen.width);Debug.Log("Screen.height :" + Screen.height);float changeRate = (width * 1.0f / height) * (Screen.height * 1.0f / Screen.width);Debug.Log(changeRate);//保证高度不变if (useHeight){//原Unity策略就是高度不变,所以不需要任何算法,直接保持原样即可(这里cameraSize就是原始size)float targetHeight = cameraSize;camera.orthographicSize = targetHeight;//修改Canvas的适配为高度不变策略canvasScaler.matchWidthOrHeight = 1;}else{//保证宽度不变float targetWidth = cameraSize * (width * 1.0f / height);camera.orthographicSize = targetWidth * (Screen.height * 1.0f / Screen.width);//修改Canvas的适配为宽度不变策略canvasScaler.matchWidthOrHeight = 0;//在宽度不变情况下,拉长高度而导致场景空白区域变多后,将场景元素向下对齐的方案//即真机摄像机单位高度值 - 开发单位高度值 = 单位高度差值float deltaHeight = camera.orthographicSize - cameraSize;Debug.Log("camera.orthographicSize:" + camera.orthographicSize + ",cameraSize:" + cameraSize + ",deltaHeight:" + deltaHeight);//重置场景根节点世界坐标levelTrans.position = levelWorldPos;//延迟3秒后再偏移,目的是为了看到这个过程是如何变化让场景向下对齐StartCoroutine(DelayToSetPos(deltaHeight));}}IEnumerator DelayToSetPos(float deltaHeight){yield return new WaitForSeconds(1f);//场景根节点世界坐标 转 位于摄像机下的局部坐标Vector3 levelLocalPos = this.transform.InverseTransformPoint(levelWorldPos);//进行高度偏移 (高度单位差) 即向下对齐levelLocalPos = new Vector3(levelLocalPos.x, levelLocalPos.y - deltaHeight, levelLocalPos.z);// 位于摄像机下的局部坐标 转 世界坐标  赋予场景根节点levelTrans.position = this.transform.TransformPoint(levelLocalPos);}// Update is called once per framevoid Update(){//按下空格即可再次适配 (可以动态改Game 分辨率 测试不同分辨率下的情况)if (Input.GetKeyDown(KeyCode.Space)){AdaptCamera();}}
}

其他场景信息:

 

高度不变策略

当真机宽高比 > 开发宽高比时,采用高度不变策略

主要变化就是Canvas Scaler,摄像机size是保持不变的,Unity原本就是高度不变策略。

如果不采用高度不变策略会得到如下图,高度上会有场景元素被遮挡!

注释一行即可测试

 

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

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

相关文章

HarmonyOS:基于axios实现文件的下载以及下载进度的监听

#前言&#xff1a;项目开发中&#xff0c;避免不了实现文件下载功能&#xff0c;其他平台的下载都很成熟&#xff0c;网上的例子也比较多&#xff0c;我就自己项目中实现的下载功能做个总结&#xff0c;你可以参考我的写法实现功能。 下载封装基于axios实现的下载功能。 1.下载…

简单一周日期展示及选择切换

医院挂号&#xff0c;可能需要切换日期&#xff0c;选择一周内的某一天。 提供一周内的日期段&#xff0c;通过点击&#xff0c;切换到不同天。 简单的js&#xff0c;html实例。切换玩调用后台接口&#xff0c;实现后续逻辑。 使用Vue,插值语法&#xff0c;更简单。 一周日历…

二叉树的前,中,后序遍历

我们来了解一下二叉树的遍历&#xff0c;话不多说 二叉树的遍历的概念&#xff1a; 二叉树有四种遍历方式&#xff0c;分别为前序遍历&#xff0c;中序遍历&#xff0c;后序遍历和层序遍历&#xff0c;但我们今天谈谈前三种&#xff0c;并实现它 前序遍历&#xff1a; 按照根…

golang Error的一些坑

golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计&#xff0c;而有一些坑会导致我们的程序发生一些与我们预期不符的问题&#xff0c;开发过程中需要注意。 ​​ errors.Is​判断error是否Wrap不符合预期 ​…

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…

Android14 原生PackageInstaller安装某些apk报错问题

最近遇到Android14安装客户一个大型app的时候&#xff0c;执行到开始安装的时候就直接闪退了&#xff0c;查看log发现下面报错&#xff1a; 03-25 18:01:29.531 3085 3085 E AndroidRuntime: java.lang.RuntimeException: Could not copy bitmap to parcel blob. 03-25 18:01:2…

SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索

在数据驱动的应用开发中&#xff0c;基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架&#xff0c;提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度&#xff0c;系统对比分析SQLAlchemy中关键词搜索的最佳实…

基于 ffmpeg 实现合并视频

ffmpeg是一个强大的多媒体处理工具&#xff0c;支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…

算法每日一练 (20)

&#x1f4a2;欢迎来到张翊尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (20)不同路径 II题目描述解题思路解题代…

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …

sql结尾加刷题

找了一下mysql对extractvalue()、updatexml()函数的官方介绍https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知识点 解释一下这两个参数xml_frag&#xff0c;是xml标记片段&#xff0c;第二个参数…

JVM类加载过程详解

文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a;加载&#xff08;Loading&#xff09;、验证&a…

el-select 可搜索下拉框 在ios、ipad 无法唤出键盘,造成无法输入

下一篇&#xff1a;el-select 可搜索下拉框&#xff0c;选中选项后&#xff0c;希望立即失去焦点&#xff0c;收起键盘&#xff0c;执行其他逻辑 【效果图】&#xff1a;分组展示选项 >【去界面操作体验】 首先&#xff0c;通过 夸克浏览器的搜索: el-select 在 ipad 输入框…

前端框架的定制化:满足项目独特需求

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化转型浪潮中&#xff0c;前端技术体系已成为企业构建数字竞争力的核心战场。当标准化前端框架…

Flutter网络请求封装:高效、灵活、易用的Dio工具类

在Flutter开发中&#xff0c;网络请求是必不可少的功能。为了简化代码、提高开发效率&#xff0c;我们通常会封装一个网络请求工具类。本文基于Dio库&#xff0c;详细介绍如何封装一个高效、灵活、易用的网络请求工具类&#xff0c;支持以下功能&#xff1a; 单例模式&#xf…

MyBatis-Plus(SpringBoot版)学习第一讲:简介入门案例

目录 1. MyBatis-Plus简介 1.1 简介 1.2 特性 1.3 支持的数据库 1.4 框架结构 1.5 代码及文档地址 2. 入门案例 2.1 开发环境 2.2 创建数据库及表 1. 创建表 2. 添加数据 2.3 创建SpringBoot工程 1. 初始化工程 2. 引入依赖 3. IDEA中安装lombok插件 ​编辑 2.4 编…

k8s高可用集群安装

一、安装负载均衡器 k8s负载均衡器 官方指南 1、准备三台机器 节点名称IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在这三台机器分别安装haproxy和keepalived作为负载均衡器 # 安装haproxy sudo dnf install haproxy -y# 安装Keepalived sudo yum …

【PPO】小白的强化学习算法笔记

参考视频 零基础学习强化学习算法&#xff1a;ppo 基础概念 environment环境agent&#xff1a;智能体&#xff0c;玩游戏的你state&#xff1a;当前状态&#xff0c;observation看到的部分&#xff0c;有的游戏只能看见state的一部分action&#xff1a;agent做出的动作reward…

Flink介绍与安装

Apache Flink是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨在所有常见的集群环境中运行&#xff0c;以任意规模和内存级速度执行计算。 一、主要特点和功能 1. 实时流处理: 低延迟: Flink 能够以亚秒级的延迟处理数据流&#xff0c;非常…