iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 3
1
自我挑戰組

我要和天一樣高!!!(Unity 2D手機小遊戲開發日誌)系列 第 3

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

(本篇文章網誌版: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”)取得了玩家從鍵盤輸入的橫向控制,並指定給movementInput類別記錄了許多遊戲控制的資料。

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

http://ithelp.ithome.com.tw/upload/images/20161203/201031495OOEMqWX2A.png

名為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了。

http://ithelp.ithome.com.tw/upload/images/20161203/20103149M4QzOtSiZf.png

剛剛在Script中宣告的1movementSpeed1成為一個可以設定的欄位,隨便設定一個值(我覺得5差不多),然後按下上方的Play鈕進入Play Mode(必須確定要移動的遊戲物件在Main Camera的照射範圍內)。

http://ithelp.ithome.com.tw/upload/images/20161203/20103149HLPa0xycxo.png

現在可以自由地以←鍵和→鍵控制角色的移動了!此外,在Play Mode下,可以隨意在Scene視窗中移動遊戲物件或是設定Inspector中各欄位的值(如movementSpeed),然而在結束Play Mode時,各數值將自動被調回Play Mode前的設定。

離開Unity Editor前,得在Project欄中新開一個名為Scenes的資料夾。按Command+s/Ctrl+s把目前的遊戲場景,命名為「Game Level」,存進Scenes資料夾中。

繪圖進度

http://ithelp.ithome.com.tw/upload/images/20161203/20103149d094ZL1HyN.png

角色、裝備、降落傘,以及裝備打到敵人的攻擊特效都畫完了!
(圖片好大一張啊……但我也懶得縮了)

本篇完,待續。


上一篇
Day 2: 分割遊戲圖片--Sprite Editor
下一篇
Day 4: 調整Main Camera長寬比、設定角色移動邊界
系列文
我要和天一樣高!!!(Unity 2D手機小遊戲開發日誌)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言