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.hqwc.cn/news/310844.html

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

相关文章

【Python特征工程系列】教你利用XGBoost模型分析特征重要性(源码)

这是Python特征工程系列原创文章,我的第186篇原创文章。 一、问题 应用背景介绍: 如果有一个包含数十个甚至数百个特征的数据集,每个特征都可能对你的机器学习模型的性能有所贡献。但是并不是所有的特征都是一样的。有些可能是冗余的…

网络安全—认证技术

文章目录 加密认证对称密钥体制公钥密码体制公钥的加密公钥身份认证和加密 鉴别码认证MAC鉴别码 报文摘要认证认证 加密只认证数字签名 通过了解以前前辈们使用的消息认证慢慢渐进到现代的完整的认证体系。所以在学习的时候也很蒙圈,因为前期的很多技术都是有很严重…

数据结构:单调栈

1.单调栈 单调栈是一种数据结构,其中存放的数据应该是有序的,所以单调栈也有单调递减栈和单调递增栈 单调递增栈:栈顶到栈底的元素大小是从小到大 单调递减栈:栈顶到栈底的元素大小是从大到小 单调栈主要就是用来求一个给定序列中…

GenerateBlocks Pro插件 构建更好的WordPress网站

GenerateBlocks Pro插件 构建更好的WordPress网站 GenerateBlocks Pro插件是一个 WordPress 插件,几乎可以完成任何事情,可让您创建轻量级和多功能的网站。由与流行且快速的 GeneratePress 主题相同的创作者构建,该插件不负众望。使用 Genera…

数字孪生技术的未来预测

这种二维地图与摄像头关联,从实用角度来说,是不是比那些VRGIS和三维实景效果要好的多?也更能够还原现场情况,最重要的是成本也会低很多!​​​ 那些用预先采集数据的方式(比如倾斜摄影和3D建模)来还原真实现…

springboot定时执行某个任务

springboot定时执行某个任务 要定时执行的方法加上Schedule注解 括号内跟 cron表达式 “ 30 15 10 * * ?” 代表秒 分 时 日 月 周几 启动类上加上EnableScheduling 注释

【ROS2】MOMO的鱼香ROS2(一)ROS2入门篇——从Ubuntu操作系统开启

从Ubuntu操作系统开启 引言1 术语汇总2 Ubuntu (操作系统)2.1 Ubuntu权限管理2.2 Ubuntu安装软件2.2.1 使用apt命令安装2.2.2 dpkg安装deb包2.2.3 make install源代码安装 2.3 Ubuntu之常用指令2.3.1 ls命令(查看文件)2.3.2 cd 命…

C语言编程入门 – main()函数

C语言编程入门 – main()函数 C Programming Language Essentials - main() function By JacksonML 初见C语言&#xff0c;总被一个全球闻名的”Hello, world!”打印输出所惊讶。 1. 开启Hello, world!的C程序 代码如下&#xff1a; # include <stdio.h> int main(…

<JavaEE> TCP 的通信机制(四) -- 流量控制 和 拥塞控制

目录 TCP的通信机制的核心特性 五、流量控制 1&#xff09;什么是“流量控制”&#xff1f; 2&#xff09;如何做到“流量控制”&#xff1f; 3&#xff09;“流量控制”的作用 六、拥塞控制 1&#xff09;什么是“拥塞控制”&#xff1f; 2&#xff09;如何做到“拥塞…

OSPF的DR与BDR-新版(16)

目录 整体拓扑 操作步骤 1.基本配置 1.1 配置R1的IP 1.2 配置R2的IP 1.3 配置R3的IP 1.4 配置R4的IP 1.5 检测R1与R4连通性 1.6 检测R1与R2连通性 1.7 检测R1与R3连通性 2.搭建基本的OSPF网络 2.1 配置R1 OSPF 2.2 配置R2 OSPF 2.3 配置R3 OSPF 2.4 配置R4 OSPF…

Python+OpenGL绘制3D模型(九)完善插件功能: 矩阵,材质,法线

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

免费的云服务器推荐~三丰云

对于许多初创企业和小型公司来说&#xff0c;寻找一个经济实惠且可靠的云服务提供商是至关重要的。在这方面&#xff0c;三丰云以其免费虚拟主机和云服务器吸引了大量用户。 1. 注册与界面 注册三丰云的账户过程简单明了&#xff0c;只需按照步骤填写必要信息即可。其界面设计…