Unity筆記——官方教程Roll a ball核心知識點

Roll a ball 的一些關鍵知識點

1.FixedUpdate、Update、LateUpdate的區別

Update()函數在每一幀都被調用,是所有游戲行為中被應用最頻繁的函數,

當一個GameObject具有Rigidbody Component時,在對其Rigidbody進行處理時(比如施加一個三維力向量),在每一個固定幀都需要應用到此物理力,此時應采用FixedUpdate()函數,而非Update()。

LateUpdate在每個Update函數調用之后被調用,次函數常用于腳本執行中。比如,時刻跟蹤某一物體的Camera GameObject,它都是在被跟蹤物體在Update()函數中移動之后,才隨后跟蹤此物體的,應該應用LateUpdate()函數。

2.Time.deltaTime

可用于獲取上次調用以上三個函數進行更新之后的時間。

3.讓游戲鏡頭跟隨某個物體有兩種方式

以跟蹤運動的球體為例:

第一種方式,在Hierarchy中,將Main Camera置于球體GameObject(Player)的子目錄下,即Main Camera是Player的子對象,這樣球體移動,Camera也會相應的移動,但是有一個大問題,Camera不僅隨著Player的位置變化,其角度也會隨著變化,會產生天旋地轉的效果,不可取...

第二種方式,給Camera新建Script,定義一個公共屬性的GameObject對象player(此player非之前的Player),此公共屬性會在manual窗格產生一個接口,用于建立Camera與其他GameObject的聯系。將球體GameObject即Player拖拽至此接口,就可以在Camera的Script中獲取Player的transform屬性了,即能獲取其實時位置了(player.transform.position),其位置是一個Vector3對象。

offset:表示被跟蹤物體與鏡頭間的距離;LateUpdate函數的作用是:隨著被跟蹤物體位置的改變,持續更新鏡頭位置

4.給物體施加物理力(利用鍵盤鼠標控制球體移動)

思想:給物體添加Rigidbody組件和script組件,通過Rigidbody.AddForce(Vector3 force)函數實現

實現過程

a. 首先要建立script中變量與球體Rigidbody的關聯,定義私有Rigidbody變量rb,在start()初始化函數中為其賦值 rb = GetComponent<RigidBody>()

b.建立新的3維向量,獲取鍵盤輸入(WASD鍵或方向鍵)

c. 應用以上三維向量給rb賦值物理力

d. 建立公共變量speed,控制移動速度,可在視圖窗口更改,無需在script中更改,方便!

e. 以上是在對球體的Rigidbody進行操作,故在FixedUpdate()函數中實現


5.旋轉一個物體

利用一個新的三維向量實現

5.兩個剛體間碰撞,其中一個剛體消失,另一個碰撞數加1,并在UI Text中體現

球體碰到方塊,方塊消失不見,在球體的script中利用OnTriggerEnter(Collider other)函數實現。方塊的Collider屬性中的is Trigger要確保被勾上,還要給方塊添加標簽Tag。

在球體的script定義公共屬性public Text countText,與UI界面的Text建立關聯

6.GameObject之間的碰撞問題

選中多個GameObject,在共有屬性中把Mesh Renderer前面的打鉤去除,可以看到選中GameObject的碰撞體積(collier volume)綠色輪廓。在Unity的物理引擎機制中,是不允許兩個以上的碰撞體積產生重疊的,當物理引擎檢測到多個碰撞體的輪廓即將發生重疊時,物理引擎會分析這些碰撞體的形狀、速度、旋轉角度,從而來計算碰撞(collision),計算碰撞的一個主要因子是碰撞體是否是靜態或者動態的。計算碰撞時,靜態幾何體不受碰撞影響,動態幾何體則會受影響,比如動態的球體碰到靜態的墻壁后被彈回。

但是,當我們把碰撞體設置成觸發狀態(trigger)后,兩個碰撞體積是可以產生重疊的。把某一個碰撞體設置成觸發體可以完成很多有用的操作,比如每當玩家走到某一個角落時,他經過一個觸發體,都會有一只蜘蛛從天花板落下來。。。此時我們把碰撞體積轉換成觸發體積(trigger volumes),在相應GameObject的collider Component中把 Is Trigger勾選上即可。

Unity會對所有靜態幾何體的體積進行計算,并把這些數據存在緩存里,在之后的每一幀,由于靜態幾何體不產生運動,所以可以不必重復計算。但是每當我們對靜態物體進行移動、旋轉、縮放時,Unity都會重新對所有靜態幾何體進行計算并對緩存數據進行更新,緩存的重新計算需要耗費資源。我們對動態幾何體進行操作時,Unity則不會重新緩存所有碰撞體的數據。所以我們需要讓Unity區分哪些是動態幾何體,哪些是靜態幾何體。

7.動態幾何體與靜態幾何體

一個GameObject如果擁有一個collider及一個Rigidbody,則被認為是動態的;如果附有Collider但是沒有Rigidbody則被認為是靜態的。

為了節省計算資源,我們必須把保持轉動的cube設置成動態幾何體,我們為其增加Rigidbody Component,增加之后,由于cube受到重力影響,且cube此時為觸發體積而非碰撞體積,所以cube不會與地面產生碰撞作用,會產生墜落效果。

為了解決墜落問題,將cube設置成Kinematic Rigidbody,kinematic剛體不會受到物理力的影響,它在其transform屬性的作用下可以產生移動、運動效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容