Unity实用功能之使用Display分屏及获取屏幕号 您所在的位置:网站首页 iphone143分屏 Unity实用功能之使用Display分屏及获取屏幕号

Unity实用功能之使用Display分屏及获取屏幕号

#Unity实用功能之使用Display分屏及获取屏幕号| 来源: 网络整理| 查看: 265

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

概述

在日常开发中,经常会遇到多屏幕开发,就是所谓的分屏。本片文章就主要介绍一下,在Unity中如何使用分屏功能,以及如何获取当前鼠标点击的是哪一个屏幕。

功能实现

在Unity中使用分屏功能方法有很多种,这个需要根据项目需求具体分析,本篇文章主要使用的是多摄像机分屏,共分为五个屏幕。

分屏场景搭建

在Unity中创建五个摄像机,五个Canvas

image.png

然后修改相机和Canvas参数,这里面都是修改Target Display,只有修改成对应的Display,canvas上的内容才会显示在UI应的相机屏幕中

image.png image.png

接下来就是修改Game视图中的Dispay,只有Game视图中的Display也修改了才能显示对应的摄像机画面

image.png

Display详解

Unity官方文档地址 官方文档中叫 Multi-display,其解释为可以使用多显示器同时在最多八个不同的监视器上显示最多八个不同的应用程序视图。可以将其用于 PC 游戏、街机游戏机或公共显示装置等设置。 Unity 支持多显示器:

独立平台(Windows、macOS X 和 Linux) Android(OpenGL ES 和 Vulkan) IOS UnityDisplay分屏目前最多支持8个屏幕

捕获.PNG 具体的场景搭建已经在上面写过了,但是场景搭建完成还不行,还需要将屏幕激活,才可以使用,因为Unity的默认显示模式是仅一台显示,所以运行应用程序时,需要使用Display.Activate()显式激活其他显示。 一旦激活显示器,就无法将其停用。

for (int i = 0; i < Display.displays.Length; i++) { Display.displays[i].Activate(); Screen.SetResolution(Display.displays[i].renderingWidth, Display.displays[i].renderingHeight, true); } 复制代码

更多有关Display的方法请查看光放API

获取屏幕号

这里有一点需要注意的就是 Display.displays.Length这个属性,在Editor下,无论你的主机连接了多少个显示器,Display.displays.Length的值都是1。只有打包运行的时候,返回值才是真的连接的显示器个数。 我们获取屏幕号的方法主要的思路就是。通过鼠标在屏幕中的位置,然后除以分辨率的宽度进行获取。但是这里面有点坑的是,在Editor模式下和打包出来的模式下,不太一样。 我们用到的是鼠标的Input.mousePosition,而这个是以屏幕的左下角为(0,0),右上角为顶点。在打包出来的时候鼠标的范围应该是(0,0)-(9600,1080)。这里我的电脑屏幕是1920*1080的分辨率,所以五个屏幕连起来鼠标的最大坐标为(9600,1080)。 其实写到这里,都很好计算屏幕序号,鼠标的x轴的值/单个屏幕的宽度+1就是当前的屏幕序号,但是有时候会有小数出现,所以我们要向下取整。代码如下

sceneNumber = (int)Mathf.Floor(mousePosition.x / (float)SceneWidth) + 1; 复制代码

到这里,屏幕序号就获取到了(打包之后的程序),那么该如何获取鼠标在该屏幕上的位置呢,其实也很简单,只要知道了是第几个屏幕,鼠标的横坐标减去相对应个屏幕宽度即可。

Vector3 pos =new Vector3(mousePosition.x- (SceneWidth*(sceneNumber-1)), mousePosition.y, mousePosition.z); 复制代码 坑来了

上面打包状态下屏幕号获取非常容易,那么在Editor下呢?是否也一样?答案是否定的。。。 当你使用上述代码的时候你会发现,计算到的屏幕号就不一定是多少了,负数都有可能。那是因为,在编辑器状态下,会默认一个屏幕(Game视图)为主屏幕,鼠标位置是以该屏幕的左下角为(0,0),右上角为(1920,1080)所以超出的部分有可能是正有可能是特别大。比如下图,鼠标位置已经负1000多了,显然不对

image.png 通过测试发现,当鼠标点在哪个屏幕,哪个屏幕就不会被默认为主屏幕,而当我们点击鼠标想要计算的时候,就会发现,鼠标的位置始终是当前位置,经过探索发现,当我们点击鼠标的时候,程序会在点击的同时更改当前屏幕为主屏幕,我们在Update中使用如下代码测试,会发现,在鼠标点击拍断执行之前,鼠标位置已经发生了改变。

Debug.Log(Input.mousePosition); if (Input.GetMouseButtonDown(0)) { Debug.Log("鼠标点击"); } 复制代码

image.png 那么我们也不能每次测试都打一个包吧,所以就自己研究了个解决办法

运行时先点击屏幕一,确定一号屏幕 创建 private float[] positions = { 1, 1 };数组,存储上一次鼠标的横轴坐标和当前的横轴坐标 通过上一次点击的屏幕号和鼠标位置计算当前的屏幕号

首先确定屏幕一

if (Input.GetMouseButtonDown(0)) { if (!isSureScene1) { isSureScene1 = true; sceneNumber = 1; } } 复制代码

然后记录鼠标的位置,上一次和当前的

//记录鼠标位置(横坐标X值,用于计算屏幕号) positions[0] = positions[1]; positions[1] = Input.mousePosition.x; 复制代码

然后计算屏幕号,比打包的能复杂点,也仅仅是一点,仅仅就是变为了在当前屏幕号的基础上加上计算的屏幕号

/// /// 通过鼠标位置计算屏幕号 /// /// void GetSceneNumberFromMousePosition() { sceneNumber += (int)Mathf.Floor(positions[0] / (float)SceneWidth); } 复制代码

这样就能够完美的解决了在编辑器状态下无法获取屏幕号的问题了,就能够直接通过屏幕号获取摄像机,然后就可以用来发射射线等功能了。 效果如下:

4545.gif

总结

此方法还不是很完善,但是在Unity这个使用已经是足够了,缺点就是对分辨率有要求,分辨率要相同才行,其次就是,在Editor下,game视图要保证大小差不多,并别摆放,就上上图那样,的否则会计算错误。

写在最后

所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。Demo源码会在之后整理好之后分享给大家。欢迎大家相互学习进步。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有