unity 3D使用教程
軟件簡介
Unity3D是由Unity Technologies開發(fā)的一個讓玩家輕松創(chuàng)建諸如三維視頻游戲尉共、建筑可視化、實時三維動畫等類型互動內容的多平臺的綜合型游戲開發(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ā)布網頁游戲,支持Mac和Windows的網頁瀏覽统求。它的網頁播放器也被Mac 所支持检碗。
內容簡介
五大界面
1.場景(Sence),構建游戲的地方码邻;
2.層級(Hierarchy),場景中的游戲對象都列在這里折剃;
3.檢測面板(Inspector),當前選中的資源或對象的設置,是一些變量和組件的集合像屋;
4.游戲(Game),演示窗口怕犁,僅在播放模式中演示;
5.項目 (Project),一些資源的列表己莺,和庫的概念一樣奏甫。
主菜單欄
文件、編輯凌受、資源阵子、游戲對象、組件胜蛉、地形挠进、窗口、幫助
系統(tǒng)核心——腳本
JavaScript
對于U3D來說誊册,JavaScript是入門級的腳本語言奈梳,U3D內置的函數(shù)都能通過JS方便的調用。語法上解虱,JS和傳統(tǒng)的c語言差不多,需要分號結束符漆撞,變量類型定義殴泰,大括號……不過它的變量類型定義于宙,是通過冒號接在變量右邊,如:Name:string=”Li”悍汛。相對其他兩種語言捞魁,使用JS語法,很多函數(shù)不需要實例化就能直接使用离咐,如:vector3 direction=vector3(1,2,3)谱俭。同時注意,JavaScript不是Java宵蛀,U3D中的JavaScript也有別于獨立的JavaScript語言昆著。
C#
微軟開發(fā)的面向對象編程語言。由于有強大的net類庫支持术陶,以及由此衍生出的很多跨平臺語言凑懂,C#逐漸成為U3D開發(fā)者推崇的程序語言。U3D內置的腳本范例中梧宫,C#腳本也占了很大一部分(其他腳本是JavaScript腳本)接谨。另外,在裝有VisualStudio的電腦上塘匣,我們也可以使用微軟的腳本編輯工具來編寫U3D腳本脓豪。
BOO
BOO是新興的基于Python的語言。語法上忌卤,BOO和Python大同小異扫夜,都是通過換行來實現(xiàn)語句的結束,它省略了分號埠巨、大括號历谍,甚至條件語句的小括號等。Python在很多大型三維圖形軟件上都有應用辣垒,它的跨平臺性能很不錯望侈,可以使用Python來編寫maya特效腳本;不過勋桶,對于游戲事件的編寫脱衙,這種精簡的語法反而有些難以適應。如基本的變量類型定義例驹,BOO(類Python)語法就顯得不那么便捷: direction as vector3 =vector3(1,2,3)捐韩。游戲事件不同于特效腳本,前者是過程中的交互鹃锈,而后者只需要看到結果荤胁。因此,游戲中經常需要大量的具有明確類型的變量出現(xiàn)屎债,BOO語言可以省略變量類型的優(yōu)勢在這里反而容易引發(fā)問題仅政。
腳本的使用規(guī)則
U3D的腳本作用方式很有趣垢油,稱之為“拖放法”。無論是作用在一個具體的場景物體還是管理著批量的物體圆丹,腳本首先必須依附于場景中的一個元素才能被執(zhí)行滩愁。要將腳本賦予物體的方式很簡單,就是按住鼠標左鍵將腳本文件拖放到物體的屬性面板上(也可以拖放到場景的物體上)辫封。U3D有個概念硝枉,那就是component(成分)--類似Maya的節(jié)點。包括腳本倦微,所有元素屬性都是游戲物體的component妻味。添加、刪除璃诀、停用弧可、讀取、寫入component信息劣欢,就是腳本所要做的(盡管腳本也是個component)棕诵。
根據(jù)腳本使用的情況,可以有以下做法:
1.腳本位于同一個物體上凿将。
可直接使用泛型或者類型轉換語法調用校套。
如:someScript = GetComponent<ExampleScript>();
2.腳本位于不同物體上。
需要使用Find或相關的搜索函數(shù)牧抵,取得指定名稱的物體信息后笛匙,再+”.GetComponent”函數(shù)。如:GameObject.Find("stone").GetComponent<ExampleScript>()犀变。
3.腳本位于同一路徑或者被調用腳本位于主腳本的路徑及以下(腳本是否被物體使用都可)妹孙。
將被調用腳本中的成員(變量或方法)使用static標識,然后可以通過”腳本.成員”的格式直接調用获枝。例如:
ScriptA.CS
…
public static mm();
…
ScriptB.CS
…
ScriptA.mm();
…
不過蠢正,static成員的調用雖然提高了效率,但因為它常駐內存省店,所以在會產生大量系統(tǒng)資源要求的情況下要慎用嚣崭。
*static是C#定義變量或方法類型的關鍵字,使用static的變量或方法懦傍,不需要new實例化即可直接調用雹舀。
【腳本內容】
除了JavaScript函數(shù),C#和BOO的腳本都需要預先載入類庫粗俱。這里以C#為例:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
}
NewBehaviourScript是腳本的名稱说榆,它必須和腳本文件的外部名稱一致(如果不同,腳本無法在物體上被執(zhí)行)。所有游戲執(zhí)行語句签财,都包含在這個繼承自MonoBehaviour類的自創(chuàng)腳本中(大括號內)稍味。
以下介紹一些常用的內置運行函數(shù)(定義函數(shù)時,JavaScript的關鍵字是function荠卷,C#是void,BOO是def烛愧。如:void Start()油宜。
Awake:在游戲運行時調用,用于初始化怜姿。
Start : 只在游戲開始時執(zhí)行一次慎冤,在Awake()函數(shù)后執(zhí)行;
Update:在游戲每一幀都執(zhí)行一次沧卢,在Start()函數(shù)后執(zhí)行蚁堤;
LateUpdate:同Update,只是它會在Update()函數(shù)執(zhí)行后再執(zhí)行但狭;
FixedUpdate:當游戲中引入剛體系統(tǒng)披诗,使用適配的方式同步物理時鐘,可以讓動力學更精確的計算立磁;
OnGUI:繪制游戲界面的函數(shù)呈队,因為每一幀執(zhí)行多次,所以一些時間相關的函數(shù)要盡量避免直接在其內部使用唱歧。
OnMouseOver:鼠標停留在物體上時執(zhí)行該函數(shù)的內容宪摧。
OnMouseEnter:鼠標進入物體范圍時執(zhí)行該函數(shù)的內容。和OnMouseOver不同颅崩,該函數(shù)只執(zhí)行一次几于。
OnMouseExit:鼠標離開物體范圍時執(zhí)行該函數(shù)的內容。
OnMouseDown:鼠標按下時執(zhí)行該函數(shù)的內容沿后。
OnMouseUp:當鼠標釋放時執(zhí)行該函數(shù)的內容沿彭。
OnMouseDrag:按住鼠標拖動時執(zhí)行該函數(shù)的內容。
OnMouse系列函數(shù)是針對指定物體的得运,如果要使用全局鼠標控制操作膝蜈,則需要使用射線相關函數(shù)。
U3D內置的代碼的命名規(guī)則
開頭第一個字母大寫的詞組都屬于類或者函數(shù)熔掺,而開頭小寫的詞組則是變量饱搏。新手經常會混淆它們之間的區(qū)別。簡單說來置逻,函數(shù)詞組可以作為變量的類型推沸,還可以直接執(zhí)行功能,詞組后必接成對小括號;變量是對應函數(shù)的分支鬓催,實現(xiàn)的是對一個具體屬性的控制肺素。例如:
Camera和camera。當場景中存在一個默認的主攝像機宇驾,腳本位于攝像機時倍靡,Camera.mainCamera.transform和camera.transform是等同的;假如腳本在其他物體上课舍,Camera.mainCamera.transform仍舊直接獲取了主攝像機塌西,而camera.transform必須要使用Find函數(shù)先找到指定名稱的攝像機:GameObject.Find("mainCamera").camera.transform。當然筝尾,這里是列出細節(jié)來比較捡需,實際運用時,腳本位于特殊元素上我們可以不用聲明這個元素的類別筹淫,如camera.transform可以簡化到transform站辉。
GameObject和gameObject。前者包含查找损姜,破壞和產生游戲物體的函數(shù)饰剥,同時可以將一個變量定義為“游戲物體”類型;后者則包含豐富的游戲物體屬性薛匪,例如名稱捐川,變形信息,動畫逸尖,渲染等古沥。
同上面列舉的camera,對于直接作用于指定物體的腳本娇跟,gameObject也可以省略掉岩齿。不過,在開始學寫代碼時苞俘,書寫完整的變量名能讓我們更深刻的記憶每個屬性和變量的關系盹沈。
通過以上對比后可以這么理解,函數(shù)通常是全局控制(包含腳本外的其他物體)吃谣,而變量是需要指出具體的應用對象乞封。
*如果書寫代碼時語句不在函數(shù)作用范圍內,編譯器將無法智能完成一些變量的全名顯示岗憋。
更多函數(shù)的運用方法肃晚,用戶可參考官方提供的幫助文檔。
簡單例子
在一個箱子上按下鼠標左鍵仔戈,箱子就開始旋轉关串,同時燈光被點亮拧廊,屏幕出現(xiàn)“Test”的字樣。
1.點擊Hierarchy欄下的Create晋修,創(chuàng)建一個Cube吧碾,Plane和Spotlight。
2.在Assets目錄下墓卦,創(chuàng)建文件夾(右鍵倦春,Create->Folder),用于存放游戲的各種資源:模型落剪,動畫溅漾,材質,腳本著榴,Prefab等。
3.雙擊進入myScript文件夾屁倔,創(chuàng)建一個C#腳本
.4.給腳本命名脑又,然后再雙擊開啟腳本編輯工具(如果腳本名稱和內部的類名稱不同,一定要更正)锐借。
5.加入鼠標相關函數(shù)问麸,這里我需要用到OnMouseOver,OnMouseExit钞翔,OnMouseDown严卖。此類特殊函數(shù)不會有智能拼寫出現(xiàn)。
6.語法方面就不傻瓜式的一步步進行了布轿,實現(xiàn)的思路是:
當鼠標移動到物體上哮笆,物體的材質色彩變?yōu)辄S色,同時將一個初始值為假的布爾變量1的值取真汰扭;當鼠標離開后稠肘,物體材質色彩還原,布爾變量1值為假萝毛;當按下鼠標左鍵项阴,且布爾變量1的值為真,布爾變量2的值為真笆包。
*OnMouse函數(shù)都是執(zhí)行一次的函數(shù)环揽,因此不能將和動畫有關的控制函數(shù)放于其內執(zhí)行,通常會使用布爾開關來控制Update函數(shù)中的動畫函數(shù)庵佣。
7.接著在Update函數(shù)內實現(xiàn):
當布爾變量2的值為真歉胶,物體旋轉。
8.將寫好的腳本拖拽到場景中的方塊上(或者先選擇方塊秧了,將腳本拖到方塊的屬性欄)跨扮,調好攝像機位置,執(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ù)的內容收起,并使用GUI函數(shù)的Label創(chuàng)建簡單的文字顯示功能(有關GUI更多的詳細信息她奥,請參閱官方文檔瓮增,我會在后面再做討論)。
11.最終測試:
12.發(fā)布哩俭。執(zhí)行File->BuildSettings钉赁,開啟發(fā)布界面。設置好要發(fā)布游戲的平臺以及一些發(fā)布的信息携茂,點擊Build按鈕即可發(fā)布一個完整的游戲客戶端你踩。U3D支持發(fā)布的平臺與用戶授權和操作系統(tǒng)有關,如IOS游戲需要MAC平臺的U3D才能發(fā)布讳苦,Android需要在系統(tǒng)安裝安卓SDK包带膜,次世代主機平臺則需要用戶向官方購買額外解決方案。