前言:
打完才發現我 "物理"的英文都拼成 physic ,正確的好像是Physics
(球會動是因為我有加自動移動的腳本,模擬怪物自動走路。有一段突然跳很高是這個AI腳本的錯)
之前在使用rigidbody2D的時候,一直看不太出來mass的功用,尤其是明明mass沒有很大,物件想跳的時候,AddForce()的值常常要給到好幾百才跳得起來。
為了想要有更好的控制,所以只好自己寫個偽rigidbody2D,注意這腳本並非完全參考物理公式,到後面有很大一部分只做到有效果而已(我物理爛,可以的話還麻煩各位提供公式修正了)...。
有個問題是Unity 的 OnCollision__方法必須有一方有rigidbody2D才會被呼叫,所以我也得自製個用來觸發碰撞事件的腳本。
題外話:
最近想把一些自製的特定功能腳本放上去,做成一個屬於我的lib ((浪漫
裡面有2個腳本,一個是My2Dphysic.cs 和 My2Dcollider.cs。
My2Dphysic.cs負責模擬重力、不要穿牆等功能,和Unity的Rigidbody2D類似。
如果要和其他物件碰撞、推開物件...,可以掛上My2Dcollider.cs。
看程式碼會發現My2Dcollider.cs其實只負責發出碰撞的event,碰撞造成的推力計算等等還是由My2Dphysic.cs負責。
(要注意的是,如果物件mass太大,它給予所撞擊物件的推力越大,太大可能會直接撞飛,不知道算不算Bug)
使用My2Dphysic 首先要準備2個Layer,分別表示地板和牆壁。
若想要操作物件水平移動,可以這樣打:
* rigid = gameObject.GetComponent<My2Dphysic>();
private void Update(){
rigid.velocity.x = Input.GetAxis("Horizontal") * your_speed;
}
若想要跳躍,可以這樣打:
if (Input.GetKeyDown(KeyCode.Space) && rigid.isGrounded) {
rigid.AddForce(Vector2.up * your_jumpForce);
}
使用方法跟Unity的rigidbody2D很像,只是有其他可操作的參數,例如斜坡滾動的旋轉速度angular_acceleration、彈跳力(force drag越小彈跳越高)...。
基本註解我都有寫在腳本裡,應該不難看懂那些變數的作用。
目前還在修修改改階段,Bug可能還是一堆,尤其是速度造成穿牆...,有甚麼修正我會再放上去。
程式碼有什麼問題也麻煩各位指教了