程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【Unity3D基礎教程】給初學者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics

【Unity3D基礎教程】給初學者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics

編輯:C#入門知識

作者:王選易,出處:http://www.cnblogs.com/neverdie/  歡迎轉載,也請保留這段聲明。如果你喜歡這篇文章,請點推薦。謝謝!Unity3D重要模塊的類圖

最近剛剛完成了一個我個人比較滿意的小項目:【深入Cocos2d-x】使用MVC架構搭建游戲Four,在這個游戲中,我使用了自己搭建的MVC架構來制作一個游戲,做到了比較好的SoC(關注點分離)。但是苦於Cocos2d-x沒有一個比較完善的編輯器,所以我開始學習另一個非常流行的游戲引擎-Unity3D。

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

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

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

Unity聖典

Unity的官方文檔

Unity的知乎話題

 

我在學Unity3D的知識的時候,發現Unity內部涉及的重要類比Cocos2d-x要多,有點理不清的感覺,所以制作了下面的設計類圖來為像我一樣的初學者提供一個Unity的初步印象。

 

GameObject和Component

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

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

Component有如下這些種類,我制作了一張表格來記錄它們的用途:

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的配置界面。

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事件。

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

RgidBody是作為一個受力物體而存在的,所以可以向一個RigidBody施加Force(力),Drag(阻力)。同時RigidBody還有 velocity (速度),mass(質量),position(位置),旋轉(rotation)等等。

Collider是為了處理物理中的碰撞事件而出現的類,就像上面表格中所說的,如果沒有Collider,兩個RigidBody之間是無法發生碰撞的。對同一個GameObject可以綁定多個Collider構建更加復雜的碰撞體結構。Collider另外一個很值得注意的就是我們可以為Collider設置material,即Collider的物理材質。 物理材質用於調整摩擦力和碰撞單位之間的反彈效果。

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

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

 

總結

本來想把類圖重的各種類的用法都說一說,但限於篇幅有限,今天就只寫了這幾個類,那麼請期待我的下一篇博客。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved