【Unity3D基礎教程】給初學者看的Unity教程(二):所有指令碼元件的基類 -- MonoBehaviour的前世今生
引子
上一次我們講了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全域性變數。GameObject是遊戲中的基本物件。GameObject是由Component組合而成的,GameObject本身必須有Transform的Component,這也加深了我們對GameObject的理解,即GameObject是遊戲場景中真實存在,而且有位置的一個物件。
但是我們怎麼操縱這個GameObject呢?這就需要引入指令碼元件了,也就是今天講的MonoBehaviour
MonoBehaviour的生命週期
MonoBehaviour是Unity中所有指令碼的基類,如果你使用JS的話,指令碼會自動繼承MonoBehaviour。如果使用C#的話,你需要顯式繼承MonoBehaviour。
在我們使用MonoBehaviour的時候,尤其需要注意的是它有哪些可重寫函式,這些可重寫函式會在遊戲中發生某些事件的時候被呼叫。我們在Unity中最常用到的幾個可重寫函式是這幾個:
- Awake:當一個指令碼例項被載入時Awake被呼叫。我們大多在這個類中完成成員變數的初始化
- Start:僅在Update函式第一次被呼叫前呼叫。因為它是在Awake之後被呼叫的,我們可以把一些需要依賴Awake的變數放在Start裡面初始化。 同時我們還大多在這個類中執行StartCoroutine進行一些協程的觸發。要注意在用C#寫指令碼時,必須使用StartCoroutine開始一個協程,但是如果使用的是JavaScript,則不需要這麼做。
- Update:當MonoBehaviour啟用時,其Update在每一幀被呼叫。
- FixedUpdate:當MonoBehaviour啟用時,其 FixedUpdate 在每一固定幀被呼叫。
- OnEnable:當物件變為可用或啟用狀態時此函式被呼叫。
- OnDisable:當物件變為不可用或非啟用狀態時此函式被呼叫。
- OnDestroy:當MonoBehaviour將被銷燬時,這個函式被呼叫。
下面用一張圖來更形象地說明一下這幾個類的在MonoBehaviour的生命週期中是如何被呼叫的:
在上面這個圖裡,比較難以理解的就是Coroutine究竟是怎麼回事?彆著急,之後我們會單獨寫一篇部落格來講這件事。
MonoBehaviour的那些坑
- 私有(private)和保護(protected)變數只能在專家模式中顯示.屬性不被序列化或顯示在檢視面板.
- 不要使用名稱空間(namespace)
- 記得使用 快取元件查詢, 即在MonoBehaviour的長遠方法中經常被訪問的元件最好在把它當作一個私有成員變數儲存起來。
- 在遊戲裡經常出現需要檢測敵人和我方距離的問題,這時如果要尋找所有的敵人,顯然要消耗的運算量太大了,所以最好的辦法是將攻擊範圍使用Collider表示,然後將Collider的isTrigger設定為True。最後使用OnTriggerEnter來做攻擊範圍內的距離檢測,這樣會極大提升程式效能。
總結
在MonoBehaviour中最難理解的是Coroutine是如何實現的,但是如果在一篇部落格裡面寫Coroutine的話,未免顯得太長,我會在下一篇部落格中寫有關Coroutine的內容。
相關推薦
【Unity3D基礎教程】給初學者看的Unity教程(二):所有指令碼元件的基類 -- MonoBehaviour的前世今生
引子 上一次我們講了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全域性變數。GameObject是遊戲中的基本物件。GameObject是由Component組合而成的,GameObject本身必須有
【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教程(五):詳解Unity3D中的協程(Coroutine)
為什麼需要協程 在遊戲中有許多過程(Process)需要花費多個邏輯幀去計算。 你會遇到“密集”的流程,比如說尋路,尋路計算量非常大,所以我們通常會把它分割到不同的邏輯幀去進行計算,以免影響遊戲的幀率。 你會遇到“稀疏”的流程,比如說遊戲中的觸發器,這種觸發器大多數時候什麼也不做,但
【Unity3D基礎教程】給初學者看的Unity教程(三):通過製作Flappy Bird瞭解Native 2D中的Sprite,Animation
引子 上一次我們講了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教程(一):GameObject,Compoent,Time,Input,Physics
Unity3D重要模組的類圖 最近剛剛完成了一個我個人比較滿意的小專案:【深入Cocos2d-x】使用MVC架構搭建遊戲Four,在這個遊戲中,我使用了自己搭建的MVC架構來製作一個遊戲,做到了比較好的SoC(關注點分離)。但是苦於Cocos2d-x沒有一個比較完善的編輯器,所以我開始學習另一個非常流行
【SSH之旅】一步步學習Hibernate框架(一):關於持久化
stc localhost 對象 schema hbm.xml java let pass [] 在不引用不論什麽框架下,我們會通過平庸的代碼不停的對數據庫進行操作,產生了非常多冗余的可是又有規律的底層代碼,這樣頻繁的操作數據庫和大量的底層代碼的反復
【學亮開講】Oracle儲存過程教學筆記(二)20181116
--帶出參的儲存過程的建立和呼叫 create or replace procedure pro_owners_add1 ( v_name varchar2,--名稱 v_addressid number,--地址編號 v_housenumber varchar2,--門牌號 v_wat
【深度分析Zigbee】Zstack協議棧初窺(六):協調器的組網過程詳解
這一講我要詳細說一下協調器的組網過程。在Zstack中,網路組網是從ZDApp_Init函式開始的。具體的執行流程為:Main()->osal_init_system()->osalInitTasks()->ZDApp_In it()。進入到ZDApp_I
storm教程(二):Storm Topology元件和Storm資料來源和輸出選擇
Storm Topology元件 前面的章節已經提到過,Storm叢集中的任務稱之為Topology。 對比Hadoop中的MapReduce job,mapper用於從資料來源中獲取資料,經過簡單處理,以一定的格式傳遞給reducer,reducer負責後
【翻譯】CodeMix使用教程(二):重構
在CodeMix中重構 通過重構程式碼而不修改執行時行為,使用原始碼重構來提高專案的質量和可維護性。 CodeMix中的重構由語言服務提供。 CodeMix通過TypeScript語言服務內建了對TypeScript和JavaScript重構的支援。 通過提供語言服務的Code OSS擴充套件提供對
【鏈塊技術53期】超級賬本Fabric教程(二): Docker的部署和安裝(下)
原文連結:超級賬本Fabric教程 Docker的部署和安裝(下) 本節分享超級賬本執行環境docker容器的搭建。 四、Docker compose 4.1 能夠在主機上創建出相互隔離的網路,通過命令列管理多個容器。 在mac和windows中都集成了compos
【鏈塊技術52期】超級賬本Fabric教程(二):Docker的部署和安裝(上)
原文連結:超級賬本Fabric教程(二):Docker的部署和安裝(上) 本節分享超級賬本執行環境docker容器的搭建。 一、目錄 HyperLedger超級賬本執行環境-Docker容器介紹 二、推薦linux系統
【OpenCV入門教程之十一】 形態學影象處理(二):開運算、閉運算、形態學梯度、頂帽、黑帽合輯
上篇文章中,我們重點了解了腐蝕和膨脹這兩種最基本的形態學操作,而運用這兩個基本操作,我們可以實現更高階的形態學變換。所以,本文的主角是OpenCV中的morphologyEx函式,它利用基本的膨脹和腐蝕技術,來執行更加高階的形態學變換,如開閉運算、形態學梯度、“頂帽”、“黑帽
【YOLO】(二):Yolo_mark使用教程
一、獲取原始碼 首先,從github上拉取程式碼。 git clone [email protected]:AlexeyAB/Yolo_mark.git 二、編譯可執行檔案 然後用visual studio開啟yolo_mark.sln,配置正確的openc
【暑期基礎2】D HDU Palindromes _easy version(水:迴文字串)
迴文字串的水題 #include <stdio.h> #include <ctype.h> #include <string.h> int main() {
【深入Java基礎】HashMap的高階用法(二):同步
HashMap的高階用法:同步 HashMap是不支援同步的,不能用於多執行緒中。而HashTable是同步的,這個日後再論。我們可以使用以下兩種方法來實現HashMap的同步: 使用ConcurrentHashMap 使用Collections.sync
【H.264/AVC視訊編解碼技術詳解】七、 熵編碼演算法(1):基礎知識
《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼