【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
英文地址,請注明出處:http://en.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…