Unity简单漫游摄像机

news/2024/11/17 3:51:45/

        可以wasd漫游场景,q/e来上升下降,可以调用TeleportAndLookAtTarget来传送到一个Transform附近并注视它,挂到摄像机上就能使用.

using UnityEngine;public class CameraController : MonoBehaviour
{public float moveSpeed = 5f; // 相机移动速度public float sprintMultiplier = 2f; // 按住 Shift 时的加速倍数public float lookSpeedX = 2f; // 水平旋转速度public float lookSpeedY = 2f; // 垂直旋转速度public float upperLookLimit = 80f; // 垂直旋转的最大角度public float lowerLookLimit = -80f; // 垂直旋转的最小角度private float rotationX = 0f;private float rotationY = 0f;private bool isRightMousePressed = false; // 用来检测右键是否按下public Vector3 offset = new Vector3(0, 2, -5);private void Update(){// 检查是否按下右键if (Input.GetMouseButton(1)) // 鼠标右键按下{isRightMousePressed = true;}else{isRightMousePressed = false;}// 只有在按住右键的情况下,才允许旋转if (isRightMousePressed){// 旋转相机rotationX -= Input.GetAxis("Mouse Y") * lookSpeedY; // 垂直旋转rotationY += Input.GetAxis("Mouse X") * lookSpeedX; // 水平旋转// 限制垂直旋转的范围rotationX = Mathf.Clamp(rotationX, lowerLookLimit, upperLookLimit);// 设置相机的旋转transform.localRotation = Quaternion.Euler(rotationX, rotationY, 0);}// 获取是否按住 Shift 键来加速移动bool isSprinting = Input.GetKey(KeyCode.LeftShift);// 根据是否按住 Shift 键来调整移动速度float currentMoveSpeed = isSprinting ? moveSpeed * sprintMultiplier : moveSpeed;// 相机前后左右移动(WASD)float moveX = Input.GetAxis("Horizontal") * currentMoveSpeed * Time.deltaTime; // A/D 左右float moveZ = Input.GetAxis("Vertical") * currentMoveSpeed * Time.deltaTime; // W/S 前后// 上下升降(Q/E)float moveY = 0f;if (Input.GetKey(KeyCode.Q)) // Q 键升{moveY = currentMoveSpeed * Time.deltaTime;}if (Input.GetKey(KeyCode.E)) // E 键降{moveY = -currentMoveSpeed * Time.deltaTime;}// 移动相机transform.Translate(moveX, moveY, moveZ);}// 传送摄像机并让它注视目标public void TeleportAndLookAtTarget(Transform target){// 设置摄像机的位置,并确保它在目标物体的偏移位置transform.position = target.position + offset;// 让摄像机注视目标物体transform.LookAt(target);Quaternion currentRotation = transform.localRotation;rotationX = currentRotation.eulerAngles.x;rotationY = currentRotation.eulerAngles.y;// 处理 rotationX 范围(确保不超出 0 到 360 度)if (rotationX > 180) rotationX -= 360;if (rotationY > 180) rotationY -= 360;}
}


http://www.ppmy.cn/news/1547614.html

相关文章

Unity学习笔记(4):人物和基本组件

文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班,有空闲时间。争取一天学一课,养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff…

基于Spring Boot的电子商务系统设计

5 系统实现 系统实现部分就是将系统分析,系统设计部分的内容通过编码进行功能实现,以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析,系统设计最主要还是进行功能,系统操作逻辑的设计,也包括…

docker pull 网络不通

https://blog.csdn.net/qq_41326002/article/details/143227071 亲测好使!!!!!!!!!!!! { "registry-mirrors": ["https://docker-proxy.741001.xyz","https://registry.docker-cn.com"] }

Vue 的生命周期函数 和 Vuex

创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm new Vue({// 选项 })虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实…

Database Advantages (数据库系统的优点)

数据库管理系统(DBMS)提供了一种结构化的方式来存储、管理和访问数据,与传统的文件处理系统相比,数据库提供了许多显著的优点。以下是数据库系统的主要优势: 1. Data Integrity (数据完整性) 概念:数据完整…

深入理解VUE对象生命周期——从创建到销毁的完整流程

目录 前言1. 生命周期概述2. 创建阶段2.1 beforeCreate2.2 created 3. 挂载阶段3.1 beforeMount3.2 mounted 4. 更新阶段4.1 beforeUpdate4.2 updated 5. 销毁阶段5.1 beforeUnmount5.2 unmount 6. 生命周期钩子函数的实战应用结语 前言 在前端开发中,理解一个对象…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 软件工程:软件工程的思想,即用工程的概念、原理、技术和方法对软件生产、开发的全过程进行跟踪和管理 软件开发方法:瀑布模型、快速原型模型、螺旋模型 DBAS生命周期模型 1.2 规划与分析 系统规划与定…

用WordPress需要学习哪些编程知识

要使用WordPress搭建和管理网站,您需要掌握一些基本的编程知识。以下是一些关键的技能和概念: 基本编程知识 – HTML:用于构建网页的结构。 – CSS:用于设计和布局网页。 – PHP:WordPress是基于PHP的,…