如何使用Unity 5等免費工具做創意原型
雖然到目前為止,仍然沒有一款非常成功的 VR 硬件,也沒有一款虛擬現實游戲大作,但 VR 這個單詞絕對是 2015 年最熱門的話題之一,不僅如此,資本界和傳統游戲發行商以及平臺運營商紛紛加入這個新興的市場,甚至出現了多次十億美元級別規模的并購。所以,不論如何,虛擬現實都已經開始出現了起步,其中不乏 Valve、HTC 三星、谷歌以及 非死book 等大公司的入場,而且這幾家公司都將在近期內推出 VR 硬件。據 SuperData 的數據估計,VR 市場預計將在 2019 年達到 159 億美元的規模。
但是,另一方面,由于硬件和軟件技術的限制,目前高質量的 VR 體驗仍然需要解決很多的問題,而很多正在為之研發游戲的主流工作室都承認,他們自己都不知道在做什么。這其實就像是當時的《毀滅戰士(DOOM)》和《德軍司令部(Wolfenstein)》一樣,沒有人知道一個好的 VR 游戲到底長什么樣,而且這個領域如今依然等待一些獨立工作室成長為該領域的領導者。如果你想要做游戲,那么 VR 可能是一個不錯的機會。
所以,我們假設你希望做 VR 游戲,如今的工具已經比以往任何時候都更加對用戶友好,而且大多數都是免費的。但是,你該從哪兒開始呢?別著急,這份博客會提供給新手開發者所有需要的工具,而且完全是免費的。
所以,我們下面就開始講述具體的內容:
你需要準備什么:
想要開始做 VR 游戲,你只需要 3 樣東西:
首先,你需要有 VR 頭戴設備,目前銷量最多的硬件是 Oculus Rift DK2,售價為 350 美元;
第二,你需要一個性能相當不錯的 PC,虛擬現實游戲的資源占用是普通 PC 游戲的三倍,所以一定要有強大的 CPU 和顯卡,Oculus 的推薦是 i5+GTX 970 或者同等配置,外加 8GB 的內存條。
第三,你還需要最新版的 Windows 7/8/10 系統。
除此之外,你所有需要的東西都是免費的。在軟件方面,我們要使用的是:
Unity 5 個人版、The GIMP(Gnu Image Manipulation Program)軟件、StreamVR 的 Unity 插件、Primitive Plus 的 Unity 插件、Oculus Windows Runtime。
安裝你的工具
首先,我們把所有東西都安裝好,下載并運行 Unity 安裝器和 GIMP 軟件,這都是自解壓的程序,當你首次打開 Unity 的時候,它會提示你創建一個帳號,你需要有一個帳號,只是要記得用戶們和密碼。
在 Unity 里,創建一個新項目(注意是 3D 項目而不是 2D),把目錄指向我的文檔/My Project 文件夾。
然后,用瀏覽器進入 Unity Asset Store 商店,登錄用戶名,這時候,你可以獲得開發者工具和資源。使用 Primitive Plus 和 SteamVR 鏈接以上工具,找到安裝文件夾,點擊‘用 Unity 打開’按鈕,由于這些都是免費資源,你不需要投入一分錢,不過其他東西可能不是免費的,所以在選擇的時候需要謹慎。按照彈出的提示,把這些安裝包導入到 Unity 里。這時候,你應該可以從 Project 子目錄看到新的文件夾。下載這些資源可能需要一點兒時間,所以要有耐心,在按照、導入完成之前不要關閉 Unity 軟件。
用 Unity 進行 Scripting
如果你之前學過編程的話,那么 Unity 用起來是非常容易的。如果你不熟悉 C# 語言,可以通過以下新手教程進行初步的熟悉,如果你之前任何編程都沒有做過,最好也看一下這個簡單的教程,然后解決 Project Euler 上的謎題,這可以讓你熟悉在編程中將會遇到的問題,這些都是你需要的問題解決技巧。
C#新手教學
在你熟悉了用 C# 解決問題之后,我推薦投入一些時間探索 Unity,你可以通過他們做的非常不錯的新手引導教學,也可以付費參加 Unity 高階課程。在這片博客中,我會為所有用到的組件進行簡短的解釋,但是,要做大的項目,你還需要看 Unity 的教程,因為它包含了很多有價值的信息。
為了使用 Unity 腳本,你首先需要添加一個 Object,在編輯器里,你可以用三種方式當中的一個創造 3D 物體:作為安裝包直接導入;拖拽文件夾到 My Project/Assets 文件夾目錄下;通過屏幕頂部的 GameObject 菜單用編輯器創造, 你可以通過這個方法做簡單的形狀,比如方塊和球體,也可以創作文本和粒子。
如果你選擇導入,或者把它們拖拽到資源文件夾,他們就會出現在 Project 的附窗口內,你可以通過選擇 Scene 進行選擇然后把它們直接拖拽到游戲里。然后你就可以在游戲中看到這些物體。左上角的控制鍵可以讓你對這些物體按照自己的喜好進行擴展、旋轉或者定位。這些物體可以作為其他物體的父物體,只需要在 Hierarchy 標簽下把它們的名字推拽到其他上面即可。
一旦物體出現在場景中之后,你可以為之添加一個或者多個腳本,這些腳本可以讓物體栩栩如生,比如可以讓槍開火、子彈運動還可以讓角色行走和說話。
想要增加腳本,在 Scene 界面或者 Hierarchy 標簽下選擇你想要控制的物體,Inspector 標簽可以顯示所有與該物體相關的組件,一個普通物體通常看起來會是這樣的,而且包含以下元素:
一個可以讓引擎知道物體是什么形狀的 Mesh Filter 濾鏡;一個把物體描繪到屏幕上的渲染器;一個可以讓物理引擎知道物體存在并定義其屬性的 Rigidbody;一個定義物體物理邊界的 Collider:你可以通過給一個復雜的物體賦簡單的 collider 讓物理計算更容易,比如一個箱子或者球體。
從 Inspector 標簽下,你可以通過底部的 Add Component 按鈕添加新的腳本。從這里開始,你既可以增加一個已經創造好的腳本,也可以做一個新的。把語言切換成C#,輸入你想要的名字,然后點擊創建,這就會給物體增加一個空白的腳本,在 Inspector 標簽下雙擊腳本名字會直接在 MonoDevelop 里打開這個腳本,這也就是 Unity 的代碼編輯器。
在你的新文件里,你會看到一個 Start 和 Update 功能,Start 是當物體首次被創造的時候運行,這時候要做所有需要的創建步驟,Update 則會一直運行,這里也是大多數的邏輯運算需要進行的地方。
為了獲得物體組件,你可以輸入 gameObject.Renderer、gameObject.rigidbody 等等,主要取決于你希望控制的元素是什么。在 Start 運行之前調用的公用變量將會出現在編輯器中,所以它們變得更容易調整。為了獲得如何與更多系統元素互動的信息,你可以去查看 Unity 使用指南。
這是我創造的一個簡單腳本,可以讓物體按照正弦波進行有節奏地伸縮。在 Unity 里創建一個方塊、增加腳本、復制腳本到 Update method。然后你可以在編輯器里保存并點擊 Play 按鈕,這時候你應該可以看到方塊不斷地伸縮,要確保 Camera 物體放置在合適的位置,這樣它才能看到物體。
開啟 VR 模式
現在,我們創建了一個基本的 Unity 場景,那么下一步我們把它展示到你的 VR 頭盔中,這時候,我們需要用到 SteamVR 插件,它既可以對 Oculus Rift 也可以對 HTC Vive 進行渲染,并且兩種方式用起來都很方便。
在 Project 標簽下,進入 SteamVR 文件夾,打開 prefab 子文件夾,你會看到一些可以使用的對象。拖拽 CameraRig 和 SteamVR 預制件到場景中,這些已經包含了你所有需要的東西,把它們移動到你的場景中,放到同一個點,只有移動了它們,你才能看到方塊。現在,刪除原來的 cemera 物體,如果在場景中存在多個活躍的 camera 會導致 trigger 錯誤,因為 Unity 不知道你想用哪一個。
這時候,如果你還沒有安裝 Oculus Windows Runtime 的話,這時候就可以進行安裝了,然后把它連接到你的 DK2。
r/Oculus 是一個非常不錯的資源,demo 場景應該很流暢地運行,然后追蹤頭部的旋轉和定位,既沒有 jerkiness 也沒有雙圖像。
如果它運行正常的話,確保你的 Camera 能夠看到你,而且要確保它是正確的。還要確保你的顯卡足夠強大、后臺沒有運行特別占資源的應用。
一旦確認了 VR 頭盔運行正常以后,打開 Unity 并點擊 Play 按鈕,我們做的簡單場景就可以出現在你的 VR 頭盔中了,恭喜,你做出了第一個 VR demo。
做第一個 VR 游戲
到目前來說,這一切看起來都是很簡單的,但是,這個 demo 其實并不是很好。為了讓你們體驗更好的項目,接下來我會講述制作一個完整 VR 街機游戲的過程,這是我已經完成了的項目,它叫做 ASteroidVR。
這并不是《Skyrim》那樣的大作,但至少是一個可以玩的完整游戲,有可以使用的圖形和完整的一套玩法。我做這款游戲用了幾天的時間,而且屬于證明概念型的 demo 級別,你將會用不同類型的游戲進行很多的嘗試。
這個游戲其實很簡單:你將駕駛一艘被困在大房間里的船,這艘船會按照常速移動,你可以駕駛和射擊,但沒辦法停止。這個房間會慢慢地被隨機尺寸的小行星所充滿,它們會在房間里無目的的彈跳。你需要做的就是避免撞到這些小行星,也不要撞墻,保持盡可能長的時間。你可以對小行星射擊,但你如果打光的話,你彈夾裝彈速度會很慢。
這就是該游戲的基本理念,所以,我們不妨從下面開始講如何制作。由于這只是一個 demo,所以我們只用簡單的初始圖形,比如方塊和球體(使用 Primitive Plus 資源)。
船
這就是我創作的船。
我承認,它看起來更像一個鏟車,但至少對于這個 demo 來說夠用了。
當創建駕駛員座艙的時候,確保為用戶視角做一些明顯的結構,特別是在邊緣部分。這可以避免用固定的元素、減少他們需要移動的感覺,避免讓玩家產生動態眩暈感。這樣,他們的大腦就更容易處理缺少移動的情況。
我不得不嘗試了多個駕駛員座艙,直到找到了一個不讓我感到眩暈的為止。當你有所懷疑的時候,增加更多的支桿,把攝像頭移到背后。這時候放大一定要謹慎,因為你在 Unity 增加一個單位,在 VR 里就是多了一米,所以一定要注意你創造的物體大小,因為你做的物體很容易在 VR 里看起來太大或者太小,而一旦做好了之后,這些問題就沒法解決了。
在完成了船的打造之后,在它的周圍做一個方塊,并且把船的所有 Primitive 都與之鏈接,這樣可以作為一個 Collision 盒子與運動中心,為外部的方塊增加 rigidbody,禁用渲染(只要不在 inspector 中檢查即可)。確保 rigidbody 已經設置好,這樣 kinematic 和 use gravity 都會被禁用。為船的每一個 Primitive 增加另一個 rigidbody,這次要把設置調整為 kinematic,但要關掉 use gravity 選項。
移動 CameraRig 和 SteamVR 物體到駕駛員座艙內,并且把它們固定到用戶的頭部在船內的位置,這時候我會用 Unity 的另一個免費資源確保位置擺放正確(仿真機器人),把它們父級化(parent)到外部的方塊,這樣就會讓他們的移動跟隨物體一起移動。
然后為船寫腳本,以下是我創造的兩個腳本,Vehicle Controller 和 Vehicle Destroyer。第一個腳本是從用戶那里讀取輸入,為船體提供推力,確保船體移動。第二個用于偵測船和一些標簽為石頭的物體相撞的時候,一旦發生碰撞就終止游戲。為了增加更多的樂趣,它還會把船體拆分成各種組件,讓你看到他們在碰撞中四散開來。這個腳本會創造一系列的 object,你需要用船的屬性進行填充,當然,是在編輯器內做。
這個腳本還會在玩家死亡的時候展示一些指導教學,創造一個 TextMesh GameObject,然后把它設置為提示‘你已經死亡,射擊以便重新開始’,把這個 TextMesh 放到駕駛員座艙內,把它父級化到船體上,禁用它的渲染組件。然后拖拽到 Inspector 里的 VehicleDestroy 腳本 instruction 變量中,正常情況下你是看不到文本的,但在角色死亡的時候會再次出現。
小行星
下一步,我們來創作行星。這是我做出來的一個行星,主要是通過把一些屬性放在一起做成的,使用了標準的著色器,沒有使用任何復雜的功能,但它看起來還不錯。
我增加了一個 rigidbody,把它標記為 Rock,如果你不熟悉 Unity 的 tag 系統,最好是了解一下教程。基本來說,tag 可以讓你把特殊的屬性附加到對象上,這在撞擊的時候可以被偵測到,讓腳本知道他們在和什么互動。在這個案例中,tag 會導致船目標偵測到它撞到了危險的東西。
然后給行星做腳本,這里的腳本是 AsteroidInit,主要做兩件事。首先,它會對行星進行隨機化大小,讓它們看起來是有區別的,并且每一個都從不同方向出現。其次,它會偵測行星是否會被標記為子彈的物體擊中,如果被擊中,那么它就會激活附屬的粒子發射器,把原有的對象破壞掉。
競技場
非常好,這兩個基本的游戲元素已經做好了,下一步,就是做競技場。它可以是你想要的任何形狀,但確保它足夠大,因為如果讓人們在小圈子里轉的話,他們很容易不適,通常來說,直接飛行的方式相對沒有那么大的負面影響。把所有的墻體都標記為 Rock,確保當船體撞到的時候就會被撞毀,這就是我最后做出來的競技場:
你會注意到,這些墻體都帶有一個簡單的 placeholder texture,我是用 GIMP 做的。大多數情況下,我設計這個游戲是用無特色審美觀確保其簡單性,然而,我發現當沖向一面墻的時候很難被告知,很容易出現問題。所以,為了配合玩法,我給它們加入了 texture,我還為競技場增加了粒子發射器,確保它可以告訴你在靠近一個對象的時候是如何移動的。幸運的是,競技場看起來非常被動,所以它們并不需要腳本。
最后,創造一個 Primitive 數據并且把它放到墻體上。
這將會成為你的行星掉落點,為之增加腳本,你會注意到的是,腳本調用的是 Asteroid GameObject 變量,這在編輯器里是可以看到的。在編輯器里把你的行星對象拖拽它的上面,這樣你就可以產生無數個行星,頻率大概是每秒一個,給游戲增加緩慢增長的難度曲線,把最初的行星放置到很遠的地方,避免它會偶爾被破壞或者帶來任何問題。
HUD 和槍支
這時候,游戲的基本對象都是可玩的了。現在,我們給游戲增加一些第二功能,讓游戲變得更有深度。這個腳本是和 TextMesh 放在一起的,可以記錄玩家在游戲里活了多久。第二個腳本與一個文件互動,確定你的最高分數,當你重啟的時候就會看到,這時候,一個簡單的排行榜系統就出爐了,這可以給玩家創造一個目標。把這些都放置到駕駛員座艙內可以很容易看到的位置。
最后,我們需要加入玩家使用的槍支,為船體增加槍支對象,這其實也并不復雜,把腳本拖拽到槍上,你還需要鏈接到子彈對象,它可以是帶有 rigidbody 和子彈標簽的任何物體。把它的顏色調亮,這樣才能做到可視化。把這個腳本增加到另一個 TextMesh 中,把它放置到駕駛員座艙內,以便玩家很容易看到。
最后的調整
做到這一步,游戲基本上已經完成大部分了,游戲所需要的所有基本元素都已經完成了,現在是時候測試了,你可以改變行星的尺寸范圍,競技場的尺寸和范圍、船行的速度,ammo 的量、裝彈頻率以及冷卻時間等等。你可以用船的方式進行處理。如果你希望這么做,并且具有一些 3D 模型技巧,那么你甚至可以取代我的編程美術資源,使用真實的資源做一個更好的游戲。最重要的是,一定要多試驗幾次,確認怎樣讓你感覺良好,而且測試者沒有不適感。
如果你希望了解完整的 Unity 項目并且進行使用的話,你可以自行下載,如果你只是為了像我一樣做個可玩的游戲,那么只需要簡單地下載一些東西就可以了。
做你自己的 demo
如果你一直用自己的教程做游戲,并且有時候遇到了不理解的東西,那么你可能最后要非常好地處理用 Unity 做 VR 游戲的基本操作了,如果你想更近一步,那么最好是做足準備。
也就是說,VR 游戲研發和傳統游戲相比是完全不同的,所以我會說一些比較通用的 VR 游戲研發建議,主要是為了讓 VR 游戲設計更舒適,還可以充分利用媒介的優勢。
動態傳感
首先而且最重要的是,矯正用戶的頭部動態傳感,不要放大物體,把它覆蓋起來,改變視角,或者加入一些基本的東西,否則的話就會和基本元素混合。Oculus 和 Valve 都在避免讓人們產生眩暈方面做了大量工作,除非你手中有一些感知心理學的書籍,但你并不一定要容忍這些,沒有什么比一個十米大的物體卡在你腦海中 10 秒鐘以上更能夠帶來不適感了。
同樣的,做動態傳感也需要仔細,讓人們出現不適感的最主要原因是,當他們的眼鏡受到了動態信息之后,但內耳并沒有收到。總體來說,確保動態傳感緩慢而穩定。加速應該是瞬發的,旋轉應該是最小化的。當旋轉必須發生的時候,給玩家提供固定的點位作為周圍視野的參照。如果可以的話,最好不要做帶有傳感的游戲,你在單個房間里可以做很多非常酷的東西,或者也可以使用微型對象,這樣的游戲體驗就會變得更加舒適和愉悅。
UI 設計
很多人在做 VR 游戲的時候,理所當然地希望把物體都放到玩家頭部周圍,就像是軍用 HUD。不幸的是,這種方法被證明是不太好用的。當你的眼鏡專注于任何游戲世界里比較遠的東西的時候,離你頭部近的對象就會變成像素級的圖像,另外,盯著太近的物體看會讓眼睛疲勞。
為避免這種情況,你要嘗試把 UI 盡可能放到游戲世界里,可以把《Dead Space》作為參考,你會看到在 AsteroidsVR demo 里,所有的 UI 都是圍繞駕駛員座艙的,因為這是玩家周圍的空間,所有的 UI 都看起來非常舒適。
同樣,要注意文本,目前的 VR 頭盔分辨率都非常低,特別是當你計算他們占據多大視野的時候,這意味著文本可能是很難閱讀的,所以,盡可能不要依賴它,你所提供的文本應該足夠大,在普通視角下可以閱讀就行了。
圖形優化
你需要記得的是,VR 是非常增強型的體驗,DK2 需要運行在 1080p、3D 和 75FPS 幀率條件下,消費者版本的 Rift 和 HTC Vive 都會運行在更高分辨率和幀率的狀態下。如果不能達到這樣的幀率,將會導致出現雙屏閃爍的視野,這是讓人很沮喪的,也很容易分心并導致眼疲勞。
因此,你對于性能的設計要比平常更謹慎,這意味著要降低 poly-count,最小化圖形效果,使用簡單的模型,確保光源最小化,禁用動態陰影并且嘗試用同樣的材料做盡可能多的對象。在 Inspector 里,你還要把所有不變化或者移動的對象標記為靜態,這樣 Unity 就可以更容易把它們組合到一起并節約性能。如果可能的話,在游戲設計方面做限制,可以為游戲設計成卡通風格。總體來說,如果你可以在不傷害游戲的前提下減少視覺效果,那最好就這么做。
該規則唯一的例外就是抗鋸齒,在每個人的眼中,他們看到的鋸齒都不一樣,這樣會導致 3D 效果降低,引起眼疲勞。所以,你要盡可能多的使用抗鋸齒功能(我推薦用 MSAA),還要避免出現高頻率視覺細節的紋理,比如樹葉、微粒或者遠處復雜的紋理。
有些視覺效果是不適合 VR 的,即便你可以做,也最好不要用。
在做后期效果處理的時候要謹慎,比如鮮花盛開,它們本身就會帶有立體視差。
還有,你需要意識到的是 3D 會讓一些常見的視覺欺騙看起來非常糟糕。普通地圖、游戲里的主要物品在 VR 里近看的時候都是平的,用于爆炸效果的 billboard sprite 看起來也是平的,而且這會破壞游戲的沉浸感。同樣,很多用于渲染碎片或者植物的 sprite 技術看起來也是扁平和別扭的。
最后,要提防透明物體,現代的渲染引擎在追蹤同一個場景中的透明物體的深度方面是有問題的,所以,你要避免從一個透明物體可以看到另一個透明物體的情況。
或許你會發現,在去掉了所有的圖像效果之后,你的游戲看起來有些單調,可以嘗試使用光貼圖和環境遮擋。光貼圖可以直接把光照 bake 到地圖的紋理層中,這對于所有不移動的物體來說都是不錯的,可以給游戲世界增加更多的深度。對于動態物體,比如游戲角色,開發者們可以考慮使用 Shadow blob 紋理創造環境遮擋。它并不是完全現實主義的,但非常有幫助。
隨著時間的進展,這些技巧可能都沒有那么必要,但目前來說,你還是需要充分利用這些特點來節約性能的。
盡早并且頻繁地實驗
我最重要的建議就是,忘掉你的先入為主的成見,VR 和我們之前做過的游戲都不一樣,有些優勢和限制是所有人都無法預測的,有些在紙上看起來很好的想法,但實際用的時候卻是很糟糕的。有些最受歡迎的 VR 體驗也變成了非常奇怪的東西。
VR 是一個全新的媒介,沒有人完全理解它的規則。在傳統的游戲領域,我們非常清楚如何做 FPS、RPG 等類型的游戲,這些基本的內容已經非常固定的,這些都是非常固定的規則,每一個新游戲都是一種提高,但通常并不一定是新的內容。在 VR 領域,除了新類型之外就沒有什么是新的了,目前這個領域還沒有被完全開發,沒有人知道他們自己在做什么。
這讓人非常興奮,但它也意味著你必須做到靈活,如果你有個非常不錯的想法,那就立即去做,盡快做一個創意原型,然后看是否有效果。但是,也要做好失敗的準備,如果你的想法不夠有趣或者游戲讓玩家感到不適,那么就放棄并且開始新的想法。
最好是每周都做一款新游戲,或者每天也可以,直到你挖到金礦為之。你做的失敗的創意原型越多,那么你做出非常酷的游戲的概率就越大。要做非常奇怪的游戲,沒有人知道什么是有用或者什么是沒有用的,所以要廣撒網,有時候后來被證明是精彩游戲的想法會讓你都吃驚。
所以,是時候嘗試做一些新游戲了,以上就是博客的全文了,祝你們獲得有趣的創作體驗。
來自: 游戲大觀