(本篇文章網誌版:http://shineright.blogspot.tw/2016/12/day-3-scripting.html)
今天要達成以鍵盤控制主角左右移動。雖說這遊戲是設計給智慧型手機(iOS & Android)平台玩的,但在開發階段若不能以電腦鍵盤來測試遊戲,將會非常麻煩。所以接下來我會寫一段簡單的程式碼,讓遊戲角色在玩家按下←鍵、→鍵時,分別往左或右移動。
養成好習慣,在Project欄中創立一個Scripts資料夾以儲存所有的Scripts。在空的Scripts資料夾中點滑鼠右鍵,選擇Create→C# Script以建立新的Script。
把新建立的檔案取名為「PlayerMovement.cs」,點兩下打開。預設的Script會有一個繼承自MonoBehavior,且名稱與檔名相同的類別(Class)。類別內有Start()
和Update()
函數(function)。
所有繼承自MonoBehavior
的類別都可以成為遊戲物件(Game Object)的Component (下篇文章將詳細解釋Component和Game Object),且可以使用Unity API的Event Function(如Start()
、Update()
等)。
void Start()
函數會在首次載入該Script的時候自動被呼叫(Call),而void Update()
則是在進入每個新的影格(Frame)時被呼叫。例如,每秒跑24影格(24 fps)的遊戲,void Update()
就會一秒被呼叫24次。
開始寫程式吧:
using UnityEngine;
using System.Collections;
public class PlayerMovement : MonoBehaviour
{
//宣告一個浮點數(floating point)來設定角色的移動速度
public float movementSpeed;
//暫時不會用到 void Start(),先刪掉
void Update ()
{
//移動的距離
float movement = Input.GetAxis ("Horizontal") * movementSpeed * Time.deltaTime;
//新的座標
Vector3 newPos = new Vector3 (transform.position.x + movement, transform.position.y, transform.position.z);
//把座標設為新的座標
transform.position = newPos;
}
}
首先,我宣告了一個名為movementSpeed
變數來控制角色移動的速度。Unity Scripting好用的地方在於,完全不必在這段Script中指定movementSpeed
的初始值,因為被宣告為public
的變數成員之後可以在Inspector欄中指定初始值(馬上就會示範給你看)。
在void Update()
中,我從Input.GetAxis(“Horizontal”)
取得了玩家從鍵盤輸入的橫向控制,並指定給movement
。Input
類別記錄了許多遊戲控制的資料。
回到Unity Editor,按上方的Edit→Project Settings→Input,就可在Inspector欄看到關於Input類別的設定。
名為Horizontal的控制選項中,「←鍵」預設為Negative Button,「→鍵」預設為Positive Button。所以當我在Script中呼叫Input.GetAxis(“Horizontal”)
,就會依照玩家按下的按鍵回傳-1.0到1.0的值。
取得玩家的橫向控制後,我宣告了一個Vector3
型態的變數newPos
。Vector3
型態是可以紀錄(X, Y, Z)座標的結構(Structure)(在Unity場景的2D座標中,左:-X,右:+X,下:-Y,上:+Y)。transform.position
紀錄了遊戲物件當下的座標,所以transform.position.x + movement
就是要讓角色移動到的新X座標。因為Y、Z座標不必更動,所以傳入原本的Y、Z座標(transform.position.y, transform.position.z)
給新的newPos
變數。最後再把transform.position
指定為新的座標(newPos
)就完成了。
遊戲中每個影格(frame)的速度不盡相同,所以把movementSpeed
乘movement
再乘上Time.deltaTime
,才能使角色移動的速率一致。(Time.deltaTime
回傳上個影格到這個影格所經過的時間。例如,影格1在進入遊戲後9.2秒被載入,影格2在進入遊戲後9.42秒被載入,在影格2呼叫Time.deltaTime
就會回傳9.42-9.2=0.22。)
回到Unity Editor。隨便拉一個上次切割好的Sprite到場景上,然後在該Sprite的Inspector欄按Add Component,選最下方的Scripts,剛剛寫好的Script就出現啦!點一下它,就可讓它成為遊戲物件的Component了。
剛剛在Script中宣告的1movementSpeed1成為一個可以設定的欄位,隨便設定一個值(我覺得5差不多),然後按下上方的Play鈕進入Play Mode(必須確定要移動的遊戲物件在Main Camera的照射範圍內)。
現在可以自由地以←鍵和→鍵控制角色的移動了!此外,在Play Mode下,可以隨意在Scene視窗中移動遊戲物件或是設定Inspector中各欄位的值(如movementSpeed),然而在結束Play Mode時,各數值將自動被調回Play Mode前的設定。
離開Unity Editor前,得在Project欄中新開一個名為Scenes的資料夾。按Command+s/Ctrl+s把目前的遊戲場景,命名為「Game Level」,存進Scenes資料夾中。
角色、裝備、降落傘,以及裝備打到敵人的攻擊特效都畫完了!
(圖片好大一張啊……但我也懶得縮了)
本篇完,待續。