原本有一部分是在介紹Unity的面板,不過我認為了解程式和遊戲如何互動比較重要,所以這篇就不對面板和一些組件的功能多做介紹了
這篇的教學就從"認識遊戲中的移動"開始吧
所有3D的遊戲當中,每個物件都擁有一組三維座標
而平常我們玩遊戲的時候,實際上一切物件的移動都是這三組座標連續變換產生的現象
在Unity中,物件的這組座標就儲存在Transfrom的Position中
簡易的移動只要透過程式修改Position中的座標就能達成
而要玩成太空侵略者的操作,除了要能修改物件座標,還要能偵聽玩家輸入的操作才可能達成
先簡單講解一下關於操作的部分
首先在場景中創造一個Cube
接著創造一個C# Script並開啟編輯
在Update中輸入if (Input.GetKey (KeyCode.A)) {
gameObject.transform.position+= new Vector3(-5*Time.deltaTime,0,0);
完成後看起來是這樣子
using UnityEngine;
using System.Collections;
public class MINCON : MonoBehaviour {
void Update () {
if (Input.GetKey (KeyCode.A)) {
gameObject.transform.position+= new Vector3(-5*Time.deltaTime,0,0);
}
}
}
接著將該腳本拖拉到Cube上 按下Play
接著會發現到 在Game的畫面中 按下A 方塊是會不斷移動的
Void Update(){}
Update是Unity中內建的方法,經常會用到,他主要的功能是每1/60秒(約0.01666..秒),執行醫次{}中的程式碼
if (Input.GetKey (KeyCode.A)) { }
這一段就是前面所說的偵聽,IF是一個條件式,上面這一段的意思是"如果執行這段程式碼的時候,A是按著的,就執行{}裡面的程式碼"
gameObject.transform.position+= new Vector3(-5*Time.deltaTime,0,0);
這一段必須先了解一下gameObject和transform
Unity中的所有遊戲物件都是屬於GameObject的型別(凡是可以拉進場景裡面的)而GameObject也是Unity中的一個內建型別
什麼是型別?
簡單來說,例如上面的例子換到現實中,假如說一個掃把的話,掃把有掃把柄和掃把頭,但是這兩者都屬於掃把的一部分,所以掃把可以說是一個型別
gameObject.transform就像是用來指定說你要讓程式知道目前指定掃把的哪個部位,例如"掃把.掃把柄"或"掃把.掃把頭"
而gameObject和GameObject其實在程式中是有區別的,如前面所說GameObject是一個型別,而gameObject則是類似C#裡面的this,不過gameObject是指掛著腳本的這個物件本身
gameObject.transform.position的最末端即是代表這個物件的座標,然後如同前面所說,座標有三個值,分別為X Y Z,在C#中是無法只抓出一個來修改的(JavaScript可以)
在Unity中,座標和空間等通常用Vector3來表示一個裡面有X Y Z的群組變數
因此當我要修改這個值的時候,我必須New一個新的Vector3來和物件原來的座標進行運算
-5*Time.deltaTime
Time.deltaTime的用途一開始理解可能會覺得有點微妙
我建議可以先不加上*Time.deltaTime這段敘述,然後執行看看
結果應該會是你的方塊以飛快的速度跑掉
原因在於這段程式碼是寫在Update裡面,而Update是每秒執行60次的方法
*Time.deltaTime可以想成是-5*0.016666...,加上這段敘述後,當你按下A時,Cube的速度會盡可能的貼近在每秒-5,而不是每秒-5*60