当我们开发游戏时,如果是开发手机游戏,屏幕窗口的比例是固定的,不会说在运行时改变的。

但是,PC端的游戏就不一定,我希望它能被用户随意拉扯,但完整的内容还是能显示出来,这里我直接放例子:

请注意黑色的部分,可以看到,不管窗口被如何拉扯,游戏的内容还是被完整的显示了出来,窗口能被随意的拉伸,用户的体验更好。

那么来讲一讲Unity如何实现这种效果:

首先是UGUI,UGUI实现有现成的方案,可以通过设置Canvas 和 Canvas Scaler 来适配窗口

关键在于Screen Match Mode 的 Expand(扩展)效果,当我们拉扯窗口时,无论怎样UI都会完整的显示。

演示下效果(效果可能不太直观,见谅):

但问题来了,UI是能适配屏幕的,但是游戏世界是不会适配的。(这句话有歧义,实际是游戏世界的大小是不变的,变的是摄像机的视角)

所以接下来引出问题的关键:

首先,创建一个Sprite,用100*100的纯白图片作为sprite,将Sprite的大小放大为宽16单位,高9单位(符合屏幕比例):

将摄像机的Y坐标设为0,size设为4.5(事前准备),当然这里摄像机为正交类型

Camera 的size是一个很重要的属性,它决定了摄像机的高度的一半对应游戏世界的高度:比如说这里size为4.5,size*2 = 9 个单位,对应了上图。在这里,游戏世界被完整的呈现在屏幕里。

size对应的是摄像机的高度,所以摄像机是有高度适配的,它工作的效果如下:

就算你把屏幕的高度拉的很低,游戏的内容始终会完整的显示在屏幕中。但问题来了,size针对高度,但它不针对宽度,这就有一个问题,比如说我把宽度拉的很小:

游戏的内容并没有完整的显示在屏幕上(右图白色的框对应屏幕大小,灰色对应游戏的对象  大小19:6)

这时候想要让游戏世界完整的显示,显然需要让Camera的size变大,让摄像头屏幕大小包含游戏对象。

脚本 CameraAdjust.cs

 1 using UnityEngine;
2
3 [ExecuteInEditMode]
4 public class CameraAdjust : MonoBehaviour
5 {
6 private const float DEFAULT_RATIO = 16f / 9f;
7 private int m_ScreenWidth;
8 private const float DEFAULT_SIZE = 4.5f;
9
10 private void Start()
11 {
12 m_ScreenWidth = Screen.width;
13 }
14
15 private void LateUpdate()
16 {
17 if (m_ScreenWidth != Screen.width)
18 {
19 m_ScreenWidth = Screen.width;
20
21 float width = Screen.width;
22 float height = Screen.height;
23 float ratio = width / height;
24 if (ratio > DEFAULT_RATIO)
25 {
26 if (Camera.main.orthographicSize != DEFAULT_SIZE)
27 Camera.main.orthographicSize = DEFAULT_SIZE;
28 }
29 else
30 {
31 Camera.main.orthographicSize = DEFAULT_SIZE * (DEFAULT_RATIO) / (width / height);
32 }
33 }
34 }
35 }

效果如下:

这里有两个需要注意的点:

1.Screen.width 和 height 的是int变量,运算时需要转化为float

2.在调试代码时请谨慎使用 [ExecuteInEditMode],在开发时请务必备份场景中的内容。

Unity 如何在窗口大小可以随意改变的情况下让游戏世界完整的显示在镜头中的更多相关文章

  1. pandas sort_values 排序后, index 也发生了改变,不改变的情况下需要 reset_index(drop = True)

    shenpi.sort_values(by=['apply_date'],ascending=True,inplace=True)shenpi.reset_index(drop = True)

  2. @RequestBody,@RequestParam是否能随意改变入参字母大小写

    在工作中遇到了一个问题,很多接口有的入参是companyName,有的入参是companyname,实际上,这两入参能任意适配所有接口,甚至随意改变大小写! 1. @RequestBody是完全按照驼 ...

  3. 【转载】Unity 优雅地管理资源,减少占用内存,优化游戏

    转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D  ...

  4. JavaScript 在不刷新或跳转页面的情况下改变当前浏览器地址栏上的网址

    JavaScript 在不刷新或跳转页面的情况下改变当前浏览器地址栏上的网址 var stateObject = {}; var title = "改变后的网址的标题"; var ...

  5. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  6. QString内部仍采用UTF-16存储数据且不会改变(一共10种不同情况下的编码)

    出处:https://blog.qt.io/cn/2012/05/16/source-code-must-be-utf-8-and-qstring-wants-it/ 但是注意,这只是QT运行(Run ...

  7. 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

    五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...

  8. 【Unity游戏开发】你真的了解UGUI中的IPointerClickHandler吗?

    一.引子 马三在最近的开发工作中遇到了一个比较有意思的bug:“TableViewCell上面的某些自定义UI组件不能响应点击事件,并且它的父容器TableView也不能响应点击事件,但是TableV ...

  9. js 图片区域可点击,适配移动端,图片大小随意改变

    实现图片区域可点击,实际上使用map是可以的,但是适配效果并不好,图片只能是固定大小的值,而且点都被写死了. 在这里,我使用的js基于canvas写的一个小工具.可以圈出你需要点击的部分,然后生成一串 ...

随机推荐

  1. JavaScript学习系列博客_19_JavaScript中方法(method)

    方法 - 听了不少调用什么什么方法,所以方法究竟是啥东西? - 如果一个函数作为一个对象的属性保存,那么我们称这个函数时这个对象的方法,调用这个函数就说调用对象的方法(method). 创建一个对象 ...

  2. 7. oracle表的管理*

    一.表名和列名的命名规则: 1.必须以字母开头 2.长度不能超过30个字符 3.不能使用oracle的保留字 4.只能使用如下字符 A-Z,a-z,0-9,$,#等 二.Oracle数据类型1.字符类 ...

  3. 你所不知道的Spring的@Autowired实现细节

    前言 相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?这就要分析Spring源码才能知 ...

  4. Hadoop上小文件如何存储?

    Block是文件块,HDFS中是以Block为单位进行文件的管理的,一个文件可能有多个块,每个块默认是3个副本,这些块分别存储在不同机器上.块与文件之前的映射关系会定时上报Namenode.HDFS中 ...

  5. 区块链入门到实战(35)之Solidity – 变量作用域

    局部变量的作用域仅限于定义它们的函数,但是状态变量可以有三种作用域类型. Public – 公共状态变量可以在内部访问,也可以通过消息访问.对于公共状态变量,将生成一个自动getter函数. Inte ...

  6. SpringCloud Alibaba Nacos 服务治理中心

    目录 一.什么是Nacos? 二.Nacos能干吗? 三.Nacos关键特性 四.Nacos中的基本概念 五.如何安装部署Nacos? 六.Nacos数据持久化 一.什么是Nacos? 英文全称Dyn ...

  7. 如何利用微博客进行seo赚钱营销

    http://www.wocaoseo.com/thread-130-1-1.html       我们知道做SEO就是用人的思维来模仿搜索引擎的习惯,尽量适应seo的规则,并按照搜索引擎的规则和习惯 ...

  8. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  9. [U3D + GAD]Egametang开源服务器框架资源管理系统

    Egametang开源服务器框架资源管理系统详解 http://m.gad.qq.com/article/detail/36409 ET GitHub https://github.com/egame ...

  10. Spark应用开发-关联分析

    在机器学习中,常用的主题有分类,回归,聚类和关联分析.而关联分析,在实际中的应用场景,有部分是用于商品零售的分析.在Spark中有相应的案例 在关联分析中,有一些概念要熟悉. 频繁项集,关联规则,支持 ...