unity控制摄像机几种视角实现方式

目录

1、按下鼠标右键可以实现摄像机上下左右旋转

2、自由视角

3、摄像头跟随视角

4、跟随自由视角

5、第一人称跟随视角

python学习汇总连接:



1、按下鼠标右键可以实现摄像机上下左右旋转

这段代码定义了一个名为CameraRotate的脚本,用于控制摄像机根据鼠标右键(中键)的移动进行旋转。摄像机将以一定的旋转速度(rotationSpeed)跟随鼠标输入,并且其垂直旋转角度将被限制在最小垂直角度(minVerticalAngle)和最大垂直角度(maxVerticalAngle)之间,以防止过度倾斜。通过使用Quaternion.Lerp函数,摄像机的旋转过程更加平滑自然。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraRotate : MonoBehaviour
{//旋转速度public float rotationSpeed = 5f;//上下旋转角度限制public float maxVerticalAngle = 90f;public float minVerticalAngle = -90f;//旋转缓冲速度public float lerpSpeed = 10f;private float targetRotationX = 0f;private float targetRotationY = 0f;void Update(){if (Input.GetMouseButton(1)){// 获取鼠标输入的旋转增量float rotationXInput = -Input.GetAxis("Mouse Y");float rotationYInput = Input.GetAxis("Mouse X");// 根据旋转速度进行摄像机的旋转targetRotationX += rotationXInput * rotationSpeed;targetRotationY += rotationYInput * rotationSpeed;// 对上下旋转角度进行限制targetRotationX = Mathf.Clamp(targetRotationX, minVerticalAngle, maxVerticalAngle);// 根据旋转角度更新摄像机的欧拉角,Quaternion.Lerp可以使摄像机旋转更加平滑Quaternion targetRotation = Quaternion.Euler(targetRotationX, targetRotationY, 0f);transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, lerpSpeed * Time.deltaTime);}}
}

2、自由视角

CameraRotate脚本同样实现摄像机围绕某个物体(target)旋转的功能,当按下鼠标右键时,摄像机会随着鼠标Y轴的移动而上下旋转、X轴的移动而左右旋转,同时确保旋转角度保持在设定范围内。此外,无论摄像机如何旋转,都会始终保持与目标物体之间的特定距离(distance),使摄像机始终围绕物体进行轨道式运动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraRotate : MonoBehaviour
{public Transform target;public float rotationSpeed = 5f;public float maxVerticalAngle = 90f;public float minVerticalAngle = -90f;public float lerpSpeed = 200f;public float distance = 10;private float targetRotationX = 0f;private float targetRotationY = 0f;void Start(){if (target == null)Debug.LogError("Please assign a target to the orbit camera!");}void Update(){if (Input.GetMouseButton(1)){float rotationXInput = -Input.GetAxis("Mouse Y");float rotationYInput = Input.GetAxis("Mouse X");targetRotationX += rotationXInput * rotationSpeed;targetRotationY += rotationYInput * rotationSpeed;targetRotationX = Mathf.Clamp(targetRotationX, minVerticalAngle, maxVerticalAngle);Quaternion targetRotation = Quaternion.Euler(targetRotationX, targetRotationY, 0f);transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, lerpSpeed * Time.deltaTime);}transform.position = target.position - transform.forward * distance;}
}

3、摄像头跟随视角

CameraRotate脚本使得摄像机始终跟随在一个指定的目标物体后面,并保持在其正上方一定高度的位置(followHeight)。摄像机位置会以平滑的方式逐渐调整至理想状态,即目标物体正后方特定距离处,通过SmoothDamp函数实现了摄像机跟随过程的平滑过渡。最后,摄像机的方向始终面向目标物体,保证了稳定的跟随视角。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraRotate : MonoBehaviour
{public Transform target;public float followSpeed = 2f;public float followHeight = 4f;public float distance = 8f;private Vector3 velocity = Vector3.zero;void Start(){if (target == null)Debug.LogError("Please assign a target to the orbit camera!");}void LateUpdate(){Vector3 targetPosition = target.position - (target.forward * distance)+new Vector3(0,followHeight,0);transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 1f / followSpeed);transform.LookAt(target);}
}

4、跟随自由视角

在Unity中,实现一个跟随角色的摄像头,并且允许玩家自由旋转视角,通常分为两部分:

  1. 摄像机跟随角色移动
  2. 鼠标控制摄像机自由旋转

下面是一个简单的示例脚本,该脚本将实现这两个功能:

using UnityEngine;public class CameraFollowAndRotate : MonoBehaviour
{public Transform target; // 要跟随的目标对象(例如:角色)public float followDistance = 5f; // 跟随距离public float heightOffset = 2f; // 高度偏移public float rotationSpeed = 100f; // 视角旋转速度public float xRotationLimit = 90f; // 水平旋转角度限制private Vector3 offset;private Quaternion originalRotation;void Start(){// 初始化时记录下摄像机相对于目标初始的位置和旋转offset = transform.position - target.position;originalRotation = Quaternion.Euler(transform.eulerAngles.x, target.eulerAngles.y, 0);// 如果需要锁定鼠标光标Cursor.lockState = CursorLockMode.Locked;}void LateUpdate(){// 跟随目标移动Vector3 desiredPosition = target.position + offset;desiredPosition.y += heightOffset;transform.position = desiredPosition;// 自由旋转视角float mouseX = Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime;float mouseY = Input.GetAxis("Mouse Y") * rotationSpeed * Time.deltaTime;// 限制X轴旋转xRotation -= mouseY;xRotation = Mathf.Clamp(xRotation, -xRotationLimit, xRotationLimit);// 更新摄像机旋转Quaternion yRotation = Quaternion.AngleAxis(mouseY, transform.right);Quaternion xRotationQuat = Quaternion.AngleAxis(xRotation, Vector3.up);transform.rotation = originalRotation * xRotationQuat * yRotation;}
}

在这个脚本中,摄像机会保持一定的距离和高度跟随目标对象。同时,通过监听鼠标的水平和垂直输入,允许玩家自由旋转摄像机视角。注意这个例子是第三人称跟随并自由旋转,如果是第一人称视角,处理方式会有所不同。

记得将此脚本挂载到摄像机上,并将target变量设置为你希望摄像机跟随的游戏对象

5、第一人称跟随视角

对于Unity中的第一人称跟随视角,摄像机通常与角色头部绑定,并通过鼠标控制视口的左右旋转。以下是一个简单的实现:

using UnityEngine;public class FirstPersonCameraFollow : MonoBehaviour
{public Transform target; // 角色的头部或相机挂载点public float mouseSensitivity = 100f;public float yRotationLimit = 90f; // 可选:限制上下的旋转角度private float xRotation = 0f;void Start(){Cursor.lockState = CursorLockMode.Locked; // 锁定鼠标光标以获得更好的第一人称体验}void LateUpdate(){// 获取鼠标输入float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;// 更新X轴(左右)旋转xRotation -= mouseY;xRotation = Mathf.Clamp(xRotation, -yRotationLimit, yRotationLimit);// 更新Y轴(上下)旋转,直接应用到目标对象上target.Rotate(Vector3.left * mouseY);// 设置摄像机的局部旋转transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);// 摄像机保持在角色头部位置transform.position = target.position;}
}

在这个脚本中,摄像机将始终位于角色头部的位置,并且可以通过鼠标移动来改变视角的左右旋转。垂直旋转(抬头和低头)直接作用于角色头部,而不是摄像机自身,这是第一人称视角常见的处理方式。

注意,根据项目需求,可能需要调整摄像机的父级关系以及旋转限制等参数。同时,为了确保平滑的旋转效果,可以考虑使用Mathf.SmoothDampAngle函数进行插值处理。

python学习汇总连接:

50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年终总结 —— 我和CSDN相遇的第一年之“技术学习和个人成长的回顾与展望”

​ ​ 🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 🎊对2023的总结与回顾🎊 🏅获奖记录 📚学…

机器学习库【03】:-NumPy-算术运算

一、说明 与常规数学一样,数组算术本质上是关于加法、减法、乘法和除法。在 中NumPy,此类操作是按元素执行的 [2]: NumPy 是 Numerical Python 的缩写,是 Python 生态系统中一个功能强大的库,它提供对大型多维数组和矩…

CentOS虚拟机硬盘管理

CentOS虚拟机硬盘管理 一、创建虚拟机时分配硬盘 创建虚拟机时,在下图这个页面需要重新选择一下硬盘,可以对硬盘进行配置。 默认自动分区 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e9ce72af3d934e75be95f7f86860e92b.png 选择确认分…

EasyExcel详解(结合官方文档)

EasyExcel 零、前言 文章是根据官方文档&#xff0c;加上自己的测试运行总结出来的&#xff0c;目前只总结的EasyExcel读的部分&#xff0c;写的部分还未完结&#xff0c;后续会更新1、官方文档 https://easyexcel.opensource.alibaba.com/2、EasyExcel的maven依赖 <!--…

私有部署ELK,搭建自己的日志中心(三)-- Logstash的安装与使用

一、部署ELK 上文把采集端filebeat如何使用介绍完&#xff0c;现在随着数据的链路&#xff0c;继续~~ 同样&#xff0c;使用docker-compose部署&#xff1a; version: "3" services:elasticsearch:container_name: elasticsearchimage: elastic/elasticsearch:7.9…

git基础概念和常用命令(日常开发收藏备用)

目录 ### 常用命令 ### 远程仓库与克隆 ### 分支管理 ### 子模块&#xff08;Submodule&#xff09; ### 其他高级操作 ### 交互式暂存&#xff08;Interactive Staging&#xff09; ### cherry-pick ### rebase ### reflog与reset ### 子树合并&#xff08;Subtree …

【LearnOpenGL基础入门——5】着色器

目录 一.简介 二.GLSL 三.数据类型 四.输入与输出 五.Uniform 六.更多属性 一.简介 着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立…

【基础】【Python网络爬虫】【5.数据解析】bs4、Xpath、Parsel模块、正则表达式(附大量案例代码)(建议收藏)

Python网络爬虫基础 数据解析1. 为何数据解析2. 常见的数据类型结构化数据半结构化数据非结构化数据 3. 爬虫项目实现步骤 数据解析模块1. Bs4环境安装bs4解析流程案例 - bs4碧血剑文本爬取 2. Xpath环境安装xpath解析的编码流程xpath表达式如何理解&#xff1f;案例 - 简历模板…

第3课 使用FFmpeg获取并播放音频流

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 FFmpeg作为一套庞大的音视频处理开源工具&#xff0c;其源码有太多值得研究的地方。但对于大多数初学者而言&#xff0c;如何快速利用相关的API写出自己想要的东西才是迫切需要…

Android studio 多界面的跳转和返回

一、新建一个Empty Activity项目&#xff1a; 二、修改activity_main.xml布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/a…

【头歌实训】PySpark Streaming 入门

文章目录 第1关&#xff1a;SparkStreaming 基础 与 套接字流任务描述相关知识Spark Streaming 简介Python 与 Spark StreamingPython Spark Streaming APISpark Streaming 初体验&#xff08;套接字流&#xff09; 编程要求测试说明答案代码 第2关&#xff1a;文件流任务描述相…

Resolume Arena(VJ音视频软件):创意无限,视听艺术的新境界

Resolume Arena是一款领先的VJ音视频软件&#xff0c;为创意人士提供了丰富的视觉效果和音频处理功能。无论是在舞台演出、音乐会还是派对活动中&#xff0c;Resolume Arena能够将音乐、视频和图像无缝地结合&#xff0c;创造出引人入胜的视听体验。 Resolume Arena具备强大的…

Nginx快速入门:nginx实现正向代理|反向代理和正向代理的区别(八)

0. 引言 我们之前讲解的一直是nginx的反向代理配置&#xff0c;关于正向代理的实现一直没有涉及&#xff0c;但在实际生产中正向代理也有非常广泛的应用场景&#xff0c;因此&#xff0c;今天我们将针对正向代理来深入学习。 1. 相关概念 1.1 什么是反向代理 所谓反向代理&…

读算法霸权笔记08_反馈

1. 关开门 1.1. clopening 1.2. 指的是一个职员工作到很晚&#xff0c;关闭门店或者咖啡店&#xff0c;几小时后又在天亮之前回来开门 1.3. 极度不规律的工作时间安排越来越常见 1.3.1. 首当其冲的是星巴克、麦当劳和沃尔玛等企业的低薪职工 1.3.2. 不规律的工作时间安排是…

云安全指的是什么,云安全产品有哪些,有什么作用

云安全是什么意思呢&#xff1f;简单来说云安全是指基于云计算商业模式应用的安全软件&#xff0c;专门保护云计算系统的网络安全学科。那么云安全和传统安全有什么区别呢&#xff1f;云安全包括在基于在线的基础架构、应用程序和平台上保持数据的私密和安全比起传统的安全要求…

信号与线性系统翻转课堂笔记17——z变换及其性质

信号与线性系统翻转课堂笔记17——z变换及其性质 The Flipped Classroom17 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;序列的z变换…

Serverless架构:无服务器应用与AWS Lambda-读书笔记

Serverless架构&#xff1a;无服务器应用与AWS Lambda-读书笔记 好的架构可以成就软件&#xff0c;缺乏架构则会破坏软件。 一、Serverless 架构的来龙去脉 在典型的Web应用程序中&#xff0c;服务器接受前端的HTTP请求并处理请求。在保存到数据库之前&#xff0c;数据可能会…

使用 SSH 方式实现 Git 远程连接GitHub

git是目前世界上最先进的分布式版本控制系统&#xff0c;相比于SVN&#xff0c;分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在&#xff0c;也就是有没有联网都可以正常工作&#xff01;当有网络的时候&#xff0c;再把本地提交推送一下就完成了同步&…

C:Huffman编码a

【问题描述】 给定一组字符的Huffman编码表&#xff08;从标准输入读取&#xff09;&#xff0c;以及一个用该编码表进行编码的Huffman编码文件&#xff08;存在当前目录下的in.txt中&#xff09;&#xff0c;编写程序实现对Huffman编码文件的解码&#xff0c;并按照后序遍历序…

【Java开发岗面试】八股文—Java基础集合多线程

声明&#xff1a; 背景&#xff1a;本人为24届双非硕校招生&#xff0c;已经完整经历了一次秋招&#xff0c;拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验&#xff08;主要是校招&#xff09;&#xff0c;包括我自己总结的八股文、算法、项目介绍、HR面和面试…