首页 > 其他分享 >Unity使用多屏幕Display以及不同屏幕的射线检测

Unity使用多屏幕Display以及不同屏幕的射线检测

时间:2024-08-06 17:56:23浏览次数:9  
标签:鼠标 Unity pos 点击 displays 屏幕 Display

0.背景

最近在做一个双屏游戏,一个场景中有两个摄像机,分别渲染到两个屏幕显示,然后在点击不同的屏幕时,要从不同的摄像机发射射线检测与场景中的物体交互。

1.设置多屏

unity中设置多屏的方式很简单,选中摄像机组件中的Target Display属性即可。

2.显式地激活连接的屏幕

在确保连接了多个显示器后,需要在代码中显式地激活每个屏幕,且激活后不可关闭。

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.displays.Length的值都是1。只有打包运行的时候,返回值才是真的连接的显示器个数。

3.获取鼠标点击位置

unity中可以直接根据Input.mousePosition来获取到当前鼠标的点击位置。

值得注意的是,在博主的测试下,打包后运行时,相当于将两个屏幕连成了一个大屏幕。那么两个屏幕的连接方式不同,就会导致最终的大屏幕也不一样。以下举例说明。

在window显示设置中,我的两块屏幕是按照扩展模式且左右连接的,那么在这种情况下,最终游戏运行时合成的一个大屏幕的分辨率是3840 x 1080(两块小屏幕都是1920 x 1080)。

4.判断当前点击的屏幕且发射射线检测

private void CheckCamera()
{
    Vector2 pos = Input.mousePosition;
    if (pos.x < Display.displays[0].systemWidth && pos.y < Display.displays[0].systemHeight)
    {
        SendRaycast(cameras[0], pos);
    }
    else
    {
        //注意在点击第二块屏幕时,要注意把鼠标坐标减去第一块屏幕的宽度,不然射线不准确
        SendRaycast(cameras[1], pos - new Vector2(Display.displays[0].systemWidth,0));
    }
}

private void SendRaycast(Camera camera, Vector2 pos)
{
    Ray ray = camera.ScreenPointToRay(pos);
    RaycastHit hit;
    Physics.Raycast(ray, out hit);
    if (hit.collider != null)
    {
        print("射线击中了 " + hit.collider.name);
    }
}

根据鼠标点击的位置,判断当前点击的是哪一块屏幕,从而用哪一个摄像机来发射射线检测。比如我的鼠标位置是(2880,540),那么由于x坐标大于了第一块屏幕的宽度(1920),那么表示当前鼠标点击的是第二块屏幕,因此要从摄像机2来发射射线。

值得注意的是,当点击第二块屏幕是,不能直接把当前的鼠标坐标(2880,540)传给camera.ScreenPointToRay(pos)。因为对于每一小块屏幕来说,分辨率是1920x1080,因此需要减去第一块屏幕的宽度,即pos - new Vector2(Display.displays[0].systemWidth,0),也就是说(960,540)才是我要传给camera.ScreenPointToRay(pos)的值。

 

标签:鼠标,Unity,pos,点击,displays,屏幕,Display
From: https://blog.csdn.net/Charizard_/article/details/140960750

相关文章

  • Unity中的自动布局组件
    列表的自动布局组件三个自动布局组件垂直、水平自动布局组件padding:偏移spacing:子节点下的间距childAlignment:子节点对齐方式ControlChildSize:控制子节点大小(常见于游戏道具)UseChildScale:是否考虑子对象的scaleChildForceExpand:子节点自动扩展格子自动布局组......
  • 【Unity】练习1—ROLL A BALL开发
    目录一、建立游戏环境1、创建一个新场景2、创建一个平面​编辑3、平面的缩放4、创建玩家对象5、调整光照6、用材质添加颜色二、玩家的移动1、给小球添加物理模拟组件2、安装输入系统InputSystem3、给小球添加玩家控制组件4、创建一个脚本5、写移动脚本三、镜......
  • 【推荐100个unity插件之24】Post Processing 后处理插件最全基础使用说明
    文章目录前言什么是后处理?场景视图显示后处理效果主相机勾选渲染后处理Post-processVolume和Volume的区别内置渲染管线的后处理Post-processVolume使用通用渲染管线(URP)的后处理是Volume的使用文档升级URPglobalvolume全局后处理效果泛光(Bloom)色差(Chromatic......
  • Unity Gyro Camera ---- 传感器控制摄像头旋转 + 正北校准 (纯原生支持Android+IOS,无需
    UnityGyroCamera传感器控制摄像头旋转+正北校准纯原生支持Android+IOS,无需安装ARKit,ARCore等插件这篇文章主要介绍如何利用手机原生的传感器,控制摄像头的旋转,最终可以实现AR或者VR的摄像头旋转控制问题提出 虽然,目前有一些用手机传感器控制虚拟摄像头旋转的方案......
  • Unity强化工程 之 Mask & SortingGroup
    本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正1.Mask遮罩故名思意就是起到遮挡作用的罩子:精灵遮罩-Unity手册如果我想让sprite与遮罩发生交互,那么我需要勾选spritrrenderer的交互选项之后就可......
  • Unity强化工程 之 SpriteRender
    本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正1.SpriteRenderer是什么渲染精灵用的,是渲染的核心组件,有许多重要参数所以要详细讲一讲SpriteRenderer-Unity手册2.参数DrawMode精灵绘制模式Sim......
  • 【Unity】3D功能开发入门系列(四)
    Unity3D功能开发入门系列(四)一、组件的访问(一)组件的调用(二)组件的参数(三)引用别的组件(四)引用脚本组件(五)消息调用二、物体的访问(一)获取物体(二)父子物体(三)物体的操作(四)练习:俄罗斯方块三、资源的访问(一)资源的使用(二)资源数组(三)练习:三色球四、定时调用(一)定时调用(二)定时与线程(三......
  • 基于STM32-OLED多级菜单(LCD等等屏幕均可移植)
    一,内容概括:不使用长篇大论1:多级菜单介绍2:实现思路3:代码编写4:总结二,正文1.多级菜单介绍:想必大家看到这里,也知道多级菜单大概是什么;对于还不太清楚的朋友说明以下,多级菜单就是将一块屏幕原本只能显示一种内容,扩展到可以显示很多内容。依据自己的设定显示内容。2.实现思路......
  • Unity游戏开发之【输入管理器设计】 第二章
    上一章把输入管理器各个模块基本功能和简单的代码逻辑已经讲述了,本章就以移动摇杆的功能实现,把整个【输入管理控制器】的代码给大家讲述一遍上一章内容连接:Unity游戏开发之【输入管理器设计】第一章以下包括摇杆功能实现和输入控制系统的代码。代码按照逻辑顺序进行整理......
  • C# & Unity 面向对象补全计划 七大原则 之 里氏替换
    本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正本系列作为七大原则和设计模式的进阶知识,看不懂没关系请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章,本知识点与其密切相关1.里氏替换原则里氏替换原则(LiskovSubstitutionPrinciple,LS......