2017年1月22日 星期日

Unity的時間控制 - 建立關卡

作者:Alexander Grishanin和Stas Korotaev
原文
翻譯:Kelvin Lo


今天要介紹的遊戲是Lintrix
請多多支持購買願意分享開發經驗的好遊戲
Lintrix

這個系列的文章共有四篇,它會說明很多對開發者有價值的內容,我們要探討的是如何控制時間,可惜只能在遊戲裡實現XD。我們會用我們的遊戲當作範例來說明。

Lintrix是一款已發表的動作解謎 + 一點點塔防概念的遊戲,再我們要探討的內容之前你可以先看看遊戲影片。



像Lintrix這樣玩法的遊戲並不多見,所以本文會以Lintrix為例來說明如何在Unity裡實現這種功能以及有哪些應用。 我們會用Unity來展示這功能,當然概念也同樣適用於其他引擎。


章節介紹:

  • 建立關卡
  • 時間倒帶
  • 遊戲設計應用
  • 測試自動化



關卡建立工具


一開始我們設計時間控制這樣的功能是為了方便我們建立關卡(如果各位對我們用的關卡建立工具有興趣的話,我很樂意另外寫一篇來討論)

我們其中一位開發者對於開發這種動畫工具相當有經驗,值得一提的是它還有時間軸能夠查看場景任何時間的狀態。

所以我們認為這樣的功能加入遊戲中會有很多好處

基本構想是用Unity transform的狀態和屬性來紀錄時間現狀,一旦所有物件都有這種數值就能一起返回到同一個時間上。

就解謎遊戲而言,當場景裡的物件移來移去時,他們之間的相對位置是很重要的,時間軸這樣的工具可以幫助關卡企劃更容易了解關卡狀況,也能邊玩邊建立關卡。在多數情況下能很容易的編輯某個關卡時間點,讓所有的物件在某個具體時間點定住或旋轉,當時間設定為零或開始移動時,物件會自動重新計算位置。

我們還做了快速鍵方便對時間快轉和倒帶。然後關卡建立就不會只是擺擺物體後執行,而是快轉向前或倒帶向後做時間跳躍,所以這些物體在關卡的任意時刻都會保持在預先設計的位置。


這在我們的遊戲中非常有用,因為我們希望玩家能夠連接晶體來消滅所有的敵人,但另一方面,我們又不希望這些連接會覆蓋其他晶體或者彼此重疊。

實際上,在開發Lintrix遊戲的過程中,重疊是個很大的問題,因為當場景中大多數物件移動時,很難防止它們太早碰撞。 大部分時間會出現類似這種糟糕的效果:


為了理解物體如何移動,我們加了移動軌跡,讓晶體移動碰撞的問題更容易避免。

用在晶體位移可視化也很有用



我們在建立關卡時用時間控制來進行"計時"。 這裡的計時表示調整關卡某些部分的運動,使關卡執行時物體早點或晚點出現,有時也會來回移動所有的動作。 例如,在關卡開始時可以讓玩家看到將會發生的景象。然後用時間軸輕鬆地將時間移至負值,將此時間設為從零開始。

因為在編輯模式下更新時間的腳本被加到控制時間的物件,如果想要啟用或禁用物件上更改時間的效果,只需要啟用或禁用腳本,並使它們回應或忽略時間的更改。

實做方法


下面我們一起來看看如何在Unity中實現這個功能。
我們做了非常簡單的接口:


public interface ITimeChanging
{
    void AddTime(float dt);
}

實現這個接口,我們需要隨時間變化的行為。

我們還有一個時間操控實體,它是一組ITimeChanging介面的物件呼叫這些方法。 程式如下:

public class TimeManager
{
  float Time{get; set;}
  IEnumerable<ITimeChanging> TimeDependants { get; set; }
  void SetTimeBruteForce(float time);
}

在編輯模式裡,有一個可以讓使用者直接在執行模式控制時間的腳本。如下圖所示,你可以看到關卡控制器透過它的Update()來增加時間。

展示專案連結:https://github.com/alexander91/timelineExample

我們設了一個時間軸管理器允許跳轉到不同的時間。 以及幾個帶有線性運動(LineMovement)腳本的方塊,LineMovement腳本繼承自ITimeChaning,並監聽TimeManager中的時間改變(AddTime),可以在檢視介面設定這個方塊以給定速度朝預定方向移動,程式如下:

public class LineMovement : MonoBehaviour, ITimeChanging {
   [SerializeField]
   Vector3 direction = Vector3.up;
   [SerializeField]
   float speed = 0.2f;
   public void AddTime(float dt)
   {
       transform.position += dt * speed * direction.normalized;
   }
}
綜上所述,編輯器自訂時間控制工具非常適用於有固定規則的遊戲,這讓整個工作流程變得很輕鬆。 另外如果遊戲中的動作很簡單,也可以在編輯器中加入各種選項。

希望本文介紹的時間控制關卡建立方法可以給你帶來啟發。之後我們還將繼續介紹如何使用時間控制功能來改善遊戲體驗,並幫助我們進行測試,敬請期待!

沒有留言:

張貼留言

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊