Unity的相機跟隨和第三人稱視角

Unity相機跟隨和第三人稱視角

  • 介紹
  • 鏡頭視角
    • 跟隨人物方向進行旋轉的鏡頭視角
    • 固定球和人的鏡頭視角
  • 思路
    • 跟隨人物方向進行旋轉的鏡頭視角
    • 固定球和人的鏡頭視角
  • 鏡頭旋轉代碼
  • 人物移動的參考代碼
  • 注意

介紹

最近足球項目的鏡頭在做改動,觀察了一下實況足球的視角,發現他有多種鏡頭模式,帶球時跟隨人物進行旋轉的第三人稱視角,不帶球時鏡頭鎖定人和球都能看到的視角,其實還有很多鏡頭視角,這里我主要選擇這兩個來講一下做一個demo。(我這里的demo不會做的很細大概做一個出來,他的鏡頭很細致細致到旋轉多少度才會有反饋,并不是實時旋轉反饋的)

鏡頭視角

跟隨人物方向進行旋轉的鏡頭視角

請添加圖片描述

固定球和人的鏡頭視角

請添加圖片描述

這里大家可以參考一下,因為如果要做細致的話其實還有很多需要寫的地方,這里我也只是做了個簡單的demo給需要類似這種鏡頭的伙伴一個思路。

思路

跟隨人物方向進行旋轉的鏡頭視角

參考我上面的這個gif,其實可以觀察的出來,其實相機的是始終在你控制的人物正后上方,這樣只需要計算出來相機應該在的位置,然后用現在的位置與最終的位置做一個lerp差值移動,緩慢移動到最終位置。

固定球和人的鏡頭視角

根據上面的圖我們大概可以看出來,相機是始終以球和人為中心,轉向也始終是球和人,相機的位置這里就是球到人連線的后方,旋轉方向也是這個反向量,這塊也很好理解。

鏡頭旋轉代碼

這里我不做太多的解釋了,大家應該都看得懂。
target是相機跟隨的目標
football是附屬固定的次要目標
offset是相機的高和前后距離
還有兩個平滑度參數也可以進行調整
這個直接掛在相機上即可

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FollowCamera : MonoBehaviour
{public Transform target; // 要跟隨的目標對象public Transform football; // 其次要跟隨的目標public Vector2 offset = new Vector2(2, 5);   // 相機與目標之間的偏移量public float smoothSpeed = 0.125f; // 相機跟隨平滑度public float rotateSpeed = 0.125f;public bool IsHasBall = true;void LateUpdate(){if (target == null)return;if (Input.GetKeyDown(KeyCode.Q)) {IsHasBall = !IsHasBall;}if (IsHasBall){Vector3 desiredPosition = target.position + Vector3.up * offset.y - target.forward * offset.x;Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);transform.position = smoothedPosition;// 獲取目標對象的正前方Vector3 lookDirection = target.forward;// 使用 Quaternion.LookRotation 方法計算相機的旋轉方向Quaternion targetRotation = Quaternion.LookRotation(lookDirection);// 應用旋轉transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotateSpeed);}//沒有球的狀態else{//自身到足球的單位向量Vector3 dir = (target.position - football.position).normalized;Vector3 desiredPosition = target.position + Vector3.up * offset.y + dir * offset.x;Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);transform.position = smoothedPosition;//足球設置位置//求出自己和球的中點,讓相機朝向這個中點Vector3 tar = ((target.position + football.position) * 0.5f - smoothedPosition).normalized;// 獲取目標對象的正前方Vector3 lookDirection = tar;// 使用 Quaternion.LookRotation 方法計算相機的旋轉方向Quaternion targetRotation = Quaternion.LookRotation(lookDirection);// 應用旋轉transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotateSpeed);}}
}

人物移動的參考代碼

人物移動的有很多種方式,這里我為了測試用了個比較簡單的方式去做,參考一下即可
正常的人物移動是需要按照鏡頭的方向前進后退等,這里我只是為了方便測試沒有寫的很細。

using UnityEngine;public class RoleCtrlTest : MonoBehaviour
{public float moveSpeed = 5f; // 人物移動速度public float rotationSpeed = 180f; // 人物轉向速度void Update(){// 獲取玩家的輸入float moveHorizontal = Input.GetAxis("Horizontal");if (moveHorizontal == 0){}else if (moveHorizontal > 0){transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);}else if (moveHorizontal < 0){transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime);}if (Input.GetKey(KeyCode.W)){transform.Translate(transform.forward * moveSpeed * Time.deltaTime, Space.World);transform.position += transform.forward * moveSpeed * Time.deltaTime;}}
}

注意

鏡頭其實還有很多的插件可以使用,比如Cinemachine插件,其實還有很多也不舉例子了,因為插件想要符合多種鏡頭模式需要長時間經歷注入,所以我選擇了手寫一個。
感謝大家的支持和關注

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714134.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

npm digital envelope routines::unsupported

問題描述&#xff1a;npm運行命令報錯&#xff1a;digital envelope routines::unsupported 原因&#xff1a;node版本過高 解決方案&#xff1a;在運行命令之前加上 SET NODE_OPTIONS--openssl-legacy-provider && SET NODE_OPTIONS--openssl-legacy-provider &&a…

阿里云服務器免費6個月,居然又出了企業版

我之前收到了阿里云的免費6個月服務器&#xff0c;現在上面掛著一些網頁。 由于帶寬只有1M&#xff0c;所以用得不多。 今晚本來打算買臺新服務器&#xff0c;發現阿里云6個月免費促銷居然出了企業版。 之前只有一個版本。 我手頭正好有資源&#xff0c;于是又免費來了一臺服…

Eslint在Vscode中使用技巧的相關技巧

ps :該文章會詳細記錄構建一個腳手架遇到的問題&#xff0c;會持續更新&#xff0c;請定時查看 Eslint相關? 在vscode中使用eslint插件 在vscode中用戶配置沒有開啟eslint.enable 在vscode中工作區配置開啟eslint.enable settings.json中沒有做eslint相關配置 在編寫的vue…

敏捷方法簡介

敏捷方法簡介 特點 適應性&#xff0c;應對變化以人為本&#xff0c;發揮人的特性迭代增量式開發&#xff0c;逐版本更新 實踐 極限編程 特點 加強交流從簡單做起尋求反饋實事求是 水晶系列方法 特點 以人為中心&#xff0c;機動性一組經過證明、對不同類型項目非常有效…

【QT】Qt Charts概述

目錄 1 QtCharts模塊 2 圖表的主要組成部分 2.1 QChartView的功能 2.2 序列 2.3 坐標軸 2.4 圖例 3 一個簡單的QChart繪圖程序 QtCharts是Qt提供的圖表模塊&#xff0c;在Qt5.7以前只有商業版才有Qt Charts&#xff0c;但是從Qt5.7開始&#xff0c;社區版本也包含了Qt C…

藍橋杯倒計時41天!DFS進階1——回溯

DFS進階1——回溯 先說一下回溯的板子 dfs(){ for(......){標記信息dfs()撤銷標記 } }回溯模板——遞歸實現排列型枚舉 題目分析 其實就是對1~n的數字全排列&#xff0c;這里就可以用dfs去做&#xff0c;1~n全排列我其實是確定每一個位置我應該放哪一個數字&#xff0c;那么…

Qt程序設計-解析和生成json詳解

目錄 概述 JSON的兩種結構 解析和生成json 解析對象結構 生成對象結構

【MySQL】mvcc以及三個重要日志

&#x1f34e;個人博客&#xff1a;個人主頁 &#x1f3c6;個人專欄&#xff1a;【】數據庫 ?? 功不唐捐&#xff0c;玉汝于成 目錄 前言 正文 MVCC關鍵概念&#xff1a; MVCC機制的優點&#xff1a; 三個重要的日志&#xff1a; 重做日志&#xff1a; 回滾日志&am…

【Java項目介紹和界面搭建】拼圖小游戲——打亂圖片順序

&#x1f36c; 博主介紹&#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【應急響應】 【Java】 【VulnHub靶場復現】【面試分析】 &#x1f389;點贊?評論?收藏 …

再次走到了個人發展的十字路口

人生有非常多的十字路口 諸如&#xff1a;大學選擇專業、畢業選擇公司、選擇技術方向、兩年發展方向、三年發展方向、五年發展方向。 在之前&#xff0c;我選擇深入做elasticsearch&#xff0c;做專精es搜索和優化。做了大概4年時間。 但是現在又走到了很難抉擇的十字路口 第…

網絡仿真(一)

網絡仿真的意義 在網絡規劃和設計、網絡設備研發、網絡協議開發中&#xff0c;需要一種手段來反映和預測網絡的性能 網絡仿真可以提高網絡規劃設計的可靠性和準確性&#xff0c;明顯降低網絡投資風險&#xff0c;減少不必要的浪費 Ns-2 is a discrete event simulator Sched…

持安科技亮相張江高科895創業營,總評分第三名榮獲「最具創新性企業」!

近日&#xff0c;張江高科895創業營&#xff08;第十三季&#xff09;信息安全專場Demo day&結營儀式在上海集成電路設計產業園圓滿落幕。本季創業營通過多種渠道在海內外甄選優秀創業項目&#xff0c;一共擇優錄取了29家入營&#xff0c;最終甄選出9家代表參加Demo day路演…

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the ‘ssl‘報錯解決

安裝labelme出錯了 根據爆棧的提示信息&#xff0c;我在cmd運行以下命令之后一切正常了&#xff0c;解決了問題&#xff01; pip install urllib31.26.6參考網址&#xff1a;ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ‘ssl’ module is compile…

一文徹底搞懂基于數組和鏈表分別實現LRU算法

文章目錄 1. LRU算法2. 基于數組實現LRU算法3. 基于鏈表實現LRU算法 1. LRU算法 常見的緩存淘汰策略有三種&#xff0c;分別是&#xff1a;先進先出策略FIFO&#xff08;First In&#xff0c;First Out&#xff09;、最少使用策略LFU&#xff08;Least Frequently Used&#x…

董兆祥出席工業廢水資源化,開創變廢為寶新途徑演講

演講嘉賓&#xff1a;董兆祥 董事長 河北奧博水處理有限公司 演講題目&#xff1a;工業廢水資源化&#xff0c;開創變廢為寶新途徑 會議簡介 “十四五”規劃中提出&#xff0c;提高工業、能源領城智能化與信息化融合&#xff0c;明確“低碳經濟”新的戰略目標&#xff0c;熱…

springcloud:3.2測試超時機制

服務提供者 Openfeign遠程調用服務提供者搭建 文章地址http://t.csdnimg.cn/06iz8 PaymentController【控制層】 /*** 測試超時機制** return*/GetMapping("/timeout")public String TimeOut() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {…

應用層DDoS防護:理解、必要性與實現策略

一、應用層簡介 應用層&#xff0c;也稱作第七層&#xff0c;是OSI&#xff08;開放系統互聯&#xff09;模型中的最高層。在這一層&#xff0c;數據以特定的應用程序協議格式進行傳輸&#xff0c;如HTTP、FTP、SMTP等。應用層的主要職責是為用戶提供網絡服務&#xff0c;如文…

【筆記】Android Telephony 獲取SubscriptionManager和TelephonyManager

背景 早期的手機只有單卡 &#xff0c;基本用默認卡&#xff08;代碼如下&#xff09;&#xff0c;那么雙卡手機的業務邏輯就會存在問題。 //手動搜網的功能案例&#xff0c;根據卡槽/Phone對象直接獲取信息private Context mcontext context; private Phone mPhone PhoneF…

LeetCode 560. 和為 K 的子數組

由于題目要求子數組必須連續&#xff0c;也就是需要一個和為K的區間&#xff0c;可以利用前綴和預處理后&#xff0c;枚舉找到這些區間段[l,r]&#xff0c;使之滿足s[r] - s[l] k。 不理解前綴和的可以先看這里。 class Solution { public:int subarraySum(vector<int>…

MongoDB聚合運算符:$count

文章目錄 語法使用舉例在$group階段中使用在$setWindowFields階段使用 $count聚合運算符返回分組中文檔的數量。從5.0開始支持。 語法 { $count: { } }$count不需要參數 使用 $count可以用于下列聚合階段&#xff1a; $bucket$bucket$group$setWindowFields 在$group階段中…