Unity3D 04-GameObject,Component,Time,Input,Physics

Unity3D是一個Component-Based的遊戲引擎,並且爲GamePlay Programmer提供了很多遊戲性層上的支持。
1.可以在圖形界面上設計動畫狀態轉換的Animator。
2.可以直接在場景編輯器中方便進行調整的Collider。
3.可以動態調整動畫曲線的Animation。
總的來說,Unity是一個架構比Cocos2d-x精巧許多的遊戲引擎。

但是很遺憾的是,Unity本身並不開源,還好,Unity在不開源的情況下卻做了比較詳盡的文檔支持。同時,Unity的社區也是很友好的,stackoverflow也有許多值得一看的問題。

順便推薦幾個學習Unity的網站:

Unity聖典
Unity的官方文檔
Unity的知乎話題

對於Unity內部的類有點兒亂,所以通過下面這份設計類圖來更好地理解:
這裏寫圖片描述

GameObject和Component

由於Unity是一個Component-Based的遊戲引擎,所以遊戲中所有的物體都是一個GameObject,爲了給這個GameObject附加上各種各樣的屬性,所以我們引入了Component這個概念。

GameObject是由Component組合成的,Component的生命週期和GameObject息息相關。一旦GameObject的Destroy方法,它的子對象和對應的所有Component都會被銷燬,同時,我們也可以一次只銷毀一個單獨的Component。

Component有如下這些種類,製作了一張表格來記錄它們的用途:
這裏寫圖片描述

組件附屬於遊戲物體.把一個 Renderer (渲染器)組件附到遊戲對象,可以使遊戲對象顯示到場景,附一個 Camera (攝像機)可以把物體變成一個攝像機物體.所有腳本都是組件,因此都能附到遊戲對象上.

常用的組件可以通過簡單的成員變量取得:
附在遊戲對象上的組件或腳本可以通過GetComponent獲取.如下代碼示例:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Awake() {
        transform.Translate(0, 1, 0);
        GetComponent<Transform>().Translate(0, 1, 0);
    }
}

Input和InputManager

關於Input的深入解讀請參考這篇文章:Input 輸入

Unity支持,鍵盤,操縱桿和遊戲手柄輸入。

在輸入管理器(Input Manager)可以創建虛擬軸和按鈕,並終端用戶可以在屏幕配置對話框配置鍵盤輸入。

如果想添加新的虛擬軸,選擇菜單Edit->Project Settings->Input menu。這裏可以改變每個軸的設置。即可進入Input Manager的配置界面。

這裏寫圖片描述

從腳本,所有虛擬軸通過它們的名字(name)來訪問。

當創建時,每個項目都具有下面的默認輸入軸:

A. Horizontal and Vertical are mapped to w, a, s, d and the arrow keys.
水平和垂直被映射到w, a, s, d鍵和方向鍵
B. Fire1, Fire2, Fire3 are mapped to Control, Option (Alt), and Command, respectively.
Fire1, Fire2, Fire3被分別映射到Ctrl,Option(Alt)和Command鍵
C. Mouse X and Mouse Y are mapped to the delta of mouse movement.
Mouse X 和 Mouse Y被映射到鼠標移動增量
D. Window Shake X and Window Shake Y is mapped to the movement of the window.
Window Shake X 和 Window Shake Y 被映射到窗口的移動

Time

Time類是Unity中的一個全局變量,它記載了和遊戲相關的時間,幀數等數據。

Time 類包含一個非常重要的變量叫deltaTime.這個變量包含從上次調用Update 或FixedUpdate到現在的時間(根據你是放在Update函數還是FixedUpdate函數中).(另注: Update每幀調用一次)

依照上面的例子,使得物體在一個勻速的速度下旋轉,不依賴幀的速率,如下:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Update() {
        transform.Rotate(0, 5 * Time.deltaTime, 0);
    }
}

當然了,在使用Time這個類的時候,我們也要記住使用各種各樣的Lerp函數來減少自己的工作量,在Unity3D中,Vector3,Vector2,Color等類都提供了相應的Lerp函數給我們調用。

Physics和Transform

Physics類是Unity重的一個工具函數類,它主要提供了Linecast和Raycast兩種射線投射方式。

  • 其中Linecast是以投射的起始位置和終止位置爲參數,來判斷這個投射有沒有和某個Collider發生了碰撞。
  • 而Raycast則是以投射的起始位置和投射方向爲參數,來判斷這個投射有沒有和某個Collider發生了碰撞。

相應的實例可以看下面的這一段程序:

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    void Update() {
    // 使用Raycast
        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        if (Physics.Raycast(transform.position, fwd, 10))
            print("There is something in front of the object!");
        // 使用Linecast
    Transform target;
    if (!Physics.Linecast(transform.position, target.position))
        ProcessData.AndDoSomeCalculations();
    }
}

在Physics這個模塊中,有三個Component是至關重要的,分別是RigidBody,Collision,Joint。在新的版本中,又引入了RigidBody2D,Collision2D,Joint2D這些Component來處理2D中的Physics事件。

這三個類都是處理物理相關的事件的,那麼它們有什麼區別呢?

1) RgidBody是作爲一個受力物體而存在的,所以可以向一個RigidBody施加Force(力),Drag(阻力)。同時RigidBody還有 velocity (速度),mass(質量),position(位置),旋轉(rotation)等等。
2) Collider是爲了處理物理中的碰撞事件而出現的類,就像上面表格中所說的,如果沒有Collider,兩個RigidBody之間是無法發生碰撞的。對同一個GameObject可以綁定多個Collider構建更加複雜的碰撞體結構。Collider另外一個很值得注意的就是我們可以爲Collider設置material,即Collider的物理材質。 物理材質用於調整摩擦力和碰撞單位之間的反彈效果。

當發生碰撞時,會觸發毀掉函數OnCollisionEnter,OnCollisionStay,OnCollisionExit等等。這幾個函數與OnTriggerXXX的區別會在接下來的博客中提到。

3) Joint用於連接兩個RigidBody,當Joint斷掉的時候會觸發OnJointBreak的回調函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章