Unity 3D 腳本教學 (一)
遊戲設計社 :: 遊戲引擎討論 :: Unity 3D 引擎
第1頁(共1頁)
Unity 3D 腳本教學 (一)
一、 腳本概覽
這是一個關於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);
}
另一個例子,如果你想隨著時間增加光照的範圍。下面的表達式,以2單位/秒改變半
徑。
- 代碼:
function Update (){
light.range += 2.0 * 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);
應用我們所學,你可以使用GetComponent找到任何附加在同一遊戲物體上的腳本和組件,請注意要使用下面的例子能夠工作,你需要有一個名為OtherScript的腳本,其中包含一個DoSomething函數。 OtherScript腳本必須與下面的腳本附加到相同的物體上。
//這個在同一遊戲物體桑找到名為OtherScript的腳本
//並調用它上加的DoSomething
- 代碼:
function Update(){
otherScript = GetComponent(OtherScript);
otherScript.DoSomething();
}
大多數高級的代碼不僅需要操作一個物體,Unity腳本接口有各種方法來找到並訪問其他遊戲物體和組件。在下面,我們假定有個一名為OtherScript,js的腳本附加到場景的遊戲物體上。
- 代碼:
var foo = 5;
function DoSomething ( param : String) {
print(param + " with foo: " + foo);
}
你可以通過檢視面板賦值變量到任何物體
//變換拖動到target的物體
- 代碼:
var target : Transform;
function Update ()
{
target.Translate(0, 1, 0);
}
//設置在檢視面板中賦值的target變量上的foo,調用DoSomething
- 代碼:
var target : OtherScript;
function Update ()
{
//設置target物體的foo變量
target.foo = 2;
// 調用target上的DoSomething
target.DoSomething("Hello");
}
對於一個已經存在的物體,可以通過遊戲物體的Transform組件來找到子和父物體;
- 代碼:
//找到腳本所附加的
//遊戲物體的子“Hand”
transform.Find("Hand").Translate(0, 1, 0);
一旦在層次視圖中找到這個變換,你可以使用GetComponent來獲取其他腳本,
//找到名為“Hand”的子
//在附加到它上面的OtherScript中,設置foo為2;
transform.Find("Hand").Translate(0, 1, 0);
//找到名為“Hand”的子
//然後應用一個力到附加在hand上的剛體
transform.Find("Hand").GetComponent(OtherScript).DoSomething("Hello");
// 找到名為“Hand”的了
// 然後應用一個力到附加在hand上的剛體
transform.Find("Hand").rigidbody.AddForce(0, 10, 0);
你可以循環所有的子,
//變換的所有子向上移動10個單位
for (var child : Transform in transform)
{
child.Translate(0, 1, 0);
}
參考Transform類文檔獲取更多信息。
遊戲設計社 :: 遊戲引擎討論 :: Unity 3D 引擎
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章