【Unity开发】Unity实现第一人称视角与第三人称视角切换功能

一、效果展示

第三人称视角:固定摄像机,无任何操作
在这里插入图片描述
第一人称视角:用户可以通过wsad进行前后左右移动,qe进行上升下降操作
在这里插入图片描述
不同视角之间切换会有一个过渡动画,切换第一视角的初始位置始终为原点(0,0,0)的位置,视频展示如下:

Unity实现第一人称视角与第三人称视角切换功能

二、实现完整代码

using System.Collections;
using UnityEngine;
using UnityEngine.UI;public class CameraControl : MonoBehaviour
{public Camera controlCameral;           // ✅ 要控制的摄像机public Button buttoncChangeCamera;      //切换视角按钮public float moveSpeed = 5f;            //第一视角移动速度public float lookSensitivity = 2f;      //第一视角镜头旋转灵敏度public float verticalLookLimit = 80f;   //第一视角镜头垂直方向变化范围限制public Transform thirdPersonPosition;   // 第三视角参考点(位置 + 角度)public Transform firstPersonPosition;   // 第一视角参考点(位置 + 角度)public float transitionSpeed = 2f;      //不同视角切换速度[SerializeField] private float rotationX = 0f;[SerializeField] private float currentYRotation = 0f;[SerializeField] private bool inFirstPerson = false;[SerializeField] private bool isTransitioning = false;void Start(){if (controlCameral == null){Debug.LogError("Camera is not assigned!");return;}// 初始化摄像机位置角度controlCameral.transform.position = thirdPersonPosition.position;controlCameral.transform.rotation = thirdPersonPosition.rotation;var euler = controlCameral.transform.eulerAngles;rotationX = euler.x;currentYRotation = euler.y;buttoncChangeCamera.onClick.AddListener(ChangeCameraView);}void Update(){if (!isTransitioning && inFirstPerson){HandleMouseLook();HandleMovement();}}/// <summary>/// 切换视角的方法/// </summary>public void ChangeCameraView(){if (isTransitioning || controlCameral == null) return;if (inFirstPerson){StartCoroutine(SwitchToPosition(thirdPersonPosition.position, thirdPersonPosition.rotation));}else{StartCoroutine(SwitchToPosition(firstPersonPosition.position, firstPersonPosition.rotation));}inFirstPerson = !inFirstPerson;}/// <summary>/// 第一视角,上下左右镜头旋转/// </summary>void HandleMouseLook(){float mouseX = Input.GetAxis("Mouse X") * lookSensitivity;float mouseY = Input.GetAxis("Mouse Y") * lookSensitivity;currentYRotation += mouseX;rotationX -= mouseY;rotationX = Mathf.Clamp(rotationX, -verticalLookLimit, verticalLookLimit);controlCameral.transform.localEulerAngles = new Vector3(rotationX, currentYRotation, 0f);}/// <summary>/// 第一视角,前后左右上下移动方法/// </summary>void HandleMovement(){float moveForward = Input.GetAxis("Vertical");float moveRight = Input.GetAxis("Horizontal");float moveUp = 0f;if (Input.GetKey(KeyCode.E)) moveUp += 1f;if (Input.GetKey(KeyCode.Q)) moveUp -= 1f;Vector3 move = controlCameral.transform.forward * moveForward +controlCameral.transform.right * moveRight +controlCameral.transform.up * moveUp;controlCameral.transform.position += move * moveSpeed * Time.deltaTime;}/// <summary>/// 切换不同位置方法/// </summary>/// <param name="targetPos">目标位置</param>/// <param name="targetRot">目标旋转角度</param>/// <returns></returns>IEnumerator SwitchToPosition(Vector3 targetPos, Quaternion targetRot){isTransitioning = true;Vector3 startPos = controlCameral.transform.position;Quaternion startRot = controlCameral.transform.rotation;float t = 0f;while (t < 1f){t += Time.deltaTime * transitionSpeed;controlCameral.transform.position = Vector3.Lerp(startPos, targetPos, t);controlCameral.transform.rotation = Quaternion.Slerp(startRot, targetRot, t);yield return null;}controlCameral.transform.position = targetPos;controlCameral.transform.rotation = targetRot;// 更新角度缓存Vector3 euler = controlCameral.transform.eulerAngles;rotationX = euler.x;currentYRotation = euler.y;isTransitioning = false;}
}

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

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

相关文章

2025全球数字经济大会—云智算安全论坛暨第三届“SecGo论坛”成功召开!共筑安全新生态

2025年7月3日&#xff0c;由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院、中国通信标准化协会承办的全球数字经济大会—云智算安全论坛暨第三届“SecGo论坛”在京召开。北京市经济和信息化局副局长顾瑾栩、中国通信标准化协会副理事长兼秘书长代晓慧、中国信通院…

KingbaseES聚焦产品上线:金仓数据库在线体验平台上线,开启数据库实践新征程

KingbaseES聚焦产品上线&#xff1a;金仓数据库在线体验平台上线&#xff0c;开启数据库实践新征程KingbaseES 在线体验平台是为数据库使用者、开发者、架构师及 DBA 打造的轻量化实践平台&#xff0c;无需本地安装数据库环境&#xff0c;通过浏览器即可快速上手&#xff0c;降…

LLMs之DeepSeek:AI模型市场深度分析:DeepSeek的挑战与机遇,模型市场份额、Token经济学与未来发展

LLMs之DeepSeek&#xff1a;AI模型市场深度分析&#xff1a;DeepSeek的挑战与机遇&#xff0c;模型市场份额、Token经济学与未来发展 导读&#xff1a;该文章主要分析了中国大语言模型DeepSeek R1发布150天后的市场表现、Token经济学的影响以及AI模型市场的竞争格局。文章指出&…

服装零售企业跨区域运营难题破解方案

在服装零售行业&#xff0c;本地化业务系统因承载库存、销售等核心数据&#xff0c;成为众多企业的选择。然而对于门店分布广、规模较大的服装销售商而言&#xff0c;总部系统与各地门店的远程连接却面临挑战&#xff1a;员工远程办公效率低、POS机数据同步滞后、跨区域监管难度…

- 思考小记

对于 分布式系统&#xff0c;我还是抱有敬畏之心的&#xff0c;因为其内容过于庞大&#xff1b;我在学习基础编程的时候走过一个最大的弯路就是过度追求技术而忽视了基础编码能力&#xff0c;当时在学习springboot的时候&#xff0c;觉得那些新内容都是那么新奇高大上&#xff…

装备制造数字孪生底座平台

在《中国制造2025》和《“十四五”智能制造发展规划》的推动下&#xff0c;数字孪生技术被7次重点提及&#xff0c;成为装备制造业智能化升级的核心战略。从航空航天到重型机械&#xff0c;从设计验证到运维优化&#xff0c;数字孪生底座平台正通过“虚实映射”与“实时交互”&…

Redis构建缓存服务器

环境信息&#xff1a; redis-master----192.168.12.135 redis-slave-1-----192.168.12.136 redis-slave-2-----192.168.12.137 单机版Redis 安装Redis yum install -y gcc make jemalloc jemalloc-devel gcc-c wget tcl yum groupinstall -y "Development Tools" wge…

vscode python debugger关闭编辑器内的变量值自动显示

vscode 的python debugger调试器的最新版本2025.8.0, 会默认把变量的值显示出来, 如下图所示关闭的方法: 打开vscode的settings.json, 左下角点击齿轮按钮, 选择setting(设置), 然后在右上角三个按钮最中间的那个(open setting json), 输入 "debug.inlineValues": &q…

App爬虫工具篇-appium配置

接着上篇文章App爬虫工具篇-Appium安装,安装好了之后,还是不够的,要让其能够驱动手机端,还需要配置。这节课就深入说说如何配置Appium。 安卓手机 如果我们要使用 Android 设备做 App 抓取的话,还需要下载和配置 Android SDK,这里推荐直接安装 Android Studio,其下载地…

SpringAI系列 - 基于Spring AI 1.0.0 的AI助手实现示例

目录 一、基于 Spring AI 1.0.0 的AI助手实现示例二、AI助手架构设计2.1 系统范围与上下文 C12.2 容器图 C22.3 AI助手组件图 C3三、注意事项四、快速启动五、如何启用MCP一、基于 Spring AI 1.0.0 的AI助手实现示例 结合前文系列的介绍,本专栏提供了一个基于Spring AI 1.0.0…

电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测,附锂电池最新文章汇集

电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测&#xff0c;附锂电池最新文章汇集 目录电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测&#xff0c;附锂电池最新文章汇集预测效果基本描述程序设计参考资料源码地址&#xff1a; 电…

软考(软件设计师)数据库原理-SQL

一、SQL基本数据类型 SQL 数据类型速查表类别数据类型说明范围/示例适用场景整数类型INT / INTEGER标准整数类型-2 到 2-1 (-2,147,483,648 到 2,147,483,647)ID、年龄、数量等SMALLINT小范围整数-32,768 到 32,767小范围数值BIGINT大范围整数-2⁶ 到 2⁶-1大额订单号、时间戳T…

docker 安装数据集成平台 Apache SeaTunnel 服务

获取官方镜像 从 Docker Hub 上拉取最新的 Apache SeaTunnel 镜像&#xff1a; docker pull apache/seatunnel:latest创建目录 sudo mkdir -p /data/{conf,logs} # 需要 root 权限创建 /data 目录 sudo chown -R $USER:$USER /data # 将目录权限给当前用户&#xff08;可选&a…

数据结构:数组:线性查找(Linear Search)

目录 什么是线性查找&#xff1f; 时间复杂度分析 &#x1f9e0; 线性查找的优化 方法一&#xff1a;Move to Front&#xff08;哨兵&#xff09; 方法二&#xff1a;Transportation&#xff08;向前交换一步&#xff09; 什么是线性查找&#xff1f; 我们先问&#xf…

石子入水波纹效果:UV扰动着色器实现

利用UV坐标扰动来模拟水面是一种常见且有效的技术手段,上述效果主要通过对水面纹理的UV坐标进行动态偏移或扰动,从而模拟水波的流动和波纹效果。资源下载具体实现和原理如下: 基本思路:通过对水面纹理的UV坐标加上时间相关的扰动函数(如正弦波、余弦波、噪声函数等),使纹…

Java Lambda 类型推断详解:filter() 方法与 Predicate<? super T>

一、问题核心解析1. 代码示例分析List<String> strings Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered strings.stream().filter(string -> !str…

XSS:xss.haozi.me靶场练习

超链接:alert(1) 知识点: html <&#xff01;--被注释的内容--> <&#xff01;--被注释的内容!--> php /*被注释的内容*/ //被注释的内容 javascript /*被注释的内容*/ //被注释的内容 MySQL …

ubuntu 20.04 安装中文输入法 (sougou pin yin)

安装搜狗输入法包 参照官方指南完成 如果提示没有找到相关依赖&#xff0c;添加一下源&#xff1a; sudo add-apt-repository universe sudo apt update重启。

(DETR)End-to-End Object Detection with Transformers论文精读(逐段解析)

(DETR)End-to-End Object Detection with Transformers论文精读&#xff08;逐段解析&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/2005.12872 CVPR 2020 Facebook AI 发布 Abstract. We present a new method that views object detection as a direct set pred…

[linux][shell]通过分析 Nginx 的访问日志,检测异常 IP 地址并使用iptables 将其封禁

这段脚本的作用是通过分析 Nginx 的访问日志&#xff0c;检测异常的 IP 地址&#xff0c;并使用 iptables 封禁这些 IP。#!/bin/bash# 配置变量 LOG_FILE"/usr/local/nginx/logs/access.log" THRESHOLD10 DROP_LOG_FILE"/tmp/drop_ip.log" DATE$(date &quo…