2019-05-14

unity 3D使用教程

軟件簡介

Unity3D是由Unity Technologies開發(fā)的一個讓玩家輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實時三維動畫等類型互動內(nèi)容的多平臺的綜合型游戲開發(fā)工具,是一個全面整合的專業(yè)游戲引擎。Unity類似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的圖型化開發(fā)環(huán)境為首要方式的軟件。其編輯器運行在Windows 和Mac OS X下,可發(fā)布游戲至Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8和Android平臺。也可以利用Unity web player插件發(fā)布網(wǎng)頁游戲,支持Mac和Windows的網(wǎng)頁瀏覽。它的網(wǎng)頁播放器也被Mac 所支持。


內(nèi)容簡介

五大界面

1.場景(Sence),構(gòu)建游戲的地方;

2.層級(Hierarchy),場景中的游戲?qū)ο蠖剂性谶@里;

3.檢測面板(Inspector),當(dāng)前選中的資源或?qū)ο蟮脑O(shè)置,是一些變量和組件的集合;

4.游戲(Game),演示窗口,僅在播放模式中演示;

5.項目 (Project),一些資源的列表,和庫的概念一樣。

主菜單欄

文件、編輯、資源、游戲?qū)ο?、組件、地形、窗口、幫助

系統(tǒng)核心——腳本

JavaScript

對于U3D來說,JavaScript是入門級的腳本語言,U3D內(nèi)置的函數(shù)都能通過JS方便的調(diào)用。語法上,JS和傳統(tǒng)的c語言差不多,需要分號結(jié)束符,變量類型定義,大括號……不過它的變量類型定義,是通過冒號接在變量右邊,如:Name:string=”Li”。相對其他兩種語言,使用JS語法,很多函數(shù)不需要實例化就能直接使用,如:vector3 direction=vector3(1,2,3)。同時注意,JavaScript不是Java,U3D中的JavaScript也有別于獨立的JavaScript語言。

C#

微軟開發(fā)的面向?qū)ο缶幊陶Z言。由于有強大的net類庫支持,以及由此衍生出的很多跨平臺語言,C#逐漸成為U3D開發(fā)者推崇的程序語言。U3D內(nèi)置的腳本范例中,C#腳本也占了很大一部分(其他腳本是JavaScript腳本)。另外,在裝有VisualStudio的電腦上,我們也可以使用微軟的腳本編輯工具來編寫U3D腳本。

BOO

BOO是新興的基于Python的語言。語法上,BOO和Python大同小異,都是通過換行來實現(xiàn)語句的結(jié)束,它省略了分號、大括號,甚至條件語句的小括號等。Python在很多大型三維圖形軟件上都有應(yīng)用,它的跨平臺性能很不錯,可以使用Python來編寫maya特效腳本;不過,對于游戲事件的編寫,這種精簡的語法反而有些難以適應(yīng)。如基本的變量類型定義,BOO(類Python)語法就顯得不那么便捷: direction as vector3 =vector3(1,2,3)。游戲事件不同于特效腳本,前者是過程中的交互,而后者只需要看到結(jié)果。因此,游戲中經(jīng)常需要大量的具有明確類型的變量出現(xiàn),BOO語言可以省略變量類型的優(yōu)勢在這里反而容易引發(fā)問題。

腳本的使用規(guī)則

U3D的腳本作用方式很有趣,稱之為“拖放法”。無論是作用在一個具體的場景物體還是管理著批量的物體,腳本首先必須依附于場景中的一個元素才能被執(zhí)行。要將腳本賦予物體的方式很簡單,就是按住鼠標(biāo)左鍵將腳本文件拖放到物體的屬性面板上(也可以拖放到場景的物體上)。U3D有個概念,那就是component(成分)--類似Maya的節(jié)點。包括腳本,所有元素屬性都是游戲物體的component。添加、刪除、停用、讀取、寫入component信息,就是腳本所要做的(盡管腳本也是個component)。


根據(jù)腳本使用的情況,可以有以下做法:

1.腳本位于同一個物體上。

可直接使用泛型或者類型轉(zhuǎn)換語法調(diào)用。

如:someScript = GetComponent<ExampleScript>();

2.腳本位于不同物體上。

需要使用Find或相關(guān)的搜索函數(shù),取得指定名稱的物體信息后,再+”.GetComponent”函數(shù)。如:GameObject.Find("stone").GetComponent<ExampleScript>()。

3.腳本位于同一路徑或者被調(diào)用腳本位于主腳本的路徑及以下(腳本是否被物體使用都可)。

將被調(diào)用腳本中的成員(變量或方法)使用static標(biāo)識,然后可以通過”腳本.成員”的格式直接調(diào)用。例如:

ScriptA.CS

public static mm();

ScriptB.CS

ScriptA.mm();

不過,static成員的調(diào)用雖然提高了效率,但因為它常駐內(nèi)存,所以在會產(chǎn)生大量系統(tǒng)資源要求的情況下要慎用。

*static是C#定義變量或方法類型的關(guān)鍵字,使用static的變量或方法,不需要new實例化即可直接調(diào)用。

【腳本內(nèi)容】

除了JavaScript函數(shù),C#和BOO的腳本都需要預(yù)先載入類庫。這里以C#為例:

using UnityEngine;

using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

}

NewBehaviourScript是腳本的名稱,它必須和腳本文件的外部名稱一致(如果不同,腳本無法在物體上被執(zhí)行)。所有游戲執(zhí)行語句,都包含在這個繼承自MonoBehaviour類的自創(chuàng)腳本中(大括號內(nèi))。

以下介紹一些常用的內(nèi)置運行函數(shù)(定義函數(shù)時,JavaScript的關(guān)鍵字是function,C#是void,BOO是def。如:void Start()。

Awake:在游戲運行時調(diào)用,用于初始化。

Start : 只在游戲開始時執(zhí)行一次,在Awake()函數(shù)后執(zhí)行;

Update:在游戲每一幀都執(zhí)行一次,在Start()函數(shù)后執(zhí)行;

LateUpdate:同Update,只是它會在Update()函數(shù)執(zhí)行后再執(zhí)行;

FixedUpdate:當(dāng)游戲中引入剛體系統(tǒng),使用適配的方式同步物理時鐘,可以讓動力學(xué)更精確的計算;

OnGUI:繪制游戲界面的函數(shù),因為每一幀執(zhí)行多次,所以一些時間相關(guān)的函數(shù)要盡量避免直接在其內(nèi)部使用。

OnMouseOver:鼠標(biāo)停留在物體上時執(zhí)行該函數(shù)的內(nèi)容。

OnMouseEnter:鼠標(biāo)進入物體范圍時執(zhí)行該函數(shù)的內(nèi)容。和OnMouseOver不同,該函數(shù)只執(zhí)行一次。

OnMouseExit:鼠標(biāo)離開物體范圍時執(zhí)行該函數(shù)的內(nèi)容。

OnMouseDown:鼠標(biāo)按下時執(zhí)行該函數(shù)的內(nèi)容。

OnMouseUp:當(dāng)鼠標(biāo)釋放時執(zhí)行該函數(shù)的內(nèi)容。

OnMouseDrag:按住鼠標(biāo)拖動時執(zhí)行該函數(shù)的內(nèi)容。

OnMouse系列函數(shù)是針對指定物體的,如果要使用全局鼠標(biāo)控制操作,則需要使用射線相關(guān)函數(shù)。

U3D內(nèi)置的代碼的命名規(guī)則

開頭第一個字母大寫的詞組都屬于類或者函數(shù),而開頭小寫的詞組則是變量。新手經(jīng)常會混淆它們之間的區(qū)別。簡單說來,函數(shù)詞組可以作為變量的類型,還可以直接執(zhí)行功能,詞組后必接成對小括號;變量是對應(yīng)函數(shù)的分支,實現(xiàn)的是對一個具體屬性的控制。例如:


Camera和camera。當(dāng)場景中存在一個默認的主攝像機,腳本位于攝像機時,Camera.mainCamera.transform和camera.transform是等同的;假如腳本在其他物體上,Camera.mainCamera.transform仍舊直接獲取了主攝像機,而camera.transform必須要使用Find函數(shù)先找到指定名稱的攝像機:GameObject.Find("mainCamera").camera.transform。當(dāng)然,這里是列出細節(jié)來比較,實際運用時,腳本位于特殊元素上我們可以不用聲明這個元素的類別,如camera.transform可以簡化到transform。

GameObject和gameObject。前者包含查找,破壞和產(chǎn)生游戲物體的函數(shù),同時可以將一個變量定義為“游戲物體”類型;后者則包含豐富的游戲物體屬性,例如名稱,變形信息,動畫,渲染等。

同上面列舉的camera,對于直接作用于指定物體的腳本,gameObject也可以省略掉。不過,在開始學(xué)寫代碼時,書寫完整的變量名能讓我們更深刻的記憶每個屬性和變量的關(guān)系。

通過以上對比后可以這么理解,函數(shù)通常是全局控制(包含腳本外的其他物體),而變量是需要指出具體的應(yīng)用對象。

*如果書寫代碼時語句不在函數(shù)作用范圍內(nèi),編譯器將無法智能完成一些變量的全名顯示。

更多函數(shù)的運用方法,用戶可參考官方提供的幫助文檔。

簡單例子

在一個箱子上按下鼠標(biāo)左鍵,箱子就開始旋轉(zhuǎn),同時燈光被點亮,屏幕出現(xiàn)“Test”的字樣。

1.點擊Hierarchy欄下的Create,創(chuàng)建一個Cube,Plane和Spotlight。


2.在Assets目錄下,創(chuàng)建文件夾(右鍵,Create->Folder),用于存放游戲的各種資源:模型,動畫,材質(zhì),腳本,Prefab等。

3.雙擊進入myScript文件夾,創(chuàng)建一個C#腳本


.4.給腳本命名,然后再雙擊開啟腳本編輯工具(如果腳本名稱和內(nèi)部的類名稱不同,一定要更正)。


5.加入鼠標(biāo)相關(guān)函數(shù),這里我需要用到OnMouseOver,OnMouseExit,OnMouseDown。此類特殊函數(shù)不會有智能拼寫出現(xiàn)。


6.語法方面就不傻瓜式的一步步進行了,實現(xiàn)的思路是:

當(dāng)鼠標(biāo)移動到物體上,物體的材質(zhì)色彩變?yōu)辄S色,同時將一個初始值為假的布爾變量1的值取真;當(dāng)鼠標(biāo)離開后,物體材質(zhì)色彩還原,布爾變量1值為假;當(dāng)按下鼠標(biāo)左鍵,且布爾變量1的值為真,布爾變量2的值為真。

*OnMouse函數(shù)都是執(zhí)行一次的函數(shù),因此不能將和動畫有關(guān)的控制函數(shù)放于其內(nèi)執(zhí)行,通常會使用布爾開關(guān)來控制Update函數(shù)中的動畫函數(shù)。


7.接著在Update函數(shù)內(nèi)實現(xiàn):

當(dāng)布爾變量2的值為真,物體旋轉(zhuǎn)。


8.將寫好的腳本拖拽到場景中的方塊上(或者先選擇方塊,將腳本拖到方塊的屬性欄),調(diào)好攝像機位置,執(zhí)行測試;


9.因為腳本只作用于其所依附的物體,要控制燈光,我們有兩個選擇:創(chuàng)建新的腳本,使用查找物體函數(shù)。很顯然,我沒必要為這么簡單的功能加入一個新的腳本。因此我使用Find函數(shù)獲取燈光的強度屬性。

*腳本中遇到這樣一串長長的語句時,通常會使用一個自定義變量來替代,而且很多時候還能降低計算量。例如:

float LightInt =GameObject.Find("Spotlight").light.intensity。如果在Start函數(shù)中初始化,Update中就不必每幀執(zhí)行查找函數(shù),降低游戲效率。不過這里作為一個測試,我也就很省事的忽略了。


10.GUI的使用。要在游戲視圖顯示各種UI信息,都需要使用U3D的UI組件或者GUI函數(shù)。為方便閱讀,我將其他函數(shù)的內(nèi)容收起,并使用GUI函數(shù)的Label創(chuàng)建簡單的文字顯示功能(有關(guān)GUI更多的詳細信息,請參閱官方文檔,我會在后面再做討論)。


11.最終測試:


12.發(fā)布。執(zhí)行File->BuildSettings,開啟發(fā)布界面。設(shè)置好要發(fā)布游戲的平臺以及一些發(fā)布的信息,點擊Build按鈕即可發(fā)布一個完整的游戲客戶端。U3D支持發(fā)布的平臺與用戶授權(quán)和操作系統(tǒng)有關(guān),如IOS游戲需要MAC平臺的U3D才能發(fā)布,Android需要在系統(tǒng)安裝安卓SDK包,次世代主機平臺則需要用戶向官方購買額外解決方案。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • vue環(huán)境搭建 今天心血來潮,打算重新建立新的vue項目;也是從今天開始記錄自己的生活和工作; 第一篇簡書文章,主...
    happy_b277閱讀 184評論 0 0
  • 默認參數(shù) 默認參數(shù)很有用,但使用不當(dāng),也會掉坑里。默認參數(shù)有個最大的坑,演示如下: 先定義一個函數(shù),傳入一個lis...
    沙灘印閱讀 81評論 0 0
  • sqli-labs(11-20) 第十一關(guān) 界面終于換口味啦 登錄系統(tǒng),目測萬能密碼或者md5 1、先試試萬能密碼...
    glotozz閱讀 407評論 0 0
  • 一、代碼風(fēng)格 1、標(biāo)識符三種類型 大駝峰 類、枚舉、typedef和類型參數(shù) 包括用于元數(shù)據(jù)注釋的類 使用小寫加下...
    GeniusWong閱讀 508評論 0 1
  • Android運行環(huán)境+Java運行環(huán)境 jdk下載 android中文社區(qū)官網(wǎng) 很多文章都講究開篇陳意,直達要害...
    fsnzzz閱讀 3,347評論 0 1

友情鏈接更多精彩內(nèi)容