Unity 一些方法、函式使用方式及解釋

小弟最近在學習Unity的相關知識及技術

遊戲當中的運算很多都跟數學有關

而偏偏小弟智商跟數學能力都比一般人低

特此在這裡記錄一些我所學到的方法

供未來忘記時回來看看,也希望能幫助一些欲學習Unity的人

如果資料有錯希望能有高手指點

本文章不定期更新

最後更新時間:2016/09/22

 

取得gameObject的Component

gameObject.getComponent<>()

如欲取得某GameObject的component

可以使用gameObject.getComponent<componentName>()

例如想取得Rigidbody的話則是

gameObject.getComponent<Rigidbody>()

 

不考慮物體效果的移動

在遊戲中如果不考慮物體碰撞的話,移動可以用transform這component中的Translate方法

而這方法建議寫在Update的方法中

Unity官方有解釋函釋的流程圖

 

考慮物體效果的移動

在遊戲中如果要考慮到物理效果的移動,則需要使用Rigidbody來實作

而unity官方有說到,凡是會影響到物理效果的不建議寫在Update中

而是寫在FixedUpdate裡

而小弟目前知道以下幾種方式:

  1. rigidbody.MovePosition()
  2. rigidbody.AddForce()
  3. rigidbody.velocity()

MovePosition

MovePosition是直接移動到”目的地”

此移動方式使用上須小心,

因為有可能造成像是穿越物體的行為。

舉例來說,有一物件每次往前都是移動2格

假設此物件前方1格的位置有一道牆壁,正常來說我們期望此物件往前移動時會撞到牆,因此移動失敗

但因為使用了MovePosition的移動方式,因此此物件會直接順移到前方兩格的位置,

導致穿越牆壁的狀況發生

AddForce

AddForce像是給予物體一個外力,類似於”推”這個動作

而因為是推,所以AddForce會受到Rigidbody中的質量(mass)影響

質量越重,推完後造成的速度越小,如同現實狀況一樣

AddForce因為是用推的,所以每推一次,物體的速度會比上一次推完的速度還要快

就如同現實世界中,我們第一次推一顆球,球在滾的過程中假設用同樣的力道推第二次,

則球的速度會比第一次推完的速度還快。

且因為AddForce會受質量的影響,因此同樣的力道應用在10的質量跟100的質量

10質量的速度會比100質量的還快。

velocity

velocity相較於AddForce有些許不同,他是給予物體”瞬間”的速度,因此不考慮物體的質量

可以想像成我們將一顆1公斤的球向前滾的速度設為10公里

並將一顆1公噸的球向前滾的速度設為10公里

那麼兩顆球向前滾的速度都是一樣的,不會因為質量不同而速度不同

 

transform.InverseTransformDirection(a : Vector3)

將a從物件的local space座標轉換成world space座標

 

Vector3.Distance(a : Vector3, b : Vector3)

返回a跟b的距離

 

Ray (origin: Vector3 , direction: Vector3)、RaycastHit

關於ray的說明其實可以看官方的影片教學,講的還滿詳細的

簡單來說Ray是一種射線,他會根據origin的位置往direction的方向投射出一條射線,

通常會搭配RaycastHit一起使用,例如:

此程式碼意思代表從transform.position的方向中向Vector3.down的方向射出一條射線

而射線的長度則是根據Physics.Raycast的第三個參數決定,

如果想要無限長的話可以設Mathf.Infinity

而投射到的物件會被Physics.Raycast的第二個參數,也就是hit紀錄下來

 

 

Physics相關

Physics.OverlapCapsule(position: Vector3, radius: Vector3)

Physics.OverlapCapsule(position: Vector3, radius: Vector3, layerMask: int)

找出給定radius的球狀範圍內所接觸到的目標,或者是所接觸到的指定layerMask物件

 

Physics.OverlapCapsule(point0: Vector3, point1: Vector3, radius: Vector3)

Physics.OverlapCapsule(point0: Vector3, point1: Vector3, radius: Vector3, layerMask: int)

找出給定radius以及point0、point1的膠囊狀範圍內所接觸到的目標,或者是所接觸到的指定layerMask物件

 

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *