2016年12月2日 星期五

Day 3: 以鍵盤操控角色——簡易Scripting

今天要達成以鍵盤控制主角左右移動。雖說這遊戲是設計給智慧型手機(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”)取得了玩家從鍵盤輸入的橫向控制,並指定給movementInput類別記錄了許多遊戲控制的資料。

回到Unity Editor,按上方的Edit→Project Settings→Input,就可在Inspector欄看到關於Input類別的設定。



名為Horizontal的控制選項中,「←鍵」預設為Negative Button,「→鍵」預設為Positive Button。所以當我在Script中呼叫Input.GetAxis(“Horizontal”),就會依照玩家按下的按鍵回傳-1.0到1.0的值。

取得玩家的橫向控制後,我宣告了一個Vector3型態的變數newPosVector3型態是可以紀錄(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)的速度不盡相同,所以把movementSpeedmovement再乘上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中宣告的movementSpeed成為一個可以設定的欄位,隨便設定一個值(我覺得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資料夾中。


繪圖進度

角色、裝備、降落傘,以及裝備打到敵人的攻擊特效都畫完了!



本篇完,待續。

沒有留言 :

張貼留言