1. 程式人生 > >Unity3D物理引擎中剛體元件的運用

Unity3D物理引擎中剛體元件的運用

 物理引擎對於當前大多數遊戲都是必不可少的一部分。在虛擬現實逐漸興起的今天,玩家對遊戲的真實感,以及操作感要求越來越高。Unity3D內建PhysX物理模擬引擎,具有高效低耗,模擬度膏的特點。

1、什麼是剛體?
剛體使物體能在物理控制下運動。剛體可通過接受力使物體允許效果更加真實。總而言之,Unity3D中任何物體想要受到重力、外力的影響都必須包含一個剛體元件。

2、怎樣給物體新增剛體?
選中物體,然後在點選選單 Components>Physics>Rigidbody,來給物體增加一個剛體。

3、剛體元件中有什麼屬性?(介紹常用屬性)
1)質量(Mass) 發生碰撞時,質量大的物體能夠推開質量小的物體。
2)阻力(Drag)預設為0,沒什麼好解釋的吧……
3)旋轉阻力(Augular Drag)預設值為0.05
4)使用重力(Use Gravity)用來設定是否在剛體上施加重力用來模擬現實世界中的自由落體狀態等。勾選即選中。
5)是否遵循運動學(Is Kinematic)用來設定剛體是否遵循牛頓物理學定律 勾選表示不會呼叫物理計算,只受指令碼和動畫的影響而運動!!!

4、常用方法
1)AddForce函式:對剛體施加一個指定方向的力,使其發生移動。
函式表示如下:
function AddForce(force: Vector3,mode: ForceMode=ForceMode.Force) : void
函式ForceMode有四種模式:Force、Impulse、Acceleration、VelocityChange
Force表示施加一個恆力, Impulse表示施加一個瞬間衝擊力
Acceleration表示對物體施加加速度 VelocityChange 表示改變物體速度
2)MovePosition函式:將剛體移動到position位置。
函式表示如下:
function MovePosition(position : Vector3) : void
3)MoveRoration函式:將剛體旋轉相對應的角度。

5、簡單案例
1)案例說明:使用上面介紹的三種函式,對場景中的正方體施加恆力、爆炸力、移動和旋轉。重置按鈕使正方體復位。
案例執行效果如下圖1.1所示:
這裡寫圖片描述
圖1.1

2)製作流程:
1.使用在場景中建立4個Cube搭建成圍牆,修改尺寸調整位置,建立一個Cube作為本案例的主角,建立一個Plane物件充當地板,為Cube和Plane分別新增紋理圖片。
2.使用UGUI在場景裡建立5個button按鈕,如上圖1.1所示。介面佈局就完成了,接下來就需要編寫指令碼對主角Cube進行操作。
3、在Assets內點選滑鼠右鍵,Create>C#Script,重新命名為Script2,雙擊開啟指令碼編寫程式碼。

using UnityEngine;
using System.Collections;
public class Script2 : MonoBehaviour {
    protected Transform m_transform;
    public float force;    //施加在物體上的力
    public float speed;    //物體移動速度
    private bool ForceMode_Impulse;    //布林型別變數,用來判斷當前是否對物體施加爆炸力
    private bool ForceMode_Force;      //布林型別變數,用來判斷當前是否對物體施加恆力
    private bool CubeMovePosition;     //判斷物體是否移動
    private bool CubeMoveRotation;     //判斷物體是否旋轉
    private Vector3 eulerAngle = new Vector3(0, 100, 0);    //三維向量,用來設定物體繞那個軸旋轉
    private Vector3 cubePosition;      //儲存物體的位置
    private Quaternion cubeRotation;   // 儲存物體旋轉狀態
    void Awake()
    {
        cubePosition = this.transform.position;   //記錄物體初始位置
        cubeRotation = this.transform.rotation;   //記錄物體初始狀態
    }

       // Use this for initialization
       void Start () {
        m_transform = this.transform;

       }

       // Update is called once per frame
       void Update () {
        if (ForceMode_Impulse)//爆炸力 使物體向右移動
        {
            this.GetComponent<Rigidbody>().AddForce(Vector3.right * force, ForceMode.Impulse);
        }
        if (ForceMode_Force)//恆力 使物體向右移動
        {
            this.GetComponent<Rigidbody>().AddForce(Vector3.right * force, ForceMode.Force);
        }
        if (CubeMovePosition)//移動方塊
        {
            this.GetComponent<Rigidbody>().MovePosition(m_transform.position + Vector3.right * Time.deltaTime);
        }
        if (CubeMoveRotation)//旋轉方塊
        {
            Quaternion deltaRotation = Quaternion.Euler(eulerAngle * Time.deltaTime);
            this.GetComponent<Rigidbody>().MoveRotation(m_transform.rotation * deltaRotation);
      }

       }
    public void OnClick1()//施加爆炸力
    {
        ForceMode_Impulse = !ForceMode_Impulse;
    }
    public void OnClick2()//施加橫力
    {
        ForceMode_Force = !ForceMode_Force;
    }
    public void OnClick3()//移動方塊
    {
        CubeMovePosition = !CubeMovePosition;
    }
    public void OnClick4()//旋轉方塊
    {
        CubeMoveRotation = !CubeMoveRotation;
    }
    public void OnClick5()//重置方塊
    {    
        this.GetComponent<Rigidbody>().isKinematic = true;//先不遵循物理學定律,消除物體的移動、旋轉
        this.GetComponent<Rigidbody>().isKinematic = false;//然後遵循物理學定律
        m_transform.position = cubePosition;   //將物體的位置修改為初始狀態
        m_transform.rotation = cubeRotation;   // 將物體的旋轉狀態修改為初始狀態
    }
}

OnClick1()————OnClick4()功能類似,是當點選button按鈕後,更改物體的狀態

4、儲存指令碼,在Unity中把Script2指令碼拖拽到遊戲體Cube上。在Inspector面板上就會看到該指令碼的設定面板。如下圖1.2所示。
Force和Speed可以任意修改。
這裡寫圖片描述
圖1.2