Unity筆記(二)——Time、Vector3、位置位移、角度、旋轉、縮放、看向

寫在前面

寫本系列的目的(自用)是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。這里只有部分語法知識。

五、Time時間相關

1、時間縮放比例

概念:可以通過UnityEngine.Time類的timeScale屬性控制游戲時間流速

用法:暫停時間: 設置Time.timeScale = 0

? ? ? ? ? ?正常速度: 設置Time.timeScale = 1(默認值)

? ? ? ? ? ?倍速播放: 設置Time.timeScale = nn>1時為n倍速,如2表示兩倍速)

應用場景:游戲暫停功能實現、???????過場動畫的慢動作/快進效果???????、技能冷卻時間加速/減速。

2、幀間隔時間

概念:幀間隔時間指最近?幀完成?次游戲循環所?的時間,單位是秒。游戲本質是死循環,?幀即?次循環執?。

用法:???????通過Time.deltaTime獲取受時間縮放影響的幀間隔時間,Time.unscaledDeltaTime獲取不受影響的幀間隔時間。

其中,受影響的幀間隔時間 = 不受影響的幀間隔時間*縮放比例timeScale。不受scale影響的幀間隔時間始終返回實際幀間隔時間。如下例:

public class time : MonoBehaviour
{void Update(){//Time.timeScale = 0;//Time.timeScale = 1;Time.timeScale = 2;print("幀間隔:"+Time.deltaTime);print("不受影響幀間隔:"+Time.unscaledDeltaTime);}
}

輸出:?

作用:?

(1)實現位移計算:???????基于物理公式路程 = 時間 × 速度,在Update()中每幀?Time.deltaTime參與計算實現平滑移動。

(2)選擇是否跟隨游戲靜止:???????需要隨游戲暫停停?移動:使?Time.deltaTime、???????需要?視游戲暫停繼續移動:使?Time.unscaledDeltaTime

(3)加速原理:timeScale=2時,受影響的幀間隔時間值變為實際值×2,導致位移計算量倍增,表現為2倍速效果。

3、游戲開始到現在的時間

Time.time:???????timeScale影響的游戲運?時間

Time.unscaledtime:不受timeScale???????影響的真實運?時間

print("游戲時間" + Time.time);

應用:主要用于單機游戲計時,網絡游戲一般使用服務器時間。

4、 物理幀間隔時間

(1)物理幀間隔時間和幀間隔時間的區別

物理幀間隔時間:指 Unity物理引擎(如剛體運動、碰撞檢測、關節模擬)的更新間隔時間,用于保證物理模擬的一致性和穩定性。

幀間隔時間:指渲染幀(游戲畫面更新)之間的時間差,即一幀渲染完成到下一幀開始渲染的間隔。

(2)物理幀間隔時間

物理幀間隔時間是固定的,可以通過???????EditProject SettingsTime設置Fixed Timestep值。默認值為0.02秒(50Hz)

獲取方法:

    void Update(){Time.timeScale = 2;}private void FixedUpdate(){print("物理幀間隔" + Time.fixedDeltaTime);print("不受scale影響" + Time.fixedUnscaledDeltaTime);}

?5、幀數

???????概念:幀數表示從游戲開始到現在運?的循環次數,?幀即?次游戲循環。Unity底層只有?個主循環,不同腳本中的Update?法都在同?幀中按順序執?。

獲取方法:???????通過Time.frameCount靜態屬性獲取,該屬性返回int類型值,記錄當前累計幀數。

print(Time.frameCount);

六、 Vector3基礎、位置位移

transform:???????游戲對象的位移、旋轉、縮放等操作都由Transform組件處理,是Unity中極其重要的類

vector3主要用于表示三維坐標系中的點和向量

1、Vector3

(1)Vector3的聲明

vector3的聲明可以采用無參構造、有參構造。vector3可以不new直接賦值。

    void Start(){Vector3 v = new Vector3();v.x = 10;v.y = 10;v.z = 10;//當參數不滿3個時,沒有傳入的參數默認為0Vector3 v1 = new Vector3(10, 10);Vector3 v2 = new Vector3(10, 10, 10);Vector3 v3;v3.x = 10;v3.y = 10;v3.z = 10;}

需要注意的是,當使用有參構造時,若傳入的參數不足三個,沒傳入的參數默認為0。

(2)Vector3的運算

+ - * / 都有

void Start()
{Vector3 v4 = new Vector3(1, 1, 1);Vector3 v5 = new Vector3(2, 2, 2);print(v4 * 10);print(v5 / 2);print(v4 + v5);
}

輸出如下:

(3)常用靜態屬性與方法

Vector3有一些常用靜態屬性,可以生成特殊的向量

void Start()
{print(Vector3.zero);//000print(Vector3.right);//100print(Vector3.left);//-100print(Vector3.forward);//001print(Vector3.back);//00-1print(Vector3.up);//010print(Vector3.down);//0-10
}

結果是:

?Vecotr3的常用方法可以直接計算兩個點之間的距離:

void Start()
{Vector3 v4 = new Vector3(1, 1, 1);Vector3 v5 = new Vector3(2, 2, 2);print(Vector3.Distance(v4, v5));
}

?2、位置

(1)相對于世界坐標系的位置

位置獲取:通過this.transform.position獲取當前腳本掛載的對象相對于世界坐標系原點的位置

由于面板里顯示的對象位置與父對象有關,所以如果當前對象有父對象且???????父對象位置不在原點,?板顯示的位置與transform.position獲取的值會不同。當父對象的位置在原點000時,相同。

此時沒有父對象:

    void Start(){this.transform.position = new Vector3(10, 10, 10);print(this.transform.position);}

運行前后的面板及控制臺輸出:

當有父對象時,由于面板顯示的是子對象相對父對象的位置坐標,就會與輸出結果(世界坐標產生差異),所以也可以直接輸出相對父對象的位置坐標。?

(2)相對父對象的位置

位置獲取:使?this.transform.localPosition獲取相對于?對象的位置

這樣,localPosition始終與Inspector面板顯示的位置一致。

    void Start(){print(this.transform.position);print(this.transform.localPosition);}

(3)對象的位置修改、朝向獲取

對象的朝向獲取可以采用之前提到的Vector3.up、Vector3.forward等。例如:

print(this.transform.forward);
print(this.transform.up);

這里分別打印的是對象的面朝向和頭頂朝向。?

若是要對對象的x、y、z軸進行修改,需要統一修改,不能單獨修改其中一個坐標的值,除非采用整體賦值。

    void Start(){this.transform.localPosition = Vector3.up * 10;print(this.transform.localPosition);//若是想改變單一坐標軸this.transform.localPosition = new Vector3(10, this.transform.localPosition.y, this.transform.localPosition.z);print(this.transform.localPosition);//還可以整體修改Vector3 vt = this.transform.localPosition;vt.x = 0;this.transform.localPosition = vt;print(this.transform.localPosition);}

結果為:

3、位移

在坐標系下,位移的核心公式為:路程=方向 × 速度 × 時間,適?于所有維度坐標系。類似于數學里的,向量以及向量在每個坐標軸上的分量。

位移可以自己計算以及利用API計算。

(1)自己計算位移

自己計算位移嚴格遵循核心方式:路程=方向×速度×時間即可。由于運動與幀相關,因此寫在upDate函數中。

其中,方向傳入的是Vector3向量。位移方向有兩種:相對于自身的坐標系、相對于世界的坐標系。如果要相對于自身,就可以使用this.transform.方向。需要相對于世界就直接傳入對應的Vector3向量,例如Vector3.right。

速度寫入一個數字即可,時間可以使用Time.deltaTime保證幀率無關的平滑運動。如下:

    void Update(){//相對于對象自身的坐標系的x軸正方向移動this.transform.position += this.transform.right * 1 * Time.deltaTime;//相對于世界坐標系的x軸正方向移動this.transform.position += Vector3.right * 1 * Time.deltaTime;}

(2)使用API位移

使用transform.Translate方法。常用的重載方法是:???????

Translate(Vector3 translation)、???????Translate(Vector3 translation, Space relativeTo)

其中第一個參數是位移向量,計算公式為路程 = 方向 × 速度 × 時間;第二個參數是相對坐標系(默認Space.Self)。

其中,參數為Space.Self時表示相對于物體自身坐標系,為Space.World表示相對于世界坐標系。

    void Update(){//1、相對于世界坐標系,朝向z軸世界坐標系的正方向this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);//2、相對于世界坐標系,自己的面朝向去動this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);//3、相對于自己坐標系的自己的面的z方向動 (基本不使用)this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.Self);//4、相對于自己的坐標系下 z軸正方向移動this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);}

七、角度和旋轉

1、角度

角度同樣有兩種,相對世界坐標系的角度和相對父對象的角度。角度采用的方法是transform.eulerAngles。

    void Start(){//打印相對世界坐標的角度print(this.transform.eulerAngles);//打印父對象的角度print(this.transform.localEulerAngles);}

打印結果:

?修改角度的方式與修改位置的方式一樣,必須同時設置x,y,z三個方向,不能單獨修改某一方向。

this.transform.localEulerAngles = Vector3.zero;

2、旋轉

旋轉分為自傳和公轉(繞某個點或某個對象旋轉)

(1)自轉

自轉使用Unity自帶的API,transform.Rotate,這個方法常用的有兩種形式:兩參數形式和三參數形式。

以下例子的第一句就是兩參數形式,兩個參數分別為:指定每個軸具體轉多少度、坐標系選擇(世界or自己,默認為自己)

第二句是三個參數,三個參數分別為:旋轉軸方向(常用Vector3.up/right/forward)、旋轉角度、坐標系選擇(世界or自己,默認為自己)

    void Update(){this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime,Space.World);this.transform.Rotate(Vector3.right, 10 * Time.deltaTime);}

(2)繞著點轉

繞著點轉使用的是函數transform.RotateAround(),會傳入三個參數:旋轉中心點、旋轉軸方向、旋轉角度

void Update()
{transform.RotateAround(Vector3.zero,Vector3.up,10*Time.deltaTime);
}

運行時,當前對象會繞著000點公轉:

八、縮放和看向?

1、縮放

(1)兩種縮放

縮放同樣有兩種,相對世界坐標系進行縮放和相對父對象進行縮放,其中

使?this.transform.lossyScale獲取相對于世界坐標系的縮放值;

使?this.transform.localScale獲取相對于?對象的縮放值。

例子中,父對象的縮放值為2,2,2;當前對象(子對象)的縮放值為1,1,1。由于inspector面板顯示的是相對于父對象的縮放值,因此此時子對象相對世界坐標的縮放值也應該是2,2,2。

    void Start(){print(this.transform.lossyScale);print(this.transform.localScale);}

結果是:?

(2)縮放的修改?

關于縮放的修改。對于相對于世界坐標系的縮放值只能獲取不能修改,而相對于父對象的可以修改,也只能同時修改x、y、z,不能單獨修改。

this.transform.localScale = new Vector3(3, 3, 3);

可以在UpDate函數中實現隨時間漸變縮放:

    void Update(){this.transform.localScale += Vector3.one * Time.deltaTime;}

2、看向

看向是指定當前對象看向一個點或者一個對象,使用this.transform.LookAt(),里面傳入該點的位置信息。

(1)看向一個點

    void Update(){this.transform.LookAt(Vector3.zero);}

結果:

(2)看向一個對象

需要在this.transform.LookAt()中傳入對應向量的transform信息。

public class Scale_cube : MonoBehaviour
{public GameObject lookAtObj;void Update(){this.transform.LookAt(lookAtObj.transform);}
}

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

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

相關文章

vue+vite項目中怎么定義一個環境變量可以在開發環境和生產環境使用不同的值,并且可以在vue頁面和index.html通用。

首先我們需要下載一個插件vite-plugin-html然后再項目最外層和index.html同級目錄下新建.env.development和.env.production兩個項目并且定義你想要的環境變量名:注意要以VITE_開頭VITE_APP_MAP_TOKEN1233444然后vite.config.js文件import { defineConfig,loadEnv } from vite…

Python-深度學習--2信息熵,條件熵(ID3決策樹),KL散度

一、信息熵(Entropy)的計算與應用信息熵用于衡量一個概率分布的不確定性,值越大表示分布越分散(不確定性越高)。1. 數學定義對于離散概率分布 P,信息熵公式為:(通常以 2 為底單位是比…

國產化Word處理控件Spire.Doc教程:Python提取Word文檔中的文本、圖片、表格等

在現代辦公場景中,Word文檔已成為信息存儲與交流的重要載體,承載著關鍵的業務數據、結構化表格、可視化圖表以及協作批注等重要內容。面對日益增長的文檔處理需求,傳統的人工操作方式已難以滿足效率與準確性的雙重標準。采用Python實現Word文…

Spring IOC 原理

Spring IoC(控制反轉)是Spring框架的核心機制,其原理是通過容器管理對象生命周期和依賴關系,實現解耦。 1. 控制反轉(IoC)核心思想 傳統模式:對象主動創建依賴(如new Service()&…

VSCode:基礎使用 / 使用積累

官網 Visual Studio Code - Code Editing. Redefined 記錄一、更新依賴 嘗試刪除yarn.lock文件 記錄二、“解決沖突”的方式變了 更新后,“解決沖突”的方式變了,有的時候能選中兩者,有的時候不能 現在又更新了,回復到了原來…

tcp 確認應答和超時時間

1. 確認應答之間的時間(RTT)這是指 從發送方發送數據到接收方返回確認(ACK)之間的時間。它反映的是數據傳輸的 往返延遲。例如,發送方發送一個數據包,接收方收到后,回傳一個確認包(A…

圖的應用-最短路徑

最短路徑的典型用途:交通網絡的問題——從甲地到乙地之間是否有公路連通?在有多條通路的情況下,哪一條路最短?交通網絡用有向網來表示:頂點——表示地點,弧——表示兩個地點有路連通,弧上的權值…

【qt5_study】1.Hello world

模板 作為初學者我們選擇第一個Application(Qt)和 Qt Widgets Application,所謂的模板就是 Qt為了方便開發程序,在新建工程時可以讓用戶基于一種模板來編寫程序,包括 cpp文件, ui文件都已經快速的創建,而不用用戶手動創建這些文件。 基類 這里默認選擇的基類為 QMainWin…

項目構想|文生圖小程序

Date: August 4, 2025項目介紹 👋,我們通過 Vibe Coding 做一個文字生成圖片的小程序。 我們會從需求分析、技術選型、UI設計、項目構筑到最后打包,一路嘗試 Vibe Coding 實現。 創建項目 創建文件夾:ai-pic-mini-app 采用 Git 進…

TiDB/MongoDB/Taosdb存儲引擎概覽

數據庫類型存儲引擎數據結構源碼位置tidbRockDBLSM樹https://github.com/facebook/rocksdbmongodbWiredTigerB 樹/LSM樹https://github.com/wiredtiger/wiredtigerTDengineTSDBBRINhttps://github.com/taosdata/TDengine 1、tidb存儲引擎概覽 LSM樹數據結構描述LSM樹(Log Str…

qt窗口--01

文章目錄qt窗口--01窗口概覽菜單欄工具欄狀態欄浮動窗口子窗口對話框model結語很高興和大家見面,給生活加點impetus!!開啟今天的編程之路!! 作者:?( ‘ω’ )?260 我的專欄:qt,Li…

Neo4j 社區版 Mac 安裝教程

最近用到了nebulagraph圖數據庫做金融反欺詐項目,雖然nebula屬于分布式架構,但依然感覺nebula使用不太順手,這里順便研究一下neo4j這款數據庫如何,這里先從安裝開始? 一、 準備工作 確認 Java 版本要求: N…

Android Studio(2025.1.2)Gemini Agent 使用指南

Android Studio(2025.1.2)Gemini Agent 使用指南 文章目錄Android Studio(2025.1.2)Gemini Agent 使用指南1. 什么是 Gemini Agent?2. 如何啟用和配置 Gemini Agent2.1 獲取 API Key2.2 在 Android Studio 中配置3. 實…

計算機視覺--opencv(代碼詳細教程)

在計算機視覺的廣袤領域中,OpenCV 是一座極為關鍵的里程碑。無論是在前沿的學術研究,還是在蓬勃發展的工業界,OpenCV 憑借其強大的功能與高效的性能,為開發者提供了豐富的圖像處理和計算機視覺算法,助力無數項目落地。…

Centos6停止服務后yum改用阿里云

環境: OS:Centos 6.9 1.進入到yum配置目錄 cd /etc/yum.repos.d 2.備份 cp CentOS-Base.repo CentOS-Base.repo.bk 3.下載 wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo 問題1: 因為Centos-6早就停止了更新維護,阿里云鏡像網站將其倉庫…

putty+Xming(XLaunch) 遠程登錄VirtualBox中的Ubuntu24.04,顯示圖形化(GUI)界面

測試環境:VirtualBox 7,Ubuntu24.04 desktop,Ubuntu24.04 Server(no desktop),均測試成功。 一、先測試putty遠程登錄VirtualBox中的Ubuntu,可以使用ssh、Telnet 等協議。參見拙文《ssh連接VirtualBox中的Ubuntu24.04(win11、put…

SpringBoot微頭條實戰項目

一、項目概述 微頭條是一個基于現代技術棧構建的新聞發布和瀏覽平臺,旨在為用戶提供便捷的新聞閱讀體驗和高效的新聞管理功能。該項目通過前后端分離的架構設計,實現了用戶注冊、登錄、新聞瀏覽、搜索、發布、修改和刪除等功能,同時通過JWT技…

如何給電腦換個ip地址?電腦換ip幾種方法

更換電腦的IP地址的方法取決于你的具體需求和網絡環境(是換本地局域網IP還是換對外公網IP)。以下是幾種常見的方法: 一、更換本地局域網IP地址(在同一個網絡內) 這個IP地址通常由你的路由器(或公司的網絡管…

Pytest項目_day04(Python做接口請求)

Requests包 在python中,可以使用requests包,用于做接口請求和接口測試request支持http和https簡單的get函數調用如下:r.jsonr.status_coder.textget函數的帶params用法post函數的帶params用法 post也可以和get一樣在url中傳入參數在requests包…

Flink與Kafka核心源碼詳解-目錄

Flink是Apache軟件基金會下開源的分布式流批一體計算框架,具備實時流計算和高吞吐批處理計算的大數據計算能力。本專欄內容為Flink源碼解析的記錄與分享。 本文解析的Flink源碼版本為:flink-1.19.0 以下為Flink-1.19.0-完整源碼詳解的目錄導航。 Flink-…