2017年1月26日 星期四

如何在Unity 5裡建立3A等級的場景

作者:Tudor Gogan 原文
潤稿:Kelvin Lo


介紹


我是來自瑞典的大二生Tudor Gogan,雖然我主修遊戲設計但課餘的時間我都在自學建模和程式設計以及場景設計。

這個專案的主要目標是用我手邊有的模型來組合成3A等級的環境,專注在體現真實感、光影、物件模組化與快速開發。為了讓我自己能把重心放在整體設計而不鑽牛角尖在細節上,所以我只給自己24小時的時間來挑戰完成。








建立地形


建立場景之很重要的就是有磅礴的地形來支撐整個環境感。我採用基於節點(Node-based)流程的World Machine,花了2個小時完成了Hightmap及Splatmap。

為了方便打造環境,我選擇了V字型的山谷形狀。由於場景中沒有樹木或其它自然草皮,所以V型更有助於突出場景特色。做好基本形狀後,在高度圖中加入梯田及風化腐蝕來打造整個地形,然後利用幾張基於高度及斜率的遮罩來建立Splatmap,用來表示地形貼圖應用的位置。

高度圖及Splatmap貼圖建立完成後匯入Unity,然後用一個自訂地形著色器設定調整一些變數,根據Splatmap來應用材質,加入Tessellation(曲面細分)、LOD、地形洞穴以及一些效果。


場景使用的材質源自於Megascans網站,我對金屬貼圖及反射率做了一些調整,方便搭配場景的色調與環境物件。







資源流程

我用Megascans來調整自然環境感覺,五張4-8k的各種石頭組合照片用來組合各種岩石和一個洞穴已綽綽有餘。但只有岩石的場景還是太過單調,所以還需要放一些其它更能表現出故事情節的物件。


我沒有計畫要自己重拉模型,尤其是要在24小時內做出和場景搭配的高品質物件不太容易。我最後是從Asset Store找到官方的BlacksmithViking Village免費場景專案,從裡面拿出我要的模型然後強化它們,比如改變貼圖、加入細節貼圖,使用自訂著色器替換Unity內建的標準著色器等等。





你可以看上圖從左到右顯示了調整貼圖的三個階段,最右是最後結果。第一張木質龍頭只調整了木頭細節貼圖及反射貼圖,耗時15分鐘。而旗幟因為需要模擬布料的物理,所以耗時最長約45分鐘。




光照及後製處理


當場景地形和資源建立完畢後,光照就是增加色彩的重要部分。場景中的光照包括一個定向光(Directional Light),木質龍頭眼睛處的幾個點光源(Point Light),以及用於照亮暗處物體或濃霧的聚光燈(Spot Light)。

後製處理我
借助幾個Asset Store套件:
DeepSky Haze
Filmic Tonemapping Deluxe
Horizon Based Ambient Occlusion
SE Natural Bloom & Dirty Lens

下圖是加了後製處理的場景,其中濃霧、色調映射及顏色分級對整個場景的氣氛影響最大。

gif只能呈現256色


總結

Unity 5發表後圖形渲染已有大幅改進,改善還光速的持續進行中,Unity 5.6以後還會支援Vulkan及混合光照模式。
這個環境需要幾個自訂的著色器和後製來處理,但主要表達的是Unity用跳脫傳統的次世代功能讓製作這種環境成為可能,工具是否值得投資? 對我和會用這工具的人來說是值得的。因為開發人員不斷改進產品,並提供郵件的技術支援。


專案可執行檔已發佈,有興趣可點從這裡(658mb)下載。建議要有GTX960/GTX770或AMD Radeon HD R9 280X以上的顯卡才能跑Full HD。

2017年1月24日 星期二

Unity裡的時間操作 - 倒帶

作者:Alexander Grishanin和Stas Korotaev
潤稿:Kelvin Lo

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

獨立開發者總是同時身兼多職,今天我會繼續為大家更深入的探討,希望能對大家有幫助。

章節介紹:

  • 建立關卡
  • 時間倒帶
  • 遊戲設計應用(敬請期待)
  • 測試自動化(敬請期待)

在開發測試我們遊戲的過程中,我們發現因為玩家經常犯錯需要倒轉,因此需要在遊戲中做大量的記錄。事實上,我們遊戲的設計目的就是從各種方法來分散玩家的注意力,讓玩家因為分心導致遊戲失敗。所以我們想讓幫助玩家回想起曾今發生過甚麼事,比如顯示敵人的軌跡或在玩家之前死亡次數比較多的地方放個碰撞體。

有人擔心這樣做會讓螢幕變得混亂,或讓玩家容易重複之前的行為而不去思考新的方法,降低遊戲的趣味性。為了解決這個問題,我們發現利用時間軸功能來提示是個不錯的選擇。在每次遊戲失敗玩家點"重新開始"之後,我們可以
如圖所示用倒帶的方式重播回到起始點:


實現方法


事實上,幾乎所有重播要做的工作都在上一篇關卡建立所介紹的時間軸工具都完成了。但我們還不確定是否是最好的方案,所以我們先讓敵人和水晶的移動用相同方式回播。

雖然用之前的後退操作就能完成敵人和水晶的回播。但是關卡中有些事件是由玩家或者玩家的動作觸發的。所以我們需要為TimeManager加入新的接口:

public delegate void ReversingTimeActionDelegate();
public class TimeManager
{
    class ReversingActionWithTime
    {
       public float Time {get; set;}
       public ReversingTimeActionDelegate ActionToCarryOut {get; set;}
    }
    public void RememberAction(ReversingTimeActionDelegate action)
}
我們導入了ReversingActionWithTime這個類別來記錄動作的時間以及一個委託函式,它可以執行反向動作(類似程式設計裡的命令模式,但是透過與時間綁定而不是點ctrl+z或其他類似的複合鍵來觸發執行)。

當關卡執行且動作發生時,只需要把RememberAction反向函式加到這一時間,如果想讓時間倒退就可以呼叫這個函式。

例如,當有敵人碰到障礙消失時就加這個委託函式。之後如果點重新開始,回到這一時間點時,這個函式會再次啟動敵人的TimeManager呼叫,使敵人出現在螢幕上:

public class Enemy{
    void onCollisionWithBarrier()
    {
       timeManager.RememberAction(Activate);
       Deactivate();
    }
    void Activate()
    {
       // do the activation work
    }
    //.. Remaining implementation
}
在時間倒退模式時我們並不需要碰撞,因為這些碰撞已經在遊戲執行時就已經發生。所以只需要以更快的速度跳過一些幀來倒退遊戲狀態即可,不需要強大的硬體,倒退可以按照正常速度的20倍進行,而且關卡倒退完成就相當於重置所有的物件位置。

但在某些情況下還是需要將一些變數存在函數裡。例如下圖中黃色的子母彈(被消滅後會產生小敵人),它的位移需要被記錄下來,因為產生的小敵人軌跡會有1或2秒的隨機延遲。

右邊放那個紅點是有原因的,不是Bug XD

視覺與反饋


玩家非常喜歡時間倒退的感覺(特別是像晶體的大物件)。時間倒退不僅是一個視覺體驗,而且還能讓玩家再次回顧是如何敗給敵人的。這可以給玩家在遊戲開始前留一些思考時間,減少一些挫折感。

當玩家過關之後我們額外做了一件事。我們把介面切到遊戲地圖而非進入下一關,並重播你過關前的片段。


為了讓玩家有更好的倒帶視覺,我們做了些視覺處理。


例如在上圖我們把紅色的敵人凸顯出來,因為這是玩家需要看到的東西,這樣的視覺效果也很好。我們還加了時間倒轉的小圖示,雖然一開始我們想做類似VHS的倒帶效果,但後來因為不太符合視覺風格而作罷。這個效果是用灰階實現的,讓值大於0.7的紅色圖保持不變色。
範例下載:https://gist.github.com/Stals/b01487d44932a30be7d005870ab53798

另外,如果想要將這個效果用到鏡頭而非物件上,我們可以將著色器賦給某個材質,並將下面的腳本放到相機上:

using UnityEngine;
public class BasicPostEffect : MonoBehaviour
{
    [SerializeField]
    Material mat;
    void OnRenderImage(RenderTexture src, RenderTexture dst)
    {
        Graphics.Blit(src, dst, mat);
    }
}
接著,將新材質指給相機對應的欄位。

有趣的是,加了這個效果後,玩家不用重播就可以很清楚的知道關卡發生了哪些事情。同樣有趣的是,有部分玩家發現十次倒帶之後會出現一個從來沒看過的倒帶記憶

此外,我們還加入按兩下螢幕就能跳過倒帶的功能,按兩下螢幕也算是玩家想跳過時最常見的反應。

你還可以舉一反三嘗試一些不同用法。例如在遊戲中玩家失敗之後就秀出一些技巧說明,然後只倒帶一點時間讓玩家再次挑戰。這比讓整個關卡重新開始或行進間提示來的好。或是等玩家失敗幾次後才顯示提示。

我們也準備了一個簡單的範例專案,包含如何實現用TimeManager功能來記住物件行為。場景包含兩個方塊,當他們碰撞時會變色,由於有記錄它們的行為,因此在2.5秒後時間開始倒帶,顏色也會變回來。

專案下載

希望你已經有能力實現時間倒退的效果。下一篇文章我們會探討如何利用時間軸的遊戲設計,並瞭解如何解決一些常見的問題提升遊戲品質。

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;
   }
}
綜上所述,編輯器自訂時間控制工具非常適用於有固定規則的遊戲,這讓整個工作流程變得很輕鬆。 另外如果遊戲中的動作很簡單,也可以在編輯器中加入各種選項。

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

2017年1月20日 星期五

Unity即時運算短片Adam揭秘:場景製作

作者:Mathieu Muller 原文
潤稿:Kelvin Lo

我們去年在GDC上首次展示出即時短片Adam時,相信大家都因為Unity能製作像Adam這種高畫質影片而感到震驚,包含我在內所有的開發者都非常好奇,到底是怎麼做到的? 就讓我現場展示來解釋如何從無到有重現一個Adam場景。

這是我在2016的Unite LA的演講,本文也會做更深入的解說:

資源(Asset)


首先我先問我自己,資源正常情況下看起來應該是如何。當時我和開發小組如火如荼的努力把包含室內外環境和角色資源拆開分裝,以利開發者方便下載研究。

結果就是我把這些資源放到一個空專案時,這些資源看起來和Adam展示時完全不一樣! 那是因為專案必須做一些設定(deferred渲染線性渲染HDR鏡頭設定),還得加一些反射探針(reflection probes)來讓環境有"真實質感"。這是一個學習如何協作PBR資源,瞭解跨行業相容材質的重要性,以及如何使用新的LookDev工具很好的機會。



VFX 特效

Adam的內容是所有視覺效果組合所產生的結果,舉凡粒子特效到頂點暫存動畫,物理動作烘焙以及整個自訂體積霧和照明系統。在Adam-即時影片的VFX特效秘辛一文中,VFX設計師Zdravko Pavlov已經詳盡解釋過了。這些工具也已經公開下載了。

粒子特效:粒子特效使用了內建的Shuriken系統並大量使用了翻書特效(Flipbooks) 。霧的圖像排列是用3DS Max套件: Chaos Group's公司所開發的Phoenix FD做好後用V-Ray算出來的。最初是使用After Effects將他們組合在一起,但是自從Unite LA之後,Adam內部VFX美術開發了VFX toolbox工具並開源。這讓管理和處理圖像排列變得非常容易。最近我們還發佈了火,煙霧以及爆炸排列的資源包


Adam專案裡用來匯入模擬爆衣特效的Alembic匯入套件也可以下載了。開發這個套件的幕後功臣是Unity日本團隊,他們也完成USD匯入/匯出套件,同樣也是免費開源的。



電纜、布料及撕裂效果這些需要複雜的物理模擬,是採用Asset Store裡的CaronteFX套件。在Sebastian的角色包中有一個CaronteFX角色,有完全的烘焙模擬衣物展示。


由Demo團隊的GFX工程師Robert Cupisz開發的體積照明包(volumetric lighting package)也已上架。裡面包含霧化照明(fog lights),軟陰影(soft shadows)以及體積陰影(volumetric shadows),以及大部分室內場景都有用到的噪點和風模擬。更多這方面的細節可以參考Robert在Unite歐洲2016的演說


Lighting 照明


照明可能是決定一個遊戲是否能成為經典的最重要因素。就像電影在拍一個鏡頭時,燈光師會對每一個鏡頭放置不同燈光來獲得最佳的陰影以及光照效果。在我的演講裡我會展示和解釋如何在一個鏡頭擺好燈光。一些鏡頭可以利用不同燈光照明讓牆壁、手臂、手、臉、眼睛、頭部、胸部及身體陰影等獲得很好的照明效果。

由於Unity在Siggraph 2016上發佈了最新即時區域照明技術。Adam團隊也即時採用了這新的研究成果,並實際應用到專案中。區域光源說的是光照不是從一個點發光而是從一個表面發出,這可以產生更真實的光照效果。除了矩形在這些效果中是最明顯最適當能給予銳利光源的形狀。還有一個重要的原因是現實世界中並不存在
點光源,所以我們很難感受它對材質影響,採用區域光源就可以從材質獲得更好的反饋,進而增加照明品質。結合體積照明包裡的PCSS軟陰影、體積陰影、燈管照明和霧燈,我就可以重創完全相同的場景,在幾分鐘內把Adam場景還原。


Post Processing 後製處理


最後,就像所有的電影製作一樣,鏡頭後製特效是電影攝影的核心。在製作Adam的過程中團隊必須處理來自不同來源的各種特效(一般資源電影特效Keijiro效果(註一)、Asset Store或還在alpha版支援移動向量(motion vectors)的Unity TAA等等)來獲得最終的結果。Adam團隊還開發了自己的色調映射(Tonemapping)、顏色分級(color grading)和動態模糊(motion blur)效果。

此外,想要有最好的結果需要設定好正確的排序和正確的特效設定。但要解釋清楚這一切需要花點時間(還好我幾週前的演說有錄下來)。


不看影片也別擔心,我們有發佈了一個後製處理串流工具,美術可以簡單將所需要的特效串在一起(例如:HDR顏色分級)。按幾下滑鼠就可以打開TAA(temporal anti-aliasing)抗鋸齒效果, Adam裡漂亮的柔邊就是它的功勞。加入了動態模糊和景深效果來模擬像是用一台真的相機所拍攝出來的感覺,加上色調映射和顏色分級效果來獲得電影般的質感。

最重要的是將所有的效果集中起來運算,可以用最少的渲染次數來獲得最好的效果,這樣連MacBook Pro 2014上都能夠執行了!


結論

一開始我們要對外展示Adam都要額外準備很多工作,現在任何人都可以用Unity 5.4.1並下載資源包就可以自己處理。


這次我沒有足夠的時間展示,把所有的Adam場景串起來並輸出成影片。首先,大多數的人物和相機動作是用動態捕捉的系統採樣的,由於設備的緣故我只能在演說時展示有骨架與IK的Adam角色。其次,目前Unity的Timeline系統尚在開發階段,相信很快就會公佈了。

註一:Keijiro Takahashi,Unity日本團隊的特效工程師,負責許多後製特效的開發,並製作很多工具開源在Github上。

2017年1月18日 星期三

Unity案例分享:全景3D還原梵谷經典畫作

原文
潤稿:Kelvin Lo

本文為大家分享一位來自以色列的3D設計師Ruslan Sokolovsky,利用3DS Max及Unity將梵谷經典畫作Bedroom in Arles還原為真實可互動的3D場景,讓參觀者穿越到梵谷所處年代,感受當年大師創作時的美妙意境。

Hi 我的名字叫Ruslan Sokolovsky,來自以色列,我和你們大多數人一樣一生都在畫3D,做為一位自由畫家已經有13年經驗。接的案子多為電影、電視廣告或者一些即時演算的動畫。由於一直是單打獨鬥的關係,因此經常需要瞭解作品的整個製作流程,從建模、渲染到剪接最終的成品。這些經驗也讓我有機會嘗試並了解CG領域很多的新功能。

有時專案間的空檔我閒不下來會接一些小專案。碰巧接了一個幫Android製作3D桌布的專案,讓我有了很棒的體驗,這樣的專案能讓我自由發揮創意,也沒有客戶要我改來改去。我開始著手做了鐵達尼號沈船場景、外星人世界和重建歷史故事場景。
其中一個想法是重建名畫裡的場景,所以我從Escher、Goya和Sezane的作品開始...

最後完成了我最愛的梵谷名作,亞爾的臥室(Bedroom in Arles)

我僅有的參考資料只有網路上的梵谷畫作和一些描述房間內部細節文章。但梵谷的畫作屬於印象派,僅根據畫作根本無法還原出房間原本的透視與結構,所以我乾脆放棄從畫作角度切入的想法。

場景建模並不複雜,主要目標是保持物體面數儘可能的低,畢竟移動平臺的效能是一大挑戰。因此場景的模型都非常簡單,都是一些非常基礎的模型,用的也是3D建模軟體的標準建模技術。我喜歡用3Ds Max,它有我想要的所有功能,整個場景最終三角面只有1萬。


由於場景是房間內部,所以我用標準建築的光照設定。陽光透過窗戶灑向房間的地板、椅子和床,平衡這些物體的顏色與光照讓整個房間呈現出最好的效果。為了保持較暗的陰影,我把gamma設為1.0。




APP主要的概念是使用即時互動的方式,讓玩家根據喜好改變佈置的顏色和貼圖。所以我為大部分的模型都做了幾套素材,玩家可以自由變換組合,搭配出完全不同風格的場景。這種玩法也讓原先的場景更加豐富,為用戶打開了更為廣闊的想像空間。



建好模型並完成光照烘焙之後,我將場景匯到Unity做最後的設定,透過程式來達成玩家能即時改變房間風格的功能。玩家可以改變牆上掛的畫(梵谷的其它畫作),或更換牆壁、地板或傢俱的材質。你可以像裝修自己家一樣,去改變梵谷1888年在法國普羅旺斯短暫停留期間的臥室。

App版本針對手機做了優化,可產生Android的3D動態壁紙。
App提供9個相機可以讓你切換視角之外,它還支援陀螺儀,旋轉手機就可以看到房間各種不同的角度。

以下是放在Sketchfab的版本可以稍作體驗,要體驗Unity發佈到Android的版本請到Google play下載。

2017年1月17日 星期二

Unity開發經驗分享:I Expect You To Die

原文
潤稿:Kelvin Lo

今天為大家分享密室逃脫類型的VR遊戲I Expect You To Die(以下簡稱IEYTD)在開發過程中所遇到的挑戰,並詳細介紹開發團隊如何優化VR沉浸式體驗。


超級間諜之手

自從我們的Oculus分享版本發佈以來,IEYTD最大的功能改變是手的整合。遊戲最初是用滑鼠玩,現在也都還支援這項功能。當初我們收到Oculus Touch原型機之後,我們發現用手玩才是真正遊戲的王道,因為它提升了很多沉浸感。

操作方式轉換

IEYTD最初版本和最終版本最大的差異就是操作方式的改變:最初的展示版只支援滑鼠操作,後來加了對Oculus Touch的支援,得到了更自然的抓取及其它手勢操作模擬。

IEYTD的核心思想是玩家透過與VR環境中的物體互動解決謎題。專案初期玩家使用滑鼠將準星瞄準到物體上進行意念控制。這個模式允許玩家與遠處的物件互動。當操控方式轉為雙手操作時,我們希望保留這個功能,同樣也讓玩家獲得在VR中抓握物體的美妙體驗。因此最後遊戲中有兩種手勢操作的模式:近距離抓取模式和遠端意念控制模式。


近距離抓取模式

使用虛擬手掌抓取物體是一種很奇妙的體驗,這個機制對於IEYTD遊戲來說非常關鍵。在遊戲中玩家的手顯示為虛擬的間諜手套,並由動畫來表現不同手勢。這個模式下玩家抓取物體時手會完全消失,這麼做的主要原因就是範圍。IEYTD中可以抓取的物體有很多,如果都使用統一的抓取動作並不實際。再者,抓取方式因人而異,還得受環境限制。



當玩家的手出現在環境裡時,"可抓取"的物件將會變亮。我們借由一個觸發器(Trigger)和從玩家頭部到手發出一條射線來進行偵測。觸發器用於管理可抓取的物件清單,射線投射用來選則哪一個是最靠近玩家頭部的物體。遊戲中預設玩家最想碰的是最靠近玩家頭部的物體。
 


意念抓取(TK)模式

TK模式允許玩家和
範圍外的物件進行互動,這能讓遊戲的謎題設定更靈活並且可以創造出更多樣的環境。它也奠定了"超級間諜"的遊戲主題,擁有許多厲害的間諜工具。


TK模式的設計目標是將原本用滑鼠控制的準星模式改為用手互動。為了實現這一點,我們為每隻手放入一個做為父物件的準心並朝向正前方。之後準星沿著這個方向放置在3D空間裡,並朝該關卡的幾何碰撞體進行射線投射。這種方法在大多數條件下都適用,當然還是會有一些不理想的情況。

首先準星會抖動,因為它和你的手相連,輕微的手部運動都會導致它抖動。距離越遠時移動因此被放大會顯得很奇怪。這時瞄準遠處的物件就會變得很困難。為了解決這個問題,我們用了一個阻尼曲線(damping curve)對原始準星加了"平滑準心處理"。平滑值與原始準星位移成反比,結果小的位移可以被平滑處理掉,太大的位移仍會產生問題。


第二個問題是,準星在遊戲中的渲染順序。為了避免遮擋問題並讓準星保持一個2D效果,我們將它渲染在遊戲世界的所有幾何最上層。這種方法在準星基於頭部時很有效,但並不適用於手部,玩家對準星位置的感知會受到嚴重影響。這個問題在玩家視線上有多個物件不同景深的位置時尤其明顯。對於玩家而言,準星將出現在距離他們最近的物件表面,但實際上是在一個物件表面的不同深度上。這種差異造成了玩家與目標物件互動時的混淆。為了解決這種問題,我們從頭部朝準星進行了射線投射,並在路徑上檢測是否存在可互動的物件。如果檢測到可互動物件,就將準星瞄準到該物件。

手的碰撞模型


VR環境下實現"手"的一大挑戰是如何從物理的角度與虛擬世界進行互動。遊戲的物理規則只是一種模擬,當和虛擬手結合後,它的移動不受物理限制,就會發生一些奇怪又搞笑的事。手部碰撞模型由兩部分組成:手部的物理和持物的物理。

手部的物理
在IEYTD中,手沒有碰撞器(Collider),只有抓取物體的觸發器(Trigger)。玩家可以將虛擬手伸入物件中並穿過去。我們曾一度考慮在發生觸碰時給予虛擬的回饋,但最終並沒有這麼做,原因是這樣可能會誤導玩家將手伸入物件中。我們不希望玩家可以將那些近處的物件推遠,尤其是那些對於謎題很重要的物件。

持物的物理
判斷玩家要抓取物件的物理行為是一個有趣的課題。我們一開始的模式是用手持物件與環境碰撞,當碰撞總數超過一個值時,物體會從玩家手中滑落。最初這個解決方案似乎可行,但當關卡和互動變複雜之後,互動感令人失望。比如我們有一堆現金,雪茄和手榴彈放在狹小的空間裡,當玩家在高速移動時
抓取到這些物件,狹小的空間將導致物理系統持續嘗試穿透,然後產生嚴重的物理問題。經常因為這種穿透導致碰撞總數超出範圍使玩家手中物體無意中掉落。這種體驗很不爽也會成為解決謎題的障礙。


之後我們將解決方案調整成在拾取物體後關閉碰撞檢測器。初期測試的效果很理想,在狹窄空間抓取物體不會再出現物理效果失常。但也延伸出一種狀況,玩家現在可以將物體放到物件裡面了,這時如果放開物體,它們會彈到一個無法預測的位置,因為物理系統會試圖解決穿透而給予壓力。雖然在給玩家的測試中這並不多見,玩家也通常不會注意到這問題。

這種方案還有一個問題,如果關閉了碰撞器,當您拾起物體時,它將不再檢測碰撞,造成我們無法再打碎物件了。這改變影響了整個遊戲的解謎玩法,因為打碎物體是解謎機制的一個重要核心內容,其次無法打破物件會降低沉浸感。因此我們做了一些調整,在玩家快速移動物體時會短暫開啟碰撞器,允許發送和接收碰撞事件。這個方案效果很好動作也很直覺。


最後,在意念抓取模式被抓到的物件身上的碰撞器會一直開著。因為經過測試被意念抓取到的物件在穿過物體時如果沒有任何阻力會非常不自然。並且有很大幾率導致在物體內丟失物件。

超級間諜之耳


音效對於好的VR體驗來說至關重要。IEYTD是解謎遊戲,但它也是一個物理沙箱(Sandbox)。玩家可以在裡面堆疊物體,來回扔它們,打碎它們甚至朝他們射擊。因此這些物體與環境會經常發生碰撞,發生碰撞時要有適當的音效。


為了實現這種音效互動,我們設計了一個系統來標註環境裡的碰撞體是軟的還是硬的,是玻璃還是金屬表面。上圖顯示轎車關卡中用不同顏色來把轎車內部不同的表面上色。音效設計師
為每種類型的表面以及每個可以被玩家抓取的物件做了兩種碰撞聲音(普通和重音)。設計思路是根據碰撞的速度調整這兩種聲音的大小再同時播放這兩種聲音。最初的測試效果很理想,稍作改變後就可以讓系統模擬產生很好的碰撞音效。下圖是整個系統工作原理的概述。




手殘的超級間諜


隱藏區域

正如之前所提及IEYTD也是一個物理沙箱。玩家在解謎的同時也可以進行有趣的物理實驗。我們對這個功能很滿意,但這是會產生一個新問題。因為玩家可能會沉浸在物理實驗中,讓關鍵解謎線索埋在一堆物件下。

我們決定沿用以前遊戲常用的方法來解決這個問題,對被擋住的物件用雷射Shader做透視處理。起初我們覺得會打破玩家的沉浸感,但玩家扮演的是有意念控制的超級間諜,擁有透視能力似乎也合情合理。然而我們又不希望對所有的遮擋物都使用這個功能,這樣反而會暴露謎題隱藏的內容。取而代之的是,我們做了一個系統來定義玩家無法到達的區域:名為Hidden Volumes(隱藏區域)的觸發區域。當物體掉落在這個區域後,就會採用雷射著色器讓玩家透視物體。


接下來我們需要一種讓玩家可以與隱藏區域的物體進行互動的方法。為了實現這個目的,我們將物體放在不同的物理層,用能打在特定層的射線進行探測並選擇目標。這個方法就能讓玩家穿過物體抓取物件。


禁區
顧名思義,這個區域的唯一目的就是別讓玩家看到,這些地方可能是某個解謎的關鍵之處,或者沒有安排場景模型。預設情況下,在玩家的頭部進入這個區域時會將螢幕逐漸轉為黑色。在一些劇情中也很適合做這種禁區,讓玩家的頭部離開該區域時螢幕漸漸變黑。


蓋子
IEYTD中很多夾層都放有玩家可以拿的物體。為了防止玩家隔空取物,我們設定了特殊的物理層並加入蓋子碰撞檢測器。由玩家頭部到手部對該層進行射線投射,使用碰撞檢測器檢測與射線的碰撞。如果檢測到碰撞,就判斷玩家試圖不打開蓋子想拿取內容物,這時就會禁用抓取功能。


VR的力量

IEYTD的開發極具挑戰性,我們穫得了很多經驗。這裡介紹的技術是經過無數的玩家測試和修正的結果,還包括VR社群交流的知識。VR是一個強而有力的媒體,開發者能為玩家帶來全新的體驗。也正是VR,能讓IEYTD給玩家一個成為身手不凡超級間諜的機會。


I Expect You To Die遊戲現已上線,支援Oculus及PlayStation® VR平台,您可在 Oculus StorePlayStation® Store下載。後續我們還將為大家分享更多遊戲及VR/AR開發相關的經驗,請保持關注哦!

關於我自己

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