2014年11月11日 星期二

【Unity】下樓梯遊戲製作(1/3)

下樓梯遊戲是一款簡單又容易上癮的小遊戲,相信許多人都玩過,下圖大概就是最記憶猶新的版本,由於遊戲概念簡單,製作一款下樓梯遊戲並不太複雜,這次就透過Unity從無到有製作一款陽春版下樓梯遊戲。
(這篇做完的半成品點這裡,透過鍵盤A和D操控左右。)

go downstairs

在開始動工之前,要先了解遊戲中各個部分做了什麼事,遊戲概念如下圖:
go downstairs

條列式的解說一下製作目標:
1.背景需要做貼圖往上捲動的效果,產生正在往下移動的錯覺。
2.平台往上移動,隨著遊戲進行會加速,從畫面底部隨機生成位置與平台種類。
3.玩家控制的角色可以左右移動,角色本身會因為重力往下掉但遇到平台會停止。
4.左上角是角色生命值,生命值歸零後遊戲結束。
5.角色被禁止離開畫面中,分為三類:左右兩側禁止穿越,畫面最上方會令生命值減少並下掉一層,畫面最下方則是會令角色生命值歸零。
6.最後右上角為計數器或計時器,是回饋給玩家的結果,玩家目的是在生命值歸零之前另計數器的數字越高越好。

1.首先從背景捲動開始,調整解析度後新增GameObject->Create Other->Directional light,新增GameObject->Create Other->Plane作為背景,將Plane旋轉和放大覆蓋到整個攝影機。
background

將事先準備的背景圖加到作為背景的Plane,在將以下腳本(BackGroundLoop.cs)加到Plane上,利用貼圖座標的改變讓背景捲動,透過調整speed參數可以改變捲動速度,執行後可以看到背景捲動的效果
using UnityEngine;
using System.Collections;

public class BackGroundLoop : MonoBehaviour {
    public float speed = 0.2f;
    void Update () {
        renderer.material.mainTextureOffset = new Vector2 (0, Time.time * speed);
    }
}
background02

2.將平台的貼圖從Texture換成Sprite(2D/uGUI),接著拉進場景後移到Camera拍不到的地方,根據個人想設計的平台種類新增平台數量,在平台上新增Box Collider 2D,在Main Camera上加入下面的腳本(GameObjectClone.cs)。
unity sprite

using UnityEngine;
using System.Collections;

public class GameObjectClone : MonoBehaviour {
    public GameObject [] floors = new GameObject[3];////(1)
    private GameObject Clone;
    float timer = 0;

    void Update () {
        timer += Time.deltaTime;
        if (timer > 0.3)////(2)
        {
            int i = Random.Range(0, 3);
            float j = Random.Range(-1.4f, 1.4f);
            float posx = j;
            Vector3 pos = new Vector3(posx, -2.0f, -5);
            Quaternion rot = new Quaternion(0, 0, 0, 0);
            Clone = (GameObject)Instantiate(floors[i], pos, rot);////(3)
            Clone.AddComponent("FloorMove");////(4)
            timer = 0;
        }
        GameObject[] AllObj = FindObjectsOfType (typeof(GameObject)) as GameObject[];
        foreach (GameObject obj in AllObj)
        {
            if(obj.transform.position.y>20)
                Destroy(obj);////(5)
        }
    }
}

(1)平台種類數量,要在場景編輯中把floor1、floor2和floor3手動加到script->floors下的Element。
script

(2)透過計時器新增平台,可以調整參數來改變出現間隔。
(3)複製平台種類及出現位置,種類及位置透過隨機產生。
(4)加入平台向上移動的腳本(FloorMove.cs)。
using UnityEngine;
using System.Collections;

public class FloorMove : MonoBehaviour {
    public Vector3 speed = new Vector3 (0, 0.05f, 0);

    void Update () {
        transform.position += speed;
    }
}
(5)將position.y>20的物件移除掉。

執行後可以看到平台移動的結果:

3.接下來是玩家操控的角色移動,將事前準備的角色貼圖Texture Type從Texture換成Sprite(2D/uGUI),另外將Sprite Mode改成Multiple,接著按Sprite Editor,彈出視窗後透過滑鼠框出角色待機所需要的圖案。
unity sprite

將角色貼圖加入場景,調整位置後(注意:角色位置的Z值要和floor一樣),加入Rigidbody 2D和Box Collider 2D,將Rigidbody 2D下的Fixed Angle打勾,讓角色不至於翻轉,最後將腳本(Controller.cs)加入,執行後就可以透過A和D來做左右的操控。
unity sprite
using UnityEngine;
using System.Collections;

public class controller : MonoBehaviour {
 
    void Update () {
        if(Input.GetKey(KeyCode.A))
            transform.position = new Vector3(transform.position.x - 0.05f, transform.position.y, transform.position.z);
        if(Input.GetKey(KeyCode.D))
            transform.position = new Vector3(transform.position.x + 0.05f, transform.position.y, transform.position.z);
    }
}

這次就先寫到這裡,下樓梯遊戲實際寫起來比想像中繁雜許多,就先拆成兩篇吧,平台效果、GameOver判斷、生命值和角色翻轉等等就留在下次,另外一些解析度、速度參數的細節調整就不多提,留給各位去做嘗試,最後感謝角色素材提供:
王國興亡記-少年冒險者 by そーいち
http://makapri.web.fc2.com/top.html

5 則留言:

  1. 請問要如何使背景在卷回來 他動作時 捲到底後 就開始出現一條一條的線 不會在循環回來了?
    請問我照者打時 為何我框起來的哪 會出現錯誤
    {renderer.material}.mainTextureOffset = new Vector2 (0, Time.time * speed);
    最後他把我自動修改為下面這行
    GetComponent().material.mainTextureOffset = new Vector2(0, Time.time * speed);

    回覆刪除
    回覆
    1. 寫這篇的時候Unity版本是4.x,5.0後material修改了一些語法,
      你可以參考這一篇:
      http://unity3d.com/cn/learn/tutorials/modules/beginner/live-training-archive/2d-scrolling-backgrounds

      刪除
  2. 請問在我完成這一段之後,開始遊戲之後遊戲換面的評太卻和石戲畫面的平台步協調導致人物會有懸空亦或是卡在平台裡的情況發生,請問這是為甚麼呢?

    回覆刪除
  3. 請問在我完成這一段之後,開始遊戲之後遊戲畫面的平台卻和實際遊戲畫面的平台不協調導致人物會有懸空亦或是卡在平台裡的情況發生,請問這是為甚麼呢?
    (前面打錯字沒注意真是不好意思)

    回覆刪除
  4. 請問 (5)將position.y>20的物件移除掉 是全物件還是?

    Fixed Angle 沒有出現在2D 怎麼新增

    回覆刪除

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...