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

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

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的網站:

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

Components

GameObject和Component

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

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

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

QQ截圖20140528004158

元件附屬於遊戲物體.把一個 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的配置介面。

Android-Input-2

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

當建立時,每個專案都具有下面的預設輸入軸

  • Horizontal and Vertical are mapped to w, a, s, d and the arrow keys.
    水平和垂直被對映到w, a, s, d鍵和方向鍵
  • Fire1, Fire2, Fire3 are mapped to Control, Option (Alt), and Command, respectively.
    Fire1, Fire2, Fire3被分別對映到Ctrl,Option(Alt)和Command鍵
  • Mouse X and Mouse Y are mapped to the delta of mouse movement.
    Mouse X 和 Mouse Y被對映到滑鼠移動增量
  • 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事件。

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

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的回撥函式。

總結

本來想把類圖重的各種類的用法都說一說,但限於篇幅有限,今天就只寫了這幾個類,那麼請期待我的下一篇部落格 - MonoBehaviour的前世今生

相關推薦

Unity3D基礎教程初學者Unity教程如何學習Unity3D

cos 詳解 component lock index unity3d遊戲 design 技術棧 log 【Unity3D基礎教程】給初學者看的Unity教程(零):如何學習Unity3D http://www.cnblogs.com/neverdie/p/How_To_

Unity3D基礎教程初學者Unity教程理解Unity的新GUI系統UGUI

理解UGUI的基礎架構 UGUI是Unity在4.6中引入的新的GUI系統,與傳統的中介軟體NGUI相比,這套新GUI系統有幾個核心亮點: 放棄了Atlas的概念,使用Packing Tag的方式來進行圖集的規劃 放棄了depth來確定UI顯示層級的概念,使用Hierarchy的SiblingIndex

Unity3D基礎教程初學者Unity教程所有指令碼元件的基類 -- MonoBehaviour的前世今生

引子 上一次我們講了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全域性變數。GameObject是遊戲中的基本物件。GameObject是由Component組合而成的,GameObject本身必須有

Unity3D基礎教程初學者Unity教程詳解Unity3D中的協程Coroutine

為什麼需要協程 在遊戲中有許多過程(Process)需要花費多個邏輯幀去計算。 你會遇到“密集”的流程,比如說尋路,尋路計算量非常大,所以我們通常會把它分割到不同的邏輯幀去進行計算,以免影響遊戲的幀率。 你會遇到“稀疏”的流程,比如說遊戲中的觸發器,這種觸發器大多數時候什麼也不做,但

Unity3D基礎教程初學者Unity教程通過製作Flappy Bird瞭解Native 2D中的SpriteAnimation

引子 上一次我們講了MonoBehaviour的前世今生,瞭解了遊戲中的每一個GameObjec都是由指令碼控制的,這一次我們開始將Unity中Native 2D中的Sprite,並且使用Animation來讓Sprite動起來。 在接下來的幾篇部落格裡,我會通過做一個Flappy Bird來講解

Unity3D基礎教程初學者Unity教程通過製作Flappy Bird瞭解Native 2D中的RigidBody2D和Collider2D

引子 認識RigidBody 當RigidBody2D的質量屬性被設定為0時,剛體的質量變為無限大,此時剛體相當於靜態剛體,永遠一動不動。但是在Unity中你是無法把一個RigidBody2D的質量設定為0的,所以,當你想建立一個靜態剛體時,只需要建立碰撞器,而不需要建立RigidBo

Unity3D基礎教程初學者Unity教程Unity中構建健壯的單例模式Singleton

該部落格中的程式碼均出自我的開源專案 : 迷你微信 為什麼需要單例模式 遊戲中需要單例有以下幾個原因: 我們需要在遊戲開始前和結束前做一些操作,比如網路的連結和斷開,資源的載入和解除安裝,我們一般會把這部分邏輯放在單例裡。 單例可以控制初始化和銷燬順序,而靜態變數和場景中的GameObject都無法控制

Unity3D基礎教程初學者Unity教程GameObjectCompoentTimeInputPhysics

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

golang-GUI開發qt之signal和slot

類型 取消 htm return 所在 turn hang nbsp type 想了很久,我決定還是先從signal和slot(信號槽)開始講起。 signal和slot大家一定不陌生,先看一段示例(選自文檔): 1 class Counter : public QOb

PHP7原始碼分析如何理解PHP虛擬機器

順風車運營研發團隊 李樂 1.從物理機說起 虛擬機器也是計算機,設計思想和物理機有很多相似之處; 1.1馮諾依曼體系結構 馮·諾依曼是當之無愧的數字計算機之父,當前計算機都採用的是馮諾依曼體系結構;設計思想主要包含以下幾個方面: 指令和資料不加區別混合儲存在同一個儲

Qt通過QtCreator原始碼學習Qtpro檔案

1、學習目的 學習pro檔案的語法規則,這在跨平臺專案中會經常用到。和條件編譯相似,在pro中可以根據平臺選擇不同的編譯模組、檔案,還可以向原始碼中傳遞變數等。 2、學習方法 通過學習QtCreator原始碼中的pro檔案,來掌握pro檔案語法規則,下面以qtcreator.

深度分析ZigbeeZstack協議棧初窺協調器的組網過程詳解

這一講我要詳細說一下協調器的組網過程。在Zstack中,網路組網是從ZDApp_Init函式開始的。具體的執行流程為:Main()->osal_init_system()->osalInitTasks()->ZDApp_In it()。進入到ZDApp_I

caffe在windows平臺中安裝caffe基礎安裝及簡單測試

基礎配置 本文中的配置:win10 + vs2015 + python2.5 + cmake3.12 + git2.15 + CUDA8.0 + cuDNN-8.0-5 在進行windows下的caffe安裝前,一定要把以上的這些軟體安裝好,並加入系統路徑中。

翻譯CodeMix使用教程智慧感知

CodeMix中的智慧感知 IntelliSense(智慧感知)是各種程式碼編輯功能的通用術語,包括:程式碼完成(a.k.a. content-assist),引數資訊,快速資訊和成員列表。 CodeMix外掛與基於Eclipse的IDE和工具(如MyEclipse,Spring To

鏈塊技術51期超級賬本Fabric教程超級賬本入門

原文連結:超級賬本Fabric教程(一):超級賬本入門   本節分享有關拆超級賬本的概念以及體驗部署過程。 一、簡介 是一個帶有可插入各種功能模組架構的區塊鏈實施方案,目標是打造成一個由全社會共同維護的開源超級賬本。由Linux 基金會的開源專案,全稱是Hyperledge

深入Java基礎HashMap高階用法排序

HashMap高階用法(一):排序 根據key排序 HashMap是無序的,我們可以根據key進行升序或降序。 1.利用List和Collections來實現排序 先獲取HashMap的keySet,然後將keySet放入List,在由Collectio

暑期基礎2D HDU Palindromes _easy version迴文字串

迴文字串的水題 #include <stdio.h> #include <ctype.h> #include <string.h> int main() {

Visual C++遊戲開發五十六 淺墨DirectX教程二十三 打造遊戲GUI介面

眾所周知,GUI是遊戲中不可缺少的元素,這篇文章中,我們首先了解了遊戲GUI介面的知識與相關概念,然後一起設計了一個封裝好GUI圖形介面的C++類。這個類有著非常強的擴充套件性,使用也是極其方便,很適合二次開發。 先看一張實現的效果圖吧: 其中的背景音樂,遊戲圖

三星官方教程如何為Gear VR 開發應用開發環境搭建(轉)

三星GearVR已經成為第一個成熟的移動VR平臺,並擁有目前全球最大也是最穩定的移動VR使用者群體。基於GearVR的應用越來越多,本文將為開發者介紹如何用Unity為Gear VR開發一個360度圖片檢視器。 搭建開發環境(Windows OS) 在開始用Uni

OpenCV入門教程之十 形態學影象處理膨脹與腐蝕

本系列文章由@淺墨_毛星雲 出品,轉載請註明出處。 寫作當前博文時配套使用的OpenCV版本: 2.4.8本篇文章中,我們一起探究了影象處理中,最基本的形態學運算——膨脹與腐蝕。淺墨在文章開頭友情提醒,用人物照片做腐蝕和膨脹的素材圖片得到的效果會比較驚悚,毀三觀的,不建議嘗試