Unity实现屏幕黑边--游戏画面和UI异形屏处理(安全区渲染)

news/2024/11/13 9:14:46/

在手机上,如果想以黑边形式显示游戏画面,比如显示区域避开异形屏、水滴屏那一行。有很多种思路,最后觉得下面这种方法比较简单合适,下面分享一下。

方法:需要分别处理,游戏画面黑边、UI黑边:

1,游戏画面黑边----主相机+临时Canvas

【主相机】

挂上如下脚本 M_Cam_SafeArea.cs:

using UnityEngine;// 处理游戏画面的安全区渲染, 挂在主相机上即可 
public class M_Cam_SafeArea : MonoBehaviour
{// 用于产生黑边固定色的临时canvaspublic GameObject blackCanvas_pref;public int frame_num = 0;private Rect lastSafeArea = new Rect(0, 0, 0, 0);private Camera mainCamera;private GameObject blackCanvas;void Awake(){mainCamera = Camera.main;ApplySafeArea();// 专门生成初始黑边的canvasblackCanvas = Instantiate(blackCanvas_pref);}void Update(){/*// 也可以每帧检测,如果安全区发生变化则更新布局if (lastSafeArea != Screen.safeArea){ApplySafeArea();}*/frame_num += 1; // 得是第2帧以后, 删除专用黑边canvas才行。以清除第一帧渲染的残留if (frame_num == 2){Destroy(blackCanvas);} }void ApplySafeArea(){Rect safeArea = Screen.safeArea;// 计算安全区的归一化坐标float xMin = safeArea.x / Screen.width;float yMin = safeArea.y / Screen.height;float xMax = (safeArea.x + safeArea.width) / Screen.width;float yMax = (safeArea.y + safeArea.height) / Screen.height;// 设置相机的视口,使内容位于安全区内// width, height, x(距离屏幕左边缘), y()mainCamera.rect = new Rect(xMin, yMin, xMax - xMin, yMax - yMin);lastSafeArea = safeArea;}
}

【临时Canvas】

默认的canvas即可。然后新建一个可以铺满屏幕的image。

image,可以自定义你想要的“黑边“”颜色。比如红色(下面用红色,以免黑边在模拟器里看不清界限)。

制作好黑边canvas后,把其拖入主相机的M_Cam_SafeArea脚本的对应属性栏里:

OK,我们运行一下,看看效果(注意,运行后1帧,这个黑边canvas就被销毁了):

2,UI黑边(UI只在安全区渲染)

再新建一个Canvas,这个就是游戏逻辑用的Canvas了,渲染模式为SSO模式的(如果是SSC,也就是3D相机的话,就可以直接走主相机了):

新建一个UI元素,名为SafeArea。

设置如下(四边角适应,并挂接下面要写的脚本):

UI_SafeArea.cs脚本:

using UnityEngine;public class UI_SafeArea : MonoBehaviour
{RectTransform rectTransform;Rect safeArea;Vector2 minAnchor;Vector2 maxAnchor; void Awake(){rectTransform = GetComponent<RectTransform>();safeArea = Screen.safeArea;Debug.Log(Screen.height + "*" + Screen.width); Debug.Log(safeArea);minAnchor = safeArea.position;maxAnchor = minAnchor + safeArea.size;minAnchor.x /= Screen.width;minAnchor.y /= Screen.height;maxAnchor.x /= Screen.width;maxAnchor.y /= Screen.height;rectTransform.anchorMin = minAnchor;rectTransform.anchorMax = maxAnchor; }
}

好。到此UI的安全区就设置完毕了。游戏中需要的UI,放入SafeArea节点下,即可。

【完整试验】

比如,下面我们放入2个元素,一个文本,在上中位置。一个图片,在左下位置:

运行,看看不同机型的效果, OK, 完美匹配:

ps. 额外引申:

如果需要固定显示宽高比,然后黑白显示,参考这个:

https://www.youtube.com/watch?v=PClWqhfQlpU


http://www.ppmy.cn/news/1505643.html

相关文章

免费https证书申请和安装

一、申请免费SSL证书 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; 对于个人博客、小型企业网站或非盈利组织&#xff0c;可以选择JoySSL等提供免费SSL证书的服务商。JoySSL因其完全免费和广泛支持的特点而受到许多用户的青睐。用户注册-JoySSLhttps://www.joyssl…

.NET C# 将文件夹压缩至 zip

.NET C# 将文件夹压缩至 zip 文章目录 .NET C# 将文件夹压缩至 zip1 使用 System.IO.Compression1.1 环境1.2 压缩文件夹1.2.1 简单压缩1.2.2 复杂压缩 1.3 解压缩1.3.1 简单解压缩1.3.2 复杂解压缩 2 使用 SharpZipLib2.1 环境2.2 压缩文件夹2.3 解压缩 3 压缩效果简单测试 1 …

前端 CSS 20道面试题详解

引言 CSS 是前端开发中不可或缺的一部分&#xff0c;掌握 CSS 的基础知识和技巧对于前端开发者来说至关重要。本文将通过 20 道常见的 CSS 面试题&#xff0c;帮助你巩固 CSS 知识&#xff0c;准备面试。 1. 什么是盒模型&#xff1f; 答&#xff1a;盒模型是 CSS 中描述元素…

SpringBoot+Vue 简单小文章项目开发全过程

文章目录 一、项目介绍二、需求设计三、数据库设计四、项目构建项目技术选型:构建项目说明:项目架构mavenMySQLRedis 五、项目开发&#xff1a;项目开发思路&#xff1a;项目开发过程&#xff1a;1. 导入文件包/新建项目2. 新建子模块&#xff1a;common模块pojo模块server模块…

YN35V00018F2、KDRDE5K-31/30C40-111比例插装阀控制器

KDRDE5K-31/30C40-111、SKX5P-17-209、KDRDE5K-20/40C04-109、YN35V00049F1、KDRDE5K-31/40C50-213、111-9916、KDRDE5K-31/40E30-137、YN35V00019F1、KDRDE5K-31/30C40-101、YB35V00005F1、KDRDE5K-31/30C50-107、YB35V00004F1、KDRDE5K-20/30C12A-111、YN35V00048F1、KDRDE5K…

can not insert null to xxx.(ID)

场景&#xff1a; 在执行保存方法时报错can not insert null to xxx.(ID) 分析&#xff1a; 这个错误表明时因为数据库id设置了主键唯一且不为空&#xff0c;而插入的时候为null所以报错&#xff0c;我的项目使用的oracle数据库&#xff0c;跟mysql数据库直接设置自增不一样&…

大数据-68 Kafka 高级特性 物理存储 日志存储概述

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

故宫小程序(2024/08/06)

准备工作 WeChatOpenDevTools&#xff0c;开启小程序F12调试mtimproxy 对接口响应拦截修改&#xff0c;方便调试后面的流程 难度 rsa res base64 混用 url https://lotswap.dpm.org.cn/lotsapi/merchant/api/fsyy/calendar?parkId11324&year2024&month08&merch…