2015年1月20日 星期二

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

這次把積欠許久的Unity下樓梯完成吧,前兩篇連結在此:第一篇第二篇,關於第二篇提到的左右圖示切換可以參考這裡,另外Unity版本更新成4.6,一些介面功能配置有些許的不一樣。

這次要完成的部分是1.隨時間增加樓梯移動速度 2.賦予不同種類的樓梯功能,完成後的結果可以點這裡

首先要做改變樓梯速度之前,要先針對第一篇提到的腳本(GameObjectClone.cs)做修改,在做產生樓梯時是使用計時器去控制,但若遊戲加入加速功能後,會造成樓梯間距不同,所以要以距離為產生樓梯的基準,首先新增作為觸發器的Sprite物件,調整至適合的位置後增加Box Collider 2D及判斷觸發用的腳本(FloorCreate.cs),另外Box Collider 2D要將Is Trigger打勾才有辦法作為觸發器。

unity go downstairs

接著是腳本(FloorCreate.cs)的內容:
using UnityEngine;
using System.Collections;

public class FloorCreate : MonoBehaviour {

    static public bool floorCreate = true;
    void OnTriggerEnter2D(Collider2D collider){
        if (collider.tag == "floor")
            floorCreate = true;
    }
}
在腳本內新增名為floorCreate的靜態布林變數,當OnTriggerEnter2D觸發時,若觸發對象tag為floor時,floorCreate設為true, 變數floorCreate的值就是是否要產生樓梯的開關,再來回到腳本(GameObjectClone.cs)做修改:
using UnityEngine;
using System.Collections;

public class GameObjectClone : MonoBehaviour {
    public GameObject [] floors = new GameObject[3];
    private GameObject Clone;
 
    void Update () {
        if (FloorCreate.floorCreate)
        {
            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);
            Clone.AddComponent("FloorMove");

            FloorCreate.floorCreate = false;
        }
    }
}
主要的改變為是否產生樓梯的if條件由時間修改成floorCreate的true or false,產生完樓梯後將floorCreate設為false,而腳本的其他部份就沒有變動。
處理完樓梯間距後,回到樓梯加速的問題,需要在腳本(FloorMove.cs)上做處理:
using UnityEngine;
using System.Collections;

public class FloorMove : MonoBehaviour {
    static public Vector3 speed;
    static public float speedup = 0;
 
    void Update () {
        speedup += Time.deltaTime / 5000;
        speed = new Vector3 (0, 0.03f+speedup, 0);
        transform.position += speed;
    }
}
這裡就使用簡單一點的方法,透過計時器累積來做加速,另外變數speed和speedup需要宣告為為static,在腳本(RestartController.cs)按下R鍵時設定回初始值:
public class RestartController : MonoBehaviour {
    static public int lifepoint = 3;
    .
    .
    .
    void Update () {
        .
        .
        .
        if (lifepoint <= 0)
        {
            GameOverText.text = "遊戲結束 按R重新開始";
            if (Input.GetKey (KeyCode.R)) 
            {
                .
                .
                .
                FloorMove.speed = new Vector3(0, 0.03f, 0);
                FloorMove.speedup = 0;
            }
        }
    }
}
下一步就是各種類樓梯的功能,這裡在腳本(FloorMove.cs)加上以下內容:
using UnityEngine;
using System.Collections;

public class FloorMove : MonoBehaviour {
    .
    .
    .
    private float floorTimer = 0;
    void OnCollisionStay2D(Collision2D collision){
        if (collision.gameObject.name == "player_0" && gameObject.name == "floor2(Clone)")
            collision.gameObject.transform.Translate (0.03f, 0, 0);
        else if (collision.gameObject.name == "player_0" && gameObject.name == "floor3(Clone)")
            collision.gameObject.transform.Translate (0, 0.5f, 0);
        else if (collision.gameObject.name == "player_0" && gameObject.name == "floor5(Clone)") {
            floorTimer += Time.deltaTime;
            if(floorTimer>0.4f){
                Destroy(gameObject);
                floorTimer = 0;
            }
        }
    }

    void OnCollisionEnter2D(Collision2D collision){
        if (collision.gameObject.name == "player_0" && gameObject.name == "floor4(Clone)") {
            RestartController.lifepoint--;
        }
    }

    .
    .
    .

}
先透過collision的name來判斷是否為玩家角色碰撞到樓梯,再透過gameObject.name來辨別樓梯種類,floor2至floor5分別對應到輸送帶、彈簧床、尖刺和翻轉樓梯,大致上就是做角色各方向的移動、扣血和樓梯消失等等功能,這裡就不多做詳細說明。

下樓梯遊戲大致上就算完成了,至於一些小細節,比如說踩到樓梯要回血、移動速度怎樣才合理和樓梯種類生成的比例等等的問題,就不在多做討論。

2 則留言:

  1. 我想問一下 為什麼我一測試我的GameObjectClone就會說 Missing

    回覆刪除
  2. 我想問一下 為什麼我一測試我的GameObjectClone就會說 Missing

    回覆刪除

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

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