当前位置: 首页 > news >正文

unity 限制 相机移动 区域(无需碰撞检测)

限制功能原著地址:unity限制相机可移动区域(box collider)_unity限制相机移动区域_manson-liao的博客-CSDN博客

一、创建限制区域

创建一个Cube,Scale大小=1,添加组件:BoxCollder,调整BoxCollder的Size(此为限制区域)

二、代码(功能:WADS(或者上下左右方向键)以及使用Q E上升下降移动和鼠标等控制相机的移动转向等,限制功能是类里的方法为:limitation(),放在Update里执行即可)


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
namespace Twq
{/// <summary>/// wasd控制  (使用中)/// </summary>public class CameraController03 : MonoBehaviour{public static CameraController03 Instance;[Header("模型")]public Transform targetmodel;public static Transform target;[Header("鼠标滚轮灵敏度")][SerializeField]private int MouseWheelSensitivity = 2;[Header("最近距离")][SerializeField]public int MouseZoomMin = 750;[Header("最远距离")][SerializeField]public int MouseZoomMax = 2000;[Header("水平旋转速度")][SerializeField]private float xSpeed = 150.0f;[Header("竖直旋转速度")][SerializeField]private float ySpeed = 80.0f;[Header("鼠标移动灵敏度")][SerializeField]private float mouseMoveSensitivity = 3.0f;[Header("角度限制")][SerializeField]private int yMinLimit = 0;[SerializeField]private int yMaxLimit = 89;[Header("摄像机初始角度")][SerializeField]private float xRot = 0;[SerializeField]private float yRot = 0;[Header("摄像机位置")][SerializeField]private Vector3 camPos;//= new Vector3(0, 0, 0);public float normalDistance;//初始摄像机距离,无法在面板显示public static float x;//= 69f;public static float y;// 34.2f;private Quaternion rotation;public static Vector3 CameraTarget;// [HideInInspector]public bool isExit;//打开 控制相机public bool isShuBiao;//Flase=拉近 状态public Transform SelfTransform;private void Awake(){Instance = this;SelfTransform = this.transform;}void Start(){//初始化isExit = true;isShuBiao = true;x = yRot;y = xRot;target = targetmodel;Vector3 posC = camPos - target.position;normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));rotation = Quaternion.Euler(new Vector3(y, x, 0f));transform.rotation = rotation;float z = target.transform.position.z - normalDistance;transform.position = camPos;//rotation * new Vector3(transform.position.x, transform.position.y, z);CameraTarget = transform.position + transform.forward.normalized * normalDistance;x = transform.localEulerAngles.x;y = transform.localEulerAngles.y;}public void Init(){isExit = true;isShuBiao = true;Vector3 posC = camPos - target.position;normalDistance = Mathf.Sqrt(Mathf.Pow(posC.x, 2) + Mathf.Pow(posC.y, 2) + Mathf.Pow(posC.z, 2));rotation = Quaternion.Euler(new Vector3(90f, 0f, 0f));transform.rotation = rotation;transform.position = new Vector3(0f, 0f, 0f);CameraTarget = transform.position + transform.forward.normalized * normalDistance;x = transform.localEulerAngles.x;y = transform.localEulerAngles.y;}public float movespeed = 500;void LateUpdate(){if (IsPointerOverGameObject(Input.mousePosition))if (isExit){if (isShuBiao){// 定义3个值控制移动float xm = 0, zm = 0;if (Input.GetKey(KeyCode.Q)) //上升{if (transform.position.y >= MouseZoomMax)//限制 最大距离{transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);}else{transform.position = new Vector3(transform.position.x, transform.position.y +movespeed * Time.deltaTime, transform.position.z);}}else if ( Input.GetKey(KeyCode.E))//下降{if (transform.position.y <= MouseZoomMin)//限制 最小距离{transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);}else{transform.position = new Vector3(transform.position.x, transform.position.y - movespeed * Time.deltaTime, transform.position.z);}}//按键盘W向上移动if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W)){if (transform.position.y < MouseZoomMin)//限制 最小距离{transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);}else{this.transform.Translate(Vector3.forward * movespeed * Time.deltaTime);}}else if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))//按键盘S向下移动{if (transform.position.y > MouseZoomMax)//限制 最大距离{transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);}else{this.transform.Translate(Vector3.back * movespeed * Time.deltaTime);}}if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))//按键盘A向左移动{// xm -= 500 * Time.deltaTime;this.transform.Translate(Vector3.left * movespeed * Time.deltaTime);}else if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))//按键盘D向右移动{//  xm += 500 * Time.deltaTime;this.transform.Translate(Vector3.right * movespeed * Time.deltaTime);}if (Input.GetMouseButton(GlobalVariableManage.GetMouseButtonType))// 1鼠标右键  0鼠标左键{y += Input.GetAxis("Mouse X") * xSpeed * 0.02f;x -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;x = ClampAngle(x, yMinLimit, yMaxLimit);var rotation = Quaternion.Euler(x, y, 0);transform.rotation = rotation;}else if (Input.GetAxis("Mouse ScrollWheel") != 0)//鼠标滚轮{//  normalized = (transform.position - CameraTarget).normalized;if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax){this.transform.position += this.transform.forward * Input.GetAxisRaw("Mouse ScrollWheel") * Time.timeScale * MouseWheelSensitivity;Vector3 p = this.transform.position - CameraTarget;normalDistance = Mathf.Sqrt(Mathf.Pow(p.x, 2) + Mathf.Pow(p.y, 2) + Mathf.Pow(p.z, 2));}if (normalDistance < MouseZoomMin){normalDistance = MouseZoomMin;}if (normalDistance > MouseZoomMax){normalDistance = MouseZoomMax;}if (transform.position.y < MouseZoomMin)//限制 最小距离{transform.position = new Vector3(transform.position.x, MouseZoomMin, transform.position.z);}if (transform.position.y > MouseZoomMax)//限制 最大距离{transform.position = new Vector3(transform.position.x, MouseZoomMax, transform.position.z);}}}else{if (transform.position.y > MouseZoomMax)//限制 最小距离{isShuBiao = true;}//缩放if (Input.GetAxis("Mouse ScrollWheel") > 0){transform.Translate(Vector3.forward * 100f);//速度可调  自行调整}if (Input.GetAxis("Mouse ScrollWheel") < 0){transform.Translate(Vector3.forward * -100f);//速度可调  自行调整}//旋转 x = transform.localEulerAngles.x;y = transform.localEulerAngles.y;}limitation();}}public GameObject box;
//限制区域private void limitation(){if (box){Vector3 boxSize = box.GetComponent<BoxCollider>().size;Vector3 boxCenter = box.GetComponent<BoxCollider>().center;Vector3 min = box.transform.position + boxCenter - boxSize * 0.5f;Vector3 max = box.transform.position + boxCenter + boxSize * 0.5f;Vector3 cameraP = transform.position;Debug.Log("min.x="+ min.x+ "  max.x="+ max.x);if (cameraP.x < min.x){cameraP.x = min.x;}else if (cameraP.x > max.x){cameraP.x = max.x;}//if (cameraP.y < min.y)//{//    cameraP.y = min.y;//}//else if (cameraP.y > max.y)//{//    cameraP.y = max.y;//}if (cameraP.z < min.z){cameraP.z = min.z;}else if (cameraP.z > max.z){cameraP.z = max.z;}transform.position = cameraP;}}/// <summary>/// 检测是否点击UI/// </summary>/// <param name="mousePosition">鼠标位置</param>/// <returns></returns>private bool IsPointerOverGameObject(Vector2 mousePosition){//创建一个点击事件PointerEventData eventData = new PointerEventData(EventSystem.current);eventData.position = mousePosition;List<RaycastResult> raycastResults = new List<RaycastResult>();//向点击位置发射一条射线,检测是否点击UIEventSystem.current.RaycastAll(eventData, raycastResults);if (raycastResults.Count > 0)//大于0 说明 有UI{return false;}else{return true;}}static float ClampAngle(float angle, float min, float max){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}//--------------------围绕的物体并且 相机定位物体-------------------//#region//public Transform CenObj;//围绕的物体//private Vector3 Rotion_Transform;//private new Camera camera;bool bo;//private Transform mainCameraTr;                                               //主摄像机//public Transform lookAtTarget;                                          //摄像机看向的目标//private float cameraDistance = 50.0F;                                     //摄像机与看向目标的距离//private float cameraHeight = 800.0F;                                       //摄像机高度//private float cmaeraOffset = 1000.0F;                                       //摄像机的偏移//private float mainCameraMoveSpeed = 1F;                                  //主摄像机移动的速度//private Vector3 lookAtTargetPosition;                                  //看向目标时的位置//private Quaternion lookAtTargetRotation;                               //看向目标,且旋转//public bool isLookAtAppointTarget = false;                                //是否看向指定的物体//public void SetInit(Transform CenObj_)//{//    Debug.Log("点击了=" + CenObj_.name);//    isShuBiao = true;//    CenObj = CenObj_;//    Rotion_Transform = CenObj.position;//    lookAtTarget = CenObj_;//    LookAtAppointTarget();//    isShuBiao = false;//}//void Update()//{//    //if (!isExit)//    //{//    //    Ctrl_Cam_Move();//    //    Cam_Ctrl_Rotation();//    //}//}/ <summary>/ 摄像机看向指定物体的方法/ </summary>//public void LookAtAppointTarget()//{//    if (lookAtTarget != null)//    {//        lookAtTargetPosition = new Vector3(lookAtTarget.transform.position.x + cmaeraOffset,//           lookAtTarget.transform.position.y + cameraHeight, lookAtTarget.transform.position.z + cameraDistance);//        isLookAtAppointTarget = true;//    }//    else//    {//        Debug.LogError(GetType() + "/LookAtAppointTarget()/看向的物体不存在,请检查!!!");//    }//    if (isLookAtAppointTarget == true)//是否看向物体//    {//        mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 1 * mainCameraMoveSpeed);//        mainCameraTr.LookAt(lookAtTarget);//    }//    //if (isBack == true)//    //{//    //    mainCameraTr.position = Vector3.Lerp(mainCameraTr.position, lookAtTargetPosition, 10 * mainCameraMoveSpeed);//    //}//}#endregion}
}

相关文章:

unity 限制 相机移动 区域(无需碰撞检测)

限制功能原著地址&#xff1a;unity限制相机可移动区域&#xff08;box collider&#xff09;_unity限制相机移动区域_manson-liao的博客-CSDN博客 一、创建限制区域 创建一个Cube&#xff0c;Scale大小1&#xff0c;添加组件&#xff1a;BoxCollder&#xff0c;调整BoxColld…...

Hudi第二章:集成Spark

系列文章目录 Hudi第一章&#xff1a;编译安装 Hudi第二章&#xff1a;集成Spark 文章目录 系列文章目录前言一、安装Spark1、安装Spark2.安装hive 二、spark-shell1.启动命令2.插入数据3.查询数据1.转换DF2.查询 3.更新4.时间旅行5.增量查询6.指定时间点查询7.删除数据1.获取…...

springboot和vue:八、vue快速入门

vue快速入门 新建一个html文件 导入 vue.js 的 script 脚本文件 <script src"https://unpkg.com/vuenext"></script>在页面中声明一个将要被 vue 所控制的 DOM 区域&#xff0c;既MVVM中的View <div id"app">{{ message }} </div…...

docker-compose内网本地安装

1&#xff1a;通过包管理器安装 Docker Compose&#xff0c;请按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你的系统上已经安装了 Docker。如果尚未安装 Docker&#xff0c;请根据你的操作系统使用适当的包管理器进行安装打开终端&#xff0c;并运行以下命令下载 D…...

ThreeJs的场景实现鼠标拖动旋转控制

前面一个章节中已经实现在场景中放置一个正方体&#xff0c;并添加灯光使得正方体可见。但是由于是静态的还不能证明是3D的&#xff0c;我们需要添加一些控制器&#xff0c;使得通过鼠标控制正方体可以动起来&#xff0c;实现真正的3D效果&#xff0c;由此引入OrbitControls组件…...

jdk 管理工具比对 jEnv jabba SDKMAN

jEnv、jabba、SDKMAN 这三个 JDK 管理工具进行的比对&#xff1a; jEnv&#xff1a; 地址&#xff1a;https://github.com/jenv/jenv 作者&#xff1a;Gildas Cuisinier 最后更新时间&#xff1a;2021年5月26日 开发语言&#xff1a;Shell Jabba&#xff1a; 地址&#xff1…...

华为云云耀云服务器L实例评测|部署在线图表和流程图绘制工具drawio

华为云云耀云服务器L实例评测&#xff5c;部署在线图表和流程图绘制工具drawio 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 优势及其应用场景1.3 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 drawio3.1 drawio 介绍3.2 Docker 环…...

elementui引入弹出框报错:this.$alert is not defined 解决方案

1.按需引入文件element.js 注意&#xff1a;引入Message&#xff0c;MessageBox两个组件就行&#xff0c;alert包括在MessageBox里面了。 之前我引入了Alert组件&#xff0c;发现不行 2.在vue的prototype里注册伪名字 3.组件里直接调用就行了 4.实现效果 我发现elementui调用…...

docker的组件和资源管理

Docker是一种开源的容器化平台&#xff0c;它提供了一种轻量级、可移植和可扩展的方式来打包、部署和运行应用程序。Docker的构成包括以下几个关键组件&#xff1a; Docker Engine&#xff1a;Docker Engine是Docker的核心组件&#xff0c;它负责管理容器的生命周期和资源隔离…...

SEO的优化教程(百度SEO的介绍和优化)

百度SEO关键字介绍&#xff1a; 百度SEO关键字是指用户在搜索引擎上输入的词语&#xff0c;是搜索引擎了解网站内容和相关性的重要因素。百度SEO关键字可以分为短尾词、中尾词和长尾词&#xff0c;其中长尾词更具有针对性和精准性&#xff0c;更易于获得高质量的流量。蘑菇号-…...

Tomcat以及UDP

一、Tomcat 服务端 自定义 S Tomcat服务器 S &#xff1a;Java后台开发 客户端 自定义 C 浏览器 B 认识一些常用的目录&#xff1a; bin&#xff1a;存放开始和结束的程序 conf&#xff1a;配置文件 lib&#xff1a;组成包 logs&#xff1a;输出日志 webapps&#x…...

NLP 04(GRU)

一、GRU GRU (Gated Recurrent Unit)也称门控循环单元结构,它也是传统RNN的变体,同LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c; 缓解梯度消失或爆炸现象&#xff0c;同时它的结构和计算要比LSTM更简单,它的核心结构可以分为两个部分去解析: 更新门、重置门 GRU的内…...

BUUCTF reverse wp 51 - 55

findKey shift f12 找到一个flag{}字符串, 定位到关键函数, F5无效, 大概率是有花指令, 读一下汇编 这里连续push两个byte_428C54很奇怪, nop掉下面那个, 再往上找到函数入口, p设置函数入口, 再F5 LRESULT __stdcall sub_401640(HWND hWndParent, UINT Msg, WPARAM wPara…...

WebGL笔记:使用鼠标绘制多个线条应用及绘制动感线性星座

使用鼠标绘制多个线条 多个线条&#xff0c;肯定不是一笔画过的&#xff0c;而是多次画的线条既然是多线&#xff0c;那就需要有个容器来管理它们 1 &#xff09;建立容器对象 建立一个 lineBox 对象&#xff0c;作为承载多边形的容器 // lineBox.js export default class …...

nodejs+vue 汽车销售系统elementui

第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性&#xff1a;技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性&#xff1a; 11 3.3性能分析 11 3.4系统操作流程 12 3.4.1管理员登录流程 12 3.4.2信息添加流程 12 3.4.3信息删除流程 13 第四章 系统设计与…...

leetcode76 Minimum Window Substring

给定两个字符串s和t&#xff0c; 找到s的一个子串&#xff0c;使得t的每个字符都出现在子串中&#xff0c;求最短的子串 由于要每个字符出现&#xff0c;所以顺序其实没有关系 因此我们可以定义一个map&#xff0c;统计t中字符出现次数 然后在s中慢慢挪动滑动窗口&#xff0c;…...

简单工厂模式~

我们以生产手机作为应用场景展开讲解&#xff01; 手机是一个抽象的概念&#xff0c;它包含很多的品牌&#xff0c;例如华为&#xff0c;苹果&#xff0c;小米等等&#xff0c;因此我们可将其抽象为一个接口&#xff0c;如下所示&#xff1a; public interface tel {void pro…...

基于Java的会员管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

数据结构 图 并查集 遍历方法 最短路径算法 最小生成树算法 简易代码实现

文章目录 前言并查集图遍历方法广度优先遍历深度优先遍历 最小生成树算法Kruskal算法Prim算法 最短路径算法Dijkstra算法BellmanFord算法FloydWarshall算法 全部代码链接 前言 图是真的难&#xff0c;即使这些我都学过一遍&#xff0c;再看还是要顺一下过程&#xff1b;说明方…...

idea Springboot 教师标识管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 教师标识管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...