萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> Unity3D中文入門教程

Unity3D中文入門教程

   剛開始學Unity3D,入門是比難的,首先要了解U3D最重要的五大界面,第一:場景(Sence),構建游戲的地方;第二:層級(Hierarchy),場景中的游戲對象都列在這裡。第三:檢測面板(Inspector),當前選中的資源或對象的設置,是一些變量和組件的集合。第四:游戲(Game),演示窗口,僅在播放模式中演示。第五:項目 (Project),一些資源的列表,和庫的概念一樣。

  然後了解主菜單欄的八大菜單:文件(File),編輯(Edit),資源(Assets),游戲對象(GameObject),組件(Component),地形(Terrain),窗口(Window),幫助(Help),熟悉這些菜單每一個命令對以後的游戲制作大有幫助。

  在U3D中,一定要對坐標(Coordinates)有個了解,U3D的坐標點是以(x,y,z)的順序排列的,切記。熟悉坐標,在做游戲的過程中會更加順手。

  如果你沒有任何編程基礎,一樣可以學習Javascript(或C#這些都行),我學AS的時候也完全不懂編程。先學Javascript語言也無妨,因為這個引擎主要是個編程工具。打開Script幫助文檔和Monodevelop編寫器,從最簡單的位移(transform.Translate)開始吧。

  Unity3D的基本操作很容易就能掌握了,接下來就是游戲系統的核心部分:腳本。

  什麼是Script(腳本)?簡而言之,就是使用代碼來執行一系列動作命令的特殊文本,它需要編譯器來從新解讀。U3D內部如何解讀腳本,這不是我們所要關心的—這是引擎開發人員的活,我們所要知道的就是腳本的使用規則。

  【三種語言的特點】

  U3D支持C#,JavaScript,BOO三種語言格式的代碼編寫。首先來簡單介紹下這三種語言的特點:

Unity3D中文入門教程 三聯

  對U3D來說,這是入門級的腳本語言,U3D內置的函數都能通過JS方便的調用。語法上,JS和傳統的c語言差不多,需要分號結束符,變量類型定義,大括號……不過它的變量類型定義,是通過冒號接在變量右邊,如:Name:string=”Li”。相對其他兩種語言,使用JS語法,很多函數不需要實例化就能直接使用,如:

  vector3 direction=vector3(1,2,3)。如果使用C#,則需要使用new關鍵字:vector3 direction=new vector3(1,2,3)。JavaScript直接繼承自U3D的MonoBehaviour類,因此不像C#和BOO那樣需要使用Using或Import來加載類庫。這看似省心,不過因為缺少了加載特殊類庫,JavaScript能調用的第三方函數不多(當然,我們可以載入net類庫給JavaScript調用,雖然看著有點奇怪……)。

  *注意:JavaScript不是Java,同時,U3D中的JavaScript也有別於獨立的JavaScript語言。

  C#(發音C Sharp),微軟開發的面向對象編程語言。由於有強大的net類庫支持,以及由此衍生出的很多跨平台語言,C#逐漸成為U3D開發者推崇的程序語言。U3D內置的腳本范例中,C#腳本也占了很大一部分(其他腳本是JavaScript腳本)。另外,在裝有VisualStudio的電腦上,我們也可以使用微軟的腳本編輯工具來編寫U3D腳本。C開頭,那麼語法上和C語言是很接近的,除了面向對象語言所具有的一些特點。當然,我不用在這進行太多說明,因為C#的相關學習資料很多。

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

  引擎編譯時,三種語言的執行效率是一樣的,因為U3D會內部進行它自己的語言格式的轉換。盡管我們可以在不同語言編寫的腳本之間進行變量和方法的調用,但是我不推薦那麼做,因為測試確實會存在一些意想不到的問題。使用不同語言編寫多個腳本時,應盡量讓腳本之間沒有直接聯系。

  最後,個人認為,在windows平台下,C#是U3D腳本語言的最佳選擇。

  【腳本的使用規則】

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

  net語言的C#,在不同腳本之間調用變量和方法時,如果腳本位於同一路徑下,那麼只需要對非static(靜態)成員進行new實例化即可。例如a.cs和b.cs,要調用腳本a中的一個非靜態變量cc,需要在腳本b中寫入:a c=new a(),然後c.cc的格式完成調用。不過,作為一個component,要調用不同腳本之間的成員,U3D的規則是使用GetComponent函數來完成(其實也就相當於new的作用,只是U3D不支持這種腳本間調用的寫法)。如:

  someScript = GetComponent();

  如果是在C#腳本中調用JavaScript腳本,則使用強制類型轉換語法:

  someScript = GetComponent(“ExampleScript”) as ExampleScript ;

  *<>這個特殊的符號表示使用的是C#中的泛型功能,用於避免強制類型的轉換,減少裝箱量(將值類型專為引用類型的操作)。

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

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

  可直接使用泛型或者類型轉換語法調用。

  如:someScript = GetComponent();

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

  需要使用Find或相關的搜索函數,取得指定名稱的物體信息後,再+”.GetComponent”函數。如:GameObject.Find("stone").GetComponent()。

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

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

  ScriptA.CS

  …

  public static mm();

  …

  ScriptB.CS

  …

  ScriptA.mm();

  …

  不過,static成員的調用雖然提高了效率,但因為它常駐內存,所以在會產生大量系統資源要求的情況下要慎用。

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

  【腳本內容】

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

  using UnityEngine;

  using System.Collections;

  public class NewBehaviourScript : MonoBehaviour {

  }

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

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

  Awake:在游戲運行時調用,用於初始化。

  Start : 只在游戲開始時執行一次,在Awake()函數後執行;

  Update:在游戲每一幀都執行一次,在Start()函數後執行;

  LateUpdate:同Update,只是它會在Update()函數執行後再執行;

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

  OnGUI:繪制游戲界面的函數,因為每一幀執行多次,所以一些時間相關的函數要盡量避免直接在其內部使用。

  OnMouseOver:鼠標停留在物體上時執行該函數的內容。

  OnMouseEnter:鼠標進入物體范圍時執行該函數的內容。和OnMouseOver不同,該函數只執行一次。

  OnMouseExit:鼠標離開物體范圍時執行該函數的內容。

  OnMouseDown:鼠標按下時執行該函數的內容。

  OnMouseUp:當鼠標釋放時執行該函數的內容。

  OnMouseDrag:按住鼠標拖動時執行該函數的內容。

  OnMouse系列函數是針對指定物體的,如果要使用全局

copyright © 萬盛學電腦網 all rights reserved