切換
舊版
前往
大廳
主題

太空侵略者2-簡單認識遊戲操作原理 簡易移動

紅龍 | 2015-02-21 13:02:19 | 巴幣 1104 | 人氣 2648

原本有一部分是在介紹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

創作回應

あんねむたん
您好~他一直出現 CS8025 error :parsing error 請問這個要怎麼解決呢?
2015-03-20 13:42:32
紅龍
通常出現parsing error都是少了括號{}造成的 如果找不到在哪裡的話可以把腳本PO上來看看
2015-03-20 15:23:11
あんねむたん
以下是我照著您上面打的
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (Input.GetKey (KeyCode.A)) {
gameObject.transform.position+= new Vector3(-5*Time.deltaTime,0,0);

}
}
2015-03-20 15:46:19
紅龍
你少了一個大括號XD
對應到public class NewBehaviourScript : MonoBehaviour {的這個括號
2015-03-20 16:08:46
あんねむたん
原來是這樣!!感謝大大的回答 小弟對這方面還不熟 希望之後能多多指教~
2015-03-20 16:13:31
紅龍
在編寫程式的時候按下F8可以進行除錯 有時候在Unity報錯時找不到原因可以用這種方法找出原因
雖然更複雜一些的程式可能不一定能用這種方式找出錯誤 但是對初學者非常有用
2015-03-20 16:19:28

更多創作