Unity3D的腳本-script入門(mén)-創(chuàng)新互聯(lián)

來(lái)自:http://blog.163.com/shininglore@126/blog/static/961841802013412101454833/

成都創(chuàng)新互聯(lián)公司基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專(zhuān)業(yè)服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)大邑服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專(zhuān)業(yè)成都idc公司。
Unity3D的基本操作很容易就能掌握了,接下來(lái)就是游戲系統(tǒng)的核心部分:腳本。 什么是Script(腳本)?簡(jiǎn)而言之,就是使用代碼來(lái)執(zhí)行一系列動(dòng)作命令的特殊文本,它需要編譯器來(lái)從新解讀。U3D內(nèi)部如何解讀腳本,這不是我們所要關(guān)心的—這是引擎開(kāi)發(fā)人員的活,我們所要知道的就是腳本的使用規(guī)則。   【三種語(yǔ)言的特點(diǎn)】 U3D支持C#,JavaScript,BOO三種語(yǔ)言格式的代碼編寫(xiě)。首先來(lái)簡(jiǎn)單介紹下這三種語(yǔ)言的特點(diǎn):   對(duì)U3D來(lái)說(shuō),這是入門(mén)級(jí)的腳本語(yǔ)言,U3D內(nèi)置的函數(shù)都能通過(guò)JS方便的調(diào)用。語(yǔ)法上,JS和傳統(tǒng)的C語(yǔ)言差不多,需要分號(hào)結(jié)束符,變量類(lèi)型定義,大括號(hào)……不過(guò)它的變量類(lèi)型定義,是通過(guò)冒號(hào)接在變量右邊,如:Name:string=”Li”。相對(duì)其他兩種語(yǔ)言,使用JS語(yǔ)法,很多函數(shù)不需要實(shí)例化就能直接使用,如:
vector3 direction=vector3(1,2,3)。如果使用C#,則需要使用new關(guān)鍵字:vector3 direction=new vector3(1,2,3)。JavaScript直接繼承自U3D的MonoBehaviour類(lèi),因此不像C#和BOO那樣需要使用Using或Import來(lái)加載類(lèi)庫(kù)。這看似省心,不過(guò)因?yàn)槿鄙倭思虞d特殊類(lèi)庫(kù),JavaScript能調(diào)用的第三方函數(shù)不多(當(dāng)然,我們可以載入net類(lèi)庫(kù)給JavaScript調(diào)用,雖然看著有點(diǎn)奇怪……)。 *注意:JavaScript不是Java,同時(shí),U3D中的JavaScript也有別于獨(dú)立的JavaScript語(yǔ)言。 C#(發(fā)音C Sharp),微軟開(kāi)發(fā)的面向?qū)ο缶幊陶Z(yǔ)言。由于有強(qiáng)大的net類(lèi)庫(kù)支持,以及由此衍生出的很多跨平臺(tái)語(yǔ)言,C#逐漸成為U3D開(kāi)發(fā)者推崇的程序語(yǔ)言。U3D內(nèi)置的腳本范例中,C#腳本也占了很大一部分(其他腳本是JavaScript腳本)。另外,在裝有VisualStudio的電腦上,我們也可以使用微軟的腳本編輯工具來(lái)編寫(xiě)U3D腳本。C開(kāi)頭,那么語(yǔ)法上和C語(yǔ)言是很接近的,除了面向?qū)ο笳Z(yǔ)言所具有的一些特點(diǎn)。當(dāng)然,我不用在這進(jìn)行太多說(shuō)明,因?yàn)镃#的相關(guān)學(xué)習(xí)資料很多。 BOO是新興的基于Python的語(yǔ)言。語(yǔ)法上,BOO和Python大同小異,都是通過(guò)換行來(lái)實(shí)現(xiàn)語(yǔ)句的結(jié)束,它省略了分號(hào)、大括號(hào),甚至條件語(yǔ)句的小括號(hào)等。Python在很多大型三維圖形軟件上都有應(yīng)用,由此可以看出它的跨平臺(tái)性能很不錯(cuò),我也選擇使用Python來(lái)編寫(xiě)maya特效腳本;不過(guò),對(duì)于游戲事件的編寫(xiě),個(gè)人感到這種精簡(jiǎn)的語(yǔ)法反而有些難以適應(yīng)。如基本的變量類(lèi)型定義,BOO(類(lèi)Python)語(yǔ)法就顯得不那么便捷: direction as vector3 =vector3(1,2,3)。游戲事件不同于特效腳本,前者是過(guò)程中的交互,而后者只需要看到結(jié)果。因此,游戲中經(jīng)常需要大量的具有明確類(lèi)型的變量出現(xiàn),BOO語(yǔ)言可以省略變量類(lèi)型的優(yōu)勢(shì)在這里反而容易引發(fā)問(wèn)題。 引擎編譯時(shí),三種語(yǔ)言的執(zhí)行效率是一樣的,因?yàn)閁3D會(huì)內(nèi)部進(jìn)行它自己的語(yǔ)言格式的轉(zhuǎn)換。盡管我們可以在不同語(yǔ)言編寫(xiě)的腳本之間進(jìn)行變量和方法的調(diào)用,但是我不推薦那么做,因?yàn)闇y(cè)試確實(shí)會(huì)存在一些意想不到的問(wèn)題。使用不同語(yǔ)言編寫(xiě)多個(gè)腳本時(shí),應(yīng)盡量讓腳本之間沒(méi)有直接聯(lián)系。 最后,個(gè)人認(rèn)為,在windows平臺(tái)下,C#是U3D腳本語(yǔ)言的最佳選擇。   【腳本的使用規(guī)則】 U3D的腳本作用方式很有趣,我稱之為“拖放法”。無(wú)論是作用在一個(gè)具體的場(chǎng)景物體還是管理著批量的物體,腳本首先必須依附于場(chǎng)景中的一個(gè)元素才能被執(zhí)行。要將腳本賦予物體的方式很簡(jiǎn)單,就是按住鼠標(biāo)左鍵將腳本文件拖放到物體的屬性面板上(也可以拖放到場(chǎng)景的物體上)。U3D有個(gè)概念,那就是component(成分)--類(lèi)似Maya的節(jié)點(diǎn)。包括腳本,所有元素屬性都是游戲物體的component。添加、刪除、停用、讀取、寫(xiě)入component信息,就是腳本所要做的(盡管腳本也是個(gè)component)。 net語(yǔ)言的C#,在不同腳本之間調(diào)用變量和方法時(shí),如果腳本位于同一路徑下,那么只需要對(duì)非static(靜態(tài))成員進(jìn)行new實(shí)例化即可。例如a.cs和b.cs,要調(diào)用腳本a中的一個(gè)非靜態(tài)變量cc,需要在腳本b中寫(xiě)入:a  c=new a(),然后c.cc的格式完成調(diào)用。不過(guò),作為一個(gè)component,要調(diào)用不同腳本之間的成員,U3D的規(guī)則是使用GetComponent函數(shù)來(lái)完成(其實(shí)也就相當(dāng)于new的作用,只是U3D不支持這種腳本間調(diào)用的寫(xiě)法)。如:    someScript = GetComponent<ExampleScript>();如果是在C#腳本中調(diào)用JavaScript腳本,則使用強(qiáng)制類(lèi)型轉(zhuǎn)換語(yǔ)法:  someScript = GetComponent(“ExampleScript”) as ExampleScript ;*<>這個(gè)特殊的符號(hào)表示使用的是C#中的泛型功能,用于避免強(qiáng)制類(lèi)型的轉(zhuǎn)換,減少裝箱量(將值類(lèi)型專(zhuān)為引用類(lèi)型的操作)。  根據(jù)腳本使用的情況,可以有以下做法: 1.腳本位于同一個(gè)物體上??芍苯邮褂梅盒突蛘哳?lèi)型轉(zhuǎn)換語(yǔ)法調(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)識(shí),然后可以通過(guò)”腳本.成員”的格式直接調(diào)用。例如: ScriptA.CS … public static mm(); … ScriptB.CS … ScriptA.mm(); … 不過(guò),static成員的調(diào)用雖然提高了效率,但因?yàn)樗qv內(nèi)存,所以在會(huì)產(chǎn)生大量系統(tǒng)資源要求的情況下要慎用。 *static是C#定義變量或方法類(lèi)型的關(guān)鍵字,使用static的變量或方法,不需要new實(shí)例化即可直接調(diào)用。 【腳本內(nèi)容】 除了JavaScript函數(shù),C#和BOO的腳本都需要預(yù)先載入類(lèi)庫(kù)。這里以C#為例: using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour {}NewBehaviourScript是腳本的名稱,它必須和腳本文件的外部名稱一致(如果不同,腳本無(wú)法在物體上被執(zhí)行)。所有游戲執(zhí)行語(yǔ)句,都包含在這個(gè)繼承自MonoBehaviour類(lèi)的自創(chuàng)腳本中(大括號(hào)內(nèi))。 以下介紹一些常用的內(nèi)置運(yùn)行函數(shù)(定義函數(shù)時(shí),JavaScript的關(guān)鍵字是function,C#是void,BOO是def。如:void Start()。   Awake:在游戲運(yùn)行時(shí)調(diào)用,用于初始化。 Start: 只在游戲開(kāi)始時(shí)執(zhí)行一次,在Awake()函數(shù)后執(zhí)行; Update:在游戲每一幀都執(zhí)行一次,在Start()函數(shù)后執(zhí)行; LateUpdate:同Update,只是它會(huì)在Update()函數(shù)執(zhí)行后再執(zhí)行; FixedUpdate:當(dāng)游戲中引入剛體系統(tǒng),使用適配的方式同步物理時(shí)鐘,可以讓動(dòng)力學(xué)更精確的計(jì)算; OnGUI:繪制游戲界面的函數(shù),因?yàn)槊恳粠瑘?zhí)行多次,所以一些時(shí)間相關(guān)的函數(shù)要盡量避免直接在其內(nèi)部使用。 OnMouseOver:鼠標(biāo)停留在物體上時(shí)執(zhí)行該函數(shù)的內(nèi)容。 OnMouseEnter:鼠標(biāo)進(jìn)入物體范圍時(shí)執(zhí)行該函數(shù)的內(nèi)容。和OnMouseOver不同,該函數(shù)只執(zhí)行一次。 OnMouseExit:鼠標(biāo)離開(kāi)物體范圍時(shí)執(zhí)行該函數(shù)的內(nèi)容。 OnMouseDown:鼠標(biāo)按下時(shí)執(zhí)行該函數(shù)的內(nèi)容。 OnMouseUp:當(dāng)鼠標(biāo)釋放時(shí)執(zhí)行該函數(shù)的內(nèi)容。 OnMouseDrag:按住鼠標(biāo)拖動(dòng)時(shí)執(zhí)行該函數(shù)的內(nèi)容。   OnMouse系列函數(shù)是針對(duì)指定物體的,如果要使用全局鼠標(biāo)控制操作,則需要使用射線相關(guān)函數(shù)。還有很多特殊的游戲觸發(fā)事件的函數(shù),這里就不一一列出。 U3D內(nèi)置的代碼有個(gè)命名規(guī)則,開(kāi)頭第一個(gè)字母大寫(xiě)的詞組都屬于類(lèi)或者函數(shù),而開(kāi)頭小寫(xiě)的詞組則是變量。新手經(jīng)常會(huì)混淆它們之間的區(qū)別。簡(jiǎn)單說(shuō)來(lái),函數(shù)詞組可以作為變量的類(lèi)型,還可以直接執(zhí)行功能,詞組后必接成對(duì)小括號(hào);變量是對(duì)應(yīng)函數(shù)的分支,實(shí)現(xiàn)的是對(duì)一個(gè)具體屬性的控制。例如: Camera和camera。當(dāng)場(chǎng)景中存在一個(gè)默認(rèn)的主攝像機(jī),腳本位于攝像機(jī)時(shí),Camera.mainCamera.transform和camera.transform是等同的;假如腳本在其他物體上,Camera.mainCamera.transform仍舊直接獲取了主攝像機(jī),而camera.transform必須要使用Find函數(shù)先找到指定名稱的攝像機(jī):GameObject.Find("mainCamera").camera.transform。當(dāng)然,這里是列出細(xì)節(jié)來(lái)比較,實(shí)際運(yùn)用時(shí),腳本位于特殊元素上我們可以不用聲明這個(gè)元素的類(lèi)別,如camera.transform可以簡(jiǎn)化到transform。 GameObject和gameObject。前者包含查找,破壞和產(chǎn)生游戲物體的函數(shù),同時(shí)可以將一個(gè)變量定義為“游戲物體”類(lèi)型;后者則包含豐富的游戲物體屬性,例如名稱,變形信息,動(dòng)畫(huà),渲染等。 同上面列舉的camera,對(duì)于直接作用于指定物體的腳本,gameObject也可以省略掉。不過(guò),在開(kāi)始學(xué)寫(xiě)代碼時(shí),書(shū)寫(xiě)完整的變量名能讓我們更深刻的記憶每個(gè)屬性和變量的關(guān)系。 通過(guò)以上對(duì)比后可以這么理解,函數(shù)通常是全局控制(包含腳本外的其他物體),而變量是需要指出具體的應(yīng)用對(duì)象。 *如果書(shū)寫(xiě)代碼時(shí)語(yǔ)句不在函數(shù)作用范圍內(nèi),編譯器將無(wú)法智能完成一些變量的全名顯示。更多函數(shù)的運(yùn)用方法,用戶可參考官方提供的幫助文檔。 【簡(jiǎn)單例子】 在一個(gè)箱子上按下鼠標(biāo)左鍵,箱子就開(kāi)始旋轉(zhuǎn),同時(shí)燈光被點(diǎn)亮,屏幕出現(xiàn)“Test”的字樣。

1.點(diǎn)擊Hierarchy欄下的Create,創(chuàng)建一個(gè)Cube,Plane和Spotlight。
2.在Assets目錄下,創(chuàng)建文件夾(右鍵,Create->Folder),用于存放游戲的各種資源:模型,動(dòng)畫(huà),材質(zhì),腳本,Prefab等。 3.雙擊進(jìn)入myScript文件夾,創(chuàng)建一個(gè)C#腳本。 4.給腳本命名,然后再雙擊開(kāi)啟腳本編輯工具(如果腳本名稱和內(nèi)部的類(lèi)名稱不同,一定要更正)。
5.加入鼠標(biāo)相關(guān)函數(shù),這里我需要用到OnMouseOver,OnMouseExit,OnMouseDown。此類(lèi)特殊函數(shù)不會(huì)有智能拼寫(xiě)出現(xiàn)。
6.語(yǔ)法方面就不傻瓜式的一步步進(jìn)行了,實(shí)現(xiàn)的思路是: 當(dāng)鼠標(biāo)移動(dòng)到物體上,物體的材質(zhì)色彩變?yōu)辄S色,同時(shí)將一個(gè)初始值為假的布爾變量1的值取真;當(dāng)鼠標(biāo)離開(kāi)后,物體材質(zhì)色彩還原,布爾變量1值為假;當(dāng)按下鼠標(biāo)左鍵,且布爾變量1的值為真,布爾變量2的值為真。 *OnMouse函數(shù)都是執(zhí)行一次的函數(shù),因此不能將和動(dòng)畫(huà)有關(guān)的控制函數(shù)放于其內(nèi)執(zhí)行,通常會(huì)使用布爾開(kāi)關(guān)來(lái)控制Update函數(shù)中的動(dòng)畫(huà)函數(shù)。
7.接著在Update函數(shù)內(nèi)實(shí)現(xiàn): 當(dāng)布爾變量2的值為真,物體旋轉(zhuǎn)。
8.將寫(xiě)好的腳本拖拽到場(chǎng)景中的方塊上(或者先選擇方塊,將腳本拖到方塊的屬性欄),調(diào)好攝像機(jī)位置,執(zhí)行測(cè)試;
9.因?yàn)槟_本只作用于其所依附的物體,要控制燈光,我們有兩個(gè)選擇:創(chuàng)建新的腳本,使用查找物體函數(shù)。很顯然,我沒(méi)必要為這么簡(jiǎn)單的功能加入一個(gè)新的腳本。因此我使用Find函數(shù)獲取燈光的強(qiáng)度屬性。 *腳本中遇到這樣一串長(zhǎng)長(zhǎng)的語(yǔ)句時(shí),通常會(huì)使用一個(gè)自定義變量來(lái)替代,而且很多時(shí)候還能降低計(jì)算量。例如:float LightInt =GameObject.Find("Spotlight").light.intensity。如果在Start函數(shù)中初始化,Update中就不必每幀執(zhí)行查找函數(shù),降低游戲效率。不過(guò)這里作為一個(gè)測(cè)試,我也就很省事的忽略了。 10.GUI的使用。要在游戲視圖顯示各種UI信息,都需要使用U3D的UI組件或者GUI函數(shù)。為方便閱讀,我將其他函數(shù)的內(nèi)容收起,并使用GUI函數(shù)的Label創(chuàng)建簡(jiǎn)單的文字顯示功能(有關(guān)GUI更多的詳細(xì)信息,請(qǐng)參閱官方文檔,我會(huì)在后面再做討論)。 11.最終測(cè)試: 12.發(fā)布。執(zhí)行File->BuildSettings,開(kāi)啟發(fā)布界面。設(shè)置好要發(fā)布游戲的平臺(tái)以及一些發(fā)布的信息,點(diǎn)擊Build按鈕即可發(fā)布一個(gè)完整的游戲客戶端。U3D支持發(fā)布的平臺(tái)與用戶授權(quán)和操作系統(tǒng)有關(guān),如IOS游戲需要MAC平臺(tái)的U3D才能發(fā)布,Android需要在系統(tǒng)安裝安卓SDK包,次世代主機(jī)平臺(tái)則需要用戶向官方購(gòu)買(mǎi)額外解決方案。 *由于商業(yè)策略的分歧,U3D剛宣布了中止flash平臺(tái)的后續(xù)開(kāi)發(fā),看來(lái)想玩U3D開(kāi)發(fā)的網(wǎng)頁(yè)游戲,還是需要先安裝U3D官方的網(wǎng)頁(yè)插件。

【結(jié)語(yǔ)】 游戲制作并不簡(jiǎn)單,這里僅僅是一個(gè)初入門(mén)的小例子,主要是對(duì)腳本使用方式的練習(xí)。后面會(huì)逐步深入學(xué)習(xí)U3D豐富的函數(shù)功能。

名稱欄目:Unity3D的腳本-script入門(mén)-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://bm7419.com/article30/gecpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站改版、網(wǎng)站設(shè)計(jì)公司、云服務(wù)器、網(wǎng)站收錄小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司