Unity---视窗坐标转化和判断物体是否出了屏幕边界

2023-11-21 16:59

本文主要是介绍Unity---视窗坐标转化和判断物体是否出了屏幕边界,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

视窗坐标转世界坐标和屏幕坐标,判断物体是否还在边界内,和判断从那边出界,先看效果:

这里是直接拖动物体改变坐标来检测,从图中的打印可以清楚看到效果,旋转摄像机视角是同样的效果,下面是代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{public Transform player;public float myWidth;public float myHeight;void Start(){Debug.Log("Screen.width" + Screen.width);Debug.Log("Screen.height" + Screen.height);}void Update(){CornerPos();}void CornerPos(){/// <summary>/// 视窗坐标转世界坐标。视窗坐标是以视窗左下角(0,0)坐标为起始点,长宽为1./// </summary>Vector3 LeftUpWorldoCornerPos = Camera.main.ViewportToWorldPoint(new Vector3(0, 1, -Camera.main.transform.position.z));//视窗左上角转为世界坐标Vector3 LeftDownWorldCornerPos = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, -Camera.main.transform.position.z));//视窗左下角转为世界坐标Vector3 RightUpWorldCornerPos = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, -Camera.main.transform.position.z));//视窗右上角转为世界坐标Vector3 RightDownWorldCornerPos = Camera.main.ViewportToWorldPoint(new Vector3(1, 0, -Camera.main.transform.position.z));//视窗右下角转为世界坐标/// <summary>/// 视窗坐标转世界屏幕,可以手动得到其屏幕长宽/// </summary>Vector3 LeftUpScreenCornerPos = Camera.main.ViewportToScreenPoint(new Vector3(0, 1, -Camera.main.transform.position.z));//视窗左上角转为屏幕坐标Vector3 LeftDownScreenCornerPos = Camera.main.ViewportToScreenPoint(new Vector3(0, 0, -Camera.main.transform.position.z));//视窗左下角转为屏幕坐标Vector3 RightUpScreenCornerPos = Camera.main.ViewportToScreenPoint(new Vector3(1, 1, -Camera.main.transform.position.z));//视窗右上角转为屏幕坐标Vector3 RightDownScreenCornerPos = Camera.main.ViewportToScreenPoint(new Vector3(1, 0, -Camera.main.transform.position.z));//视窗右下角转屏幕界坐标myWidth = Vector3.Magnitude(LeftUpScreenCornerPos - RightUpScreenCornerPos);myHeight = Vector3.Magnitude(LeftUpScreenCornerPos - LeftDownScreenCornerPos);/// <summary>/// 视窗坐标转世界坐标。得到四个视窗中心点的世界坐标,与物体判断是否到达边界./// </summary>Vector3 upMiddlePos = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 1f, -Camera.main.transform.position.z)); //视窗上方中心转为世界坐标Vector3 downMiddlePos = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0, -Camera.main.transform.position.z));//视窗下方中心转为世界坐标Vector3 leftMiddlePos = Camera.main.ViewportToWorldPoint(new Vector3(0, 0.5f, -Camera.main.transform.position.z));//视窗左边中心转为世界坐标Vector3 rightMiddlePos = Camera.main.ViewportToWorldPoint(new Vector3(1, 0.5f, -Camera.main.transform.position.z));//视窗右边中心转为世界坐标bool upOut = upMiddlePos.y - player.position.y <= 0 ? true : false; //与上方屏幕边缘碰到否bool downOut = downMiddlePos.y - player.position.y >= 0 ? true : false;//与下方屏幕边缘碰到否bool leftOut = leftMiddlePos.x - player.position.x >= 0 ? true : false;//与左边屏幕边缘碰到否bool rightOut = rightMiddlePos.x - player.position.x <= 0 ? true : false;//与右边屏幕边缘碰到否Debug.Log("upOut : " + upOut);Debug.Log("downOut : " + downOut);Debug.Log("leftOut : " + leftOut);Debug.Log("rightOut : " + rightOut);}
}

注释很清楚了,这里的Player就是Cube.

欢迎加群:4364930讨论。

这篇关于Unity---视窗坐标转化和判断物体是否出了屏幕边界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/403744

相关文章

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.