Unity--時間和幀率

本文僅爲個人學習筆記,總結和分享,難免存在瑕疵與言論不嚴謹,若有缺漏務必留言告知,文章將會第一時間修正,以免誤導。同時也是給盒友們打卡在學


unity中如果不對代碼進行優化,則Update函數中的代碼會隨幀數的增加而增加運行次數


public class RubyController : MonoBehaviour{

// 每幀調用一次 Update 

// 讓遊戲對象每幀右移 0.1 

void Update() 

// 獲取水平輸入,按向左,會獲得 -1.0 f ; 按向右,會獲得 1.0 f

//input類管理用戶輸入

//GetAxis是獲取軸

//Horizontal水平相關操作,向左則會 -1.0 f,向右+1.0f 

float horizontal = Input.GetAxis("Horizontal"); 

// 獲取垂直輸入,按向下,會獲得 -1.0 f ; 按向上,會獲得 1.0 f

//Vertical向上向下不同 

float vertical = Input.GetAxis("Vertical"); 

// 獲取對象當前位置

//Vector是unity自帶類 

//創建一個Vector2類的position對象,並且用transform類表示該對象的座標值,存入position對象 

Vector2 position = transform.position; 

// 更改位置

//把positon對象的x值+0.1,並且存入 

position.x = position.x + 0.1f * horizontal; 

position.y = position.y + 0.1f * vertical; 

// 新位置給遊戲對象

// 將更改後的座標存入原始座標達到更改 

transform.position = position; 

 }

如上代碼,如果遊戲以每秒60幀的速度運行,那麼角色將會每秒移動60*0.1。如果每秒10幀,那麼將會每秒移動10*0.1。

即Position.x(新的x軸位置)=原有x軸位置+速度0.1f*幀數(60幀則爲*60)

這會導致不同機器,不同情況下運行同一遊戲速度不一致的問題,使遊戲的難易程度提高或降低

但也並非所有情況均會導致遊戲變糟, 《生化危機2:重製版》中利用每一幀判定一次傷害做到了近戰武器攻擊敵人,玩家可以通過增加武器停留在敵對目標體內的時間來達到打出更高傷害(模擬了現實生活中,小刀攻擊敵人並非是每次攻擊才能打出傷害,而是通過停留在敵人體內時間越長傷害越高),但此法僅適用於幀數鎖定的主機端,幀數如果不鎖定則可能出現每次攻擊傷害忽高忽低。


解法1:鎖幀

並不推薦

public class RubyController : MonoBehaviour{

// 在第一次幀用之前調用Start函數 

void Start() 

// 只有將垂直同步計數設置爲0,才能鎖幀,否則鎖幀的代碼無效 

// 垂直同步的作用就是顯著減少遊戲畫面撕裂、跳幀,因爲畫面的渲染不是整個畫面一同渲染的,而是逐行或逐列渲染的,能夠讓FPS保持與顯示屏的刷新率相同。 

QualitySettings.vSyncCount = 0; 

//設定應用程序幀數爲10 

Application.targetFrameRate = 10; 

// 每幀調用一次 Update 

void Update() 

float horizontal = Input.GetAxis("Horizontal"); 

float vertical = Input.GetAxis("Vertical"); 

Vector2 position = transform.position; 

position.x = position.x + 0.1f * horizontal; 

position.y = position.y + 0.1f * vertical; 

transform.position = position; 

}


鎖幀反而會導致強力的設備運行效果不滿意,同時垂直同步的開啓會讓射擊類遊戲存在嚴重畫面延遲

解法2:以單位/秒錶示移動速度,而不是單位/幀(默認爲此)表示

public class RubyController : MonoBehaviour{

// 定義一個公有float形對象,speed表示主角移動速度,使其可直接再unity中修改而不用手動調整 

public float speed=0.1f;

// 每幀調用一次

Update void Update() 

float horizontal = Input.GetAxis("Horizontal"); 

float vertical = Input.GetAxis("Vertical"); 

Vector2 position = transform.position; 

position.x = position.x + speed * horizontal * Time.deltaTime; 

position.y = position.y + speed * vertical * Time.deltaTime; 

transform.position = position; 

}



Time.deltaTime--增量時間

增量時間隨着每秒幀數變化而隨之變化

1秒30幀,那增量時間就是 1/30 秒

1秒60幀,那增量時間就是 1/60 秒

1秒166幀,那增量時間就是 1/166 秒

這樣,速度*時間增量就會讓每秒移動量不因幀數的改變而變得忽高忽低,而是幀數高則移速低,幀數低移速高


Update函數是每幀執行一次,那麼經歷過一幀耗費的時間就是 增量時間

1秒內Update執行的次數,就是1秒內執行的總幀數


參考資料:B站up主chutianbo的gitee文檔 

GameDesign/Unity/官方教程項目系列/官方教程05_2D遊戲/RubyAdventure/01-Ruby冒險2D初學者教程.md · chutianshu/xyz-s-free-course-for-full-stack-web-dev - Gitee.com

時間和幀率部分unity官方文檔:時間增量:

Unity - Scripting API: Time.deltaTime (unity3d.com)

 垂直同步:

Unity - Scripting API: QualitySettings.vSyncCount (unity3d.com)

知乎文章《FPS影響小刀攻擊力?《生化危機2:重製版》那些好玩的事》

FPS影響小刀攻擊力?《生化危機2:重製版》那些好玩的事 - 知乎 (zhihu.com)

百度百科:垂直同步

垂直同步_百度百科 (baidu.com)

CSDN:Unity增量時間Time.deltaTime詳解

(101條消息) Unity增量時間Time.deltaTime詳解_Chinarcsdn的博客-CSDN博客_deltatime

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com