1. 程式人生 > >Unity指令碼知識教程(一)

Unity指令碼知識教程(一)

指令碼知識概覽

Unity內部的指令碼,是通過附加自定義指令碼物件到遊戲物體組成的。在指令碼物件內部不同志的函式被特定的事件呼叫。最常用的列在下面:

Update:這個函式在渲染一幀之前被呼叫,這裡是大部分遊戲行為程式碼被執行的地方,除了物理程式碼。

FixedUpdate:這個函式在每個物理時間步被呼叫一次,這是處理基於物理遊戲的地方。
在任何函式之外的程式碼:

在任何函式之外的程式碼在物體被載入的時候執行,這個可以用來初始化指令碼狀態。

注意:文件的這個部份假設你是用Javascript,參考用C#編寫獲取如何使用C#和Boo編寫指令碼的資訊。

你也能定義事件控制代碼,它們的名稱都以On開始,(例如OnCollisionEnter),為了檢視完整的預定義事件的列表,參考MonoBehaviour 文件。

常用操作

大多數遊戲物體的操作是通過遊戲物體的Transform或Rigidbody來做的,在行為指令碼內部它們可以分別通過transform和rigidbody訪問,因此如果你想繞著Y軸每幀旋轉5度,你可以如下寫:

function Update(){

transform.Rotate(0,5,0);

}

如果你想向前移動一個物體,你應該如下寫:

function Update(){

transform.Translate(0,0,2);

}

跟蹤時間

Time類包含了一個非常重要的類變數,稱為deltaTime,這個變數包含從上一次呼叫Update或FixedUpdate(根據你是在Update函式還是在FixedUpdate函式中)到現在的時間量。所以對於上面的例子,修改它使這個物體以一個恆定的速度旋轉而不依賴於幀率:

function Update(){

transform.Rotate(0,5*Time.deltaTime,0);

}

移動物體

function Update(){

transform. Translate (0, ,0,2*Time.deltaTime);

}

如果你加或是減一個每幀改變的值,你應該將它與Time.deltaTime相乘。當你乘以Time.deltaTime時,你實際的表達:我想以10米/秒移動這個物體不是10米/幀。這不僅僅是因為你的遊戲將獨立於幀而執行,同時也是因為運動的單位容易理解。( 米/秒)另一個例子,如果你想隨著時間增加光照的範圍。下面的表示式,以2單位/秒改變半徑。

function Update (){

light.range += 2.0 * Time.deltaTime;

}

當通過力處理剛體的時候,你通常不必用Time.deltaTime,因為引擎已經為你考慮到了這一點。

訪問其他元件

元件被附加到遊戲物體,附加Renderer到遊戲物體使它在場景中渲染,附加一個Camera使它變為相機物體,所有的指令碼都是元件,因為它們能被附加到遊戲物體。

最常用的元件可以作為簡單成員變數訪問:

Component 可如下訪問

Transform transform
Rigidbody rigidbody
Renderer renderer
Camera camera (only on camera objects)
Light light (only on light objects)
Animation animation
Collider collider

…等等。

對於完整的預定義成員變數的列表。檢視Component,Behaviour和MonnoBehaviour類文件。如果遊戲物體沒有你想取的相同型別的元件,上面的變數將被設定為null。任何附加到一個遊戲物體的元件或指令碼都可以通過GetComponent訪問。

transform.Translate(0,3,0); //等同於GetComponent(Transform).Translate(0, 1, 0);

注意transfom和Transform之間大小寫的區別,前者是變數(小寫),後者是類或指令碼名稱(大寫)。大小寫不同使你能夠從類和指令碼名中區分變數。應用我們所學,你可以使用GetComponent找到任何附加在同一遊戲物體上的指令碼和元件,請注意要使用下面的例子能夠工作,你需要有一個名為OtherScript的指令碼,其中包含一個DoSomething函式。OtherScript指令碼必須與下面的指令碼附加到相同的物體上。

function Update(){

otherScript = GetComponent(OtherScript); //這個在同一遊戲物體桑找到名為OtherScript的指令碼

otherScript.DoSomething(); //並呼叫它上加的DoSomething

}

更多Unity學習資料請前往paws3d平臺尋找。連結https://www.paws3d.com/learn/,最近又有專業人士直播講解開放世界遊戲關卡設計,詳情可加群935714213