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

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

方法:需要分别处理,游戏画面黑边、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.rhkb.cn/news/392697.html

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

相关文章

帮助网站提升用户参与度的5个WordPress插件

仅靠编写精彩的内容、设计精美的图像和创建简化的客户旅程不足以提高网站参与度。您需要让用户在首次访问后继续与您的网站互动并成为回访者&#xff0c;才能真正吸引您所追求的兴趣。 幸运的是&#xff0c;对于 WordPress 用户来说&#xff0c;有数百种工具可用于提高用户参与…

html实现好看的塔罗牌、十二星座运势网站源码

文章目录 1.设计来源1.1 十二星座1.2 所有界面效果图 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

java网络爬虫

前言 单一个项目的功能需要测试的时候&#xff0c;就需要使用大量的假数据做测试&#xff0c;但是这些数据又不能太假&#xff0c;必须合乎常理。于是我们需要爬虫爬取一些网站的一些允许爬取的数据&#xff0c;来做项目功能测试。 一.确认爬取目标 现在爬取下面三个网站的数据…

常用的GPIO的配置(基于STM32F103C8xx)

绿色&#xff1a;注释 紫色&#xff1a;实际使用代码 //开启GPIOB的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); ①可选输入值&#xff1a;RCC_APB2Periph_GPIOA 或者 RCC_APB2Periph_GPIOB 或者 RCC_APB2Periph_ALL ②可选输入值&a…

【云原生】恰当运用kubernetes中三种探针,确保应用程序在Kubernetes集群中保持健康、可用和可靠

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

电脑录屏软件免费版,分享4款,轻松录制精彩瞬间

电脑录屏已成为创作、教学和分享的热门方式。然而&#xff0c;对于一些用户来说&#xff0c;购买专业的录屏软件可能会增加负担。幸运的是&#xff0c;市场上存在许多电脑录屏软件免费版的选择。它们提供了丰富的功能&#xff0c;让您可以尽情展现您的创意&#xff0c;无须为此…

蝙蝠避障:盲人出行的守护者,让每一步都安心

在这个多彩的世界里&#xff0c;作为一位盲人&#xff0c;我时常感受着出行的种种挑战。每一次踏出家门&#xff0c;都是一场未知的探险&#xff0c;心里难免有些忐忑。街道上的车流声、人群的喧闹&#xff0c;这些对我而言只是模糊的背景音&#xff0c;真正让我担忧的是那些突…

Python对腾讯课程视频链接自动化抓取

近期看到腾讯课堂停服的通知&#xff0c;心痛之余&#xff0c;想到啊&#xff0c;我还有很多课程没看完&#xff0c;就剩下两个月的事件&#xff0c;我也来不及看完了。怎么办&#xff1f; 索性&#xff0c;我研究下&#xff0c;怎么把视频保存下来。 接下来请听我分析。 所…

KMZ格式详解,javascript写入读取KMZ示例

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

SAP中检质操作原因导致的WM和MM库存状态不一致实例分析处理

近期遇到一个问题描述如下&#xff1a; 某个物料通过MM的库存查询MMBE&#xff0c;结果是没有质检库存的。但通过WM的库存查询事务LS24&#xff0c;结果是有Q状态&#xff08;即质检库存&#xff09;的。 不明原因的用户可能会认为这是系统的BUG&#xff0c;但作为一个多年经验…

浅谈 Mybatis 框架

文章目录 一、什么是MyBatis?1.2、JDBC 二、使用Mybatis2.1、配置MyBatis开发环境2.1.1、配置连接字符串2.1.2、配置MyBatis中的XML路径 2.2、使用MyBatis模式和语法操作数据库 三、使用 Mybatis 进行增删改查操作的要点3.1、ResultMap的用法 四、Mybatis操作难点4.1、#{ } 和…

JavaWeb基础1:HTML/CSS/JS/HTTP

JavaWeb基础1&#xff1a;HTML/CSS/JS/HTTP (qq.com)

FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真

目录 前言一、ip核是什么&#xff1f;1.1 定义1.2 分类 二、为什么使用ip核2.1 ip核的优点2.2 ip核的缺点 三、如何使用ip核&#xff08;vivado&#xff09;四、举例&#xff08;clocking wizard ip核&#xff09;4.1 简介4.2 实验任务4.3 程序设计4.3.1 系统模块4.3.2 波形绘制…

连接数据库报错bad handshake

堡垒机账号没有授权访问权限

2024最新最全面的Selenium 3.0 + Python自动化测试框架

文档说明 Selenium是一个用于Web应用程序自动化测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium测试的主要功能包括&#xff1a; 测试与浏览器的兼容性&#xff1a;测试应用程序是否能很好的工作在不同的浏览器和操作系统之上。…

云计算学习——5G网络技术

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 Day1 网络参考模型 Day2 网络综合布线与应用 Day3 IP地址 Day4 华为eNSP网络设备模拟器的基础安装及简单使用 Day5 交换机的基本原理与配置 Day6 路由器的原理与配置 Day7 网络层协议介绍一 Day8 …

Jpa-多表关联-OneToOne

Jpa-多表关联-OneToOne 准备JoinColumnOneToOne属性targetEntitycascade*PERSISTMERGEREMOVEREFRESH orphanRemovalfetchoptionalMappedBy* OneToOne在 hibernate中用于对表与表之间进行维护关联 准备 import com.alibaba.fastjson.JSON; import jakarta.persistence.*; impor…

AI8-文本检测

文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要 解决目标分类问题。 文本在图像中的表现形式可以视为一种‘目标‘,通用的目标检测的方法也适用于文本检测,从任务本身上来 看: • 目标检测:给定图像或者视频,找出目…

本地部署 faster-whisper

本地部署 faster-whisper 1. 创建虚拟环境2. 安装依赖模块3. 创建 Web UI4. 启动 Web UI5. 访问 Web UI 1. 创建虚拟环境 conda create -n faster-whisper python3.11 -y conda activate faster-whisper2. 安装依赖模块 pip install torch2.2.2 torchvision0.17.2 torchaudio…

bilibili实习生一面0625

OSI七层模型 物理层&#xff1a;将帧中的比特传送到下一个节点&#xff08;比特&#xff09; 数据链路层&#xff1a;将数据包装成帧并传送到路径上下一个节点&#xff0c;将相邻节点间不可靠的物理链路变成可靠的逻辑链路&#xff08;帧&#xff09; 网络层&#xff1a;路由寻…