【環球熱聞】讓關卡制作事半功倍:資深開發者分享定制化工具打造經驗
如果只用一半時間就可以做出同樣的內容,你會怎么想?如果你知道不僅可以節約大量時間,還可以通過日常的重復行為節約很多比較短的時間會怎樣?對于游戲開發者而言,我們應該用定制化工具更聰明地工作,而不是更刻苦。
【資料圖】
在此前的GDC分享中,資深游戲開發者Brett Taylor分享了定制化工具以及它帶來的不同幫助,并通過案例分析的方式討論了什么時候應該制作工具,以及哪些時候投入工具是浪費時間。在演講的最后,Taylor還分享了一些Unity代碼快捷方式,希望對同行們有所幫助。
以下是Gamelook聽譯的完整內容:
Brett Taylor:
首先做一下自我介紹,我是Brett Taylor,在哥倫比亞大學拿到了認知學碩士學位,自從2008年開始就已經在研發游戲。
從業經歷方面,我在Arkadium工作室度過了三年的開發者生涯,轉入獨立游戲研發之后,做了一款名為《Linelight》的游戲,并且有不錯的表現。最近我還成為了Playdead工作室的一名開發者。
今天的分享主要分為四個部分,首先談談什么是定制工具,然后聊聊關卡編輯器,我這些年做了很多個關卡編輯器,這也是一種類型的工具。隨后,我們會討論什么時候適合做一個工具,最后會介紹一些Unity代碼快捷方式,這么多年的研發過程中,我積累了大量的快捷方法,對于Unity開發者來說是有幫助的,我會在隨后分享一個鏈接,需要的同行可以直接使用。
什么是定制化工具?
你們可能會問,定制工具到底是什么?按照我的定義,能夠幫助策劃以及程序員節約時間的代碼或系統,就是定制化工具。
其中最重要的就是節約時間,因為定制化工具的最大意義就是讓你做游戲更快。不過,我并不總是使用這些工具,今天分享的重點是能夠幫助同行們節約時間和精力的工具,而不是如何打造最優秀的研發工具。
具體來說,今天講的工具主要是與游戲策劃有關,而不是bug查找那樣的游戲制作工具,我今天分享的工具主要是為了方便策劃為游戲增加內容,幫助策劃處于最佳狀態或者行云流水的狀態。
假如你每天可以12次節約20秒的時間,如果是通過工具實現,那么投入工作制作的時間(如果是4分鐘)是否值得?你失去的并不只是4分鐘,而是作為游戲策劃,這個工具制作時間打斷了你的流暢狀態,所以,當我談到是否值得制作工具的時候,不只是它節約了多少時間,更重要的是它能否保證你處于最佳狀態,以更有效率的狀態工作。
最佳狀態指的是,當你創作內容的時候不被打斷,意味著更高的工作效率,不過,在必要的時候,也需要能夠很容易打斷。
我們再來談談Bob Ross,以及他的“節約時間模型(time-saving role model)”。Ross是1990年代公共廣播電視節目“歡樂畫室”系列主持人,他平均作畫時間在22-23分鐘左右,其中使用了很多捷徑方式。
他曾公開表示,“這是懶人作畫方式”。但我認為這是非常聰明的繪畫方式,這樣作畫是非常高效率的,節約了大量時間。
工具也分為不同類型,比如它可以小到只是一串可重復使用的代碼,也可以大到一個功能豐富的關卡編輯器,圖片中的編輯器是我在10多年前做的,隨后我們會提到它。
我們可以做幫助策劃為游戲內增加內容的策劃工具,還有幫助程序員的可復用代碼段甚至是代碼庫,今天的分享主要是針對策劃工具,不過在最后我們也會分享一些Unity代碼。
策劃工具還包括關卡編輯器以及能夠突出關卡問題的工具,比如幫助組織關卡結構的工具,或者,你也可以做分支劇情的文本編輯器。
關卡編輯器案例
《Scalea》
這是我做的第一款游戲,圖中是它的關卡編輯器。這是我有史以來做的首個關卡編輯器,是在大學期間(2010年)完成的,其中很大一部分靈感來自《時空幻境(Braid)》編輯器,實際上整個游戲靈感也是來自《時空幻境》,只不過把操控時間切換成了操控空間。
《Scalea》整個游戲時長只有半個小時,但它的關卡編輯器卻是很不可思議的,因為我做了很多的功能。
總結來說,整個關卡編輯器用了3個月時間,坦白來說,與我做工具投入的時間和精力相比,它帶來的回報并不是很多,雖然有很多功能,但并不值得。不過,值得慶幸的是,通過這個關卡編輯器的制作,我學到了很多東西。
《Linelight》關卡編輯器
這款游戲發布于2017年,從《Scalea》編輯器,我學到了很多不能增加到工具里的東西。在《Linelight》編輯器里,你可以在玩游戲的時候進行編輯,因此使用起來很方便。
實際上,一開始的時候,我做了幾個關卡,但并沒有意識到需要做編輯器,我最開始設計關卡都是用代碼寫出來的。隨后,我意識到必須打造一個關卡編輯器,這剛好與《Scalea》相反,那時候我是先做了關卡編輯器,然后增加了很多并不需要的功能,雖然學到了很多東西,但那并不是有效率的做事方法。
這個編輯器打造用了大約一個月的時間,整個游戲用了一年半,但這個關卡編輯器帶來的結果是巨大的,快速迭代是非常好的,因為我只做自己需要的功能,甚至有些東西是Unity默認的。開始的時候我想著隨后把它做的更漂亮,但后來我發現既然行之有效,那就沒有必要做的多么漂亮,因為并不值得。
《Linelight》的地圖編輯器也同樣復雜,而且里面增加了很多的功能,這些是我在研發過程中逐漸加入的,接下來我會用具體的關卡來展示一些功能。
設計師標示
這是我在幾年前做的,也是為《Linelight》設計的,隨后也用到了其他一些游戲之中。這五個標示是我希望在關卡中使用的,每個關卡都有標示,你可以點擊icon切換,它直接可以在編輯器中使用。我很喜歡這個系統,它的表現非常好,因為關卡是處于不斷變化中的,一直要重新調整這些關卡,有了標示之后,我就不用記住對每個關卡的想法,因為這些標示已經存在。
這個系統用了我5個小時完成,但它帶來的結果是非常優秀的。
Prop Display
這是一個與設計師標示相似的東西,它展示了地圖上的一些內容。我的目標是讓地圖資源在研發進度中實現視覺化,展示這個房間里存在的游戲機制,比如圖中白色的標記,我希望能夠直覺看到一個區域里的游戲流程。
不過,這個系統最終幾乎是很少使用,我本以為它可以帶來很大幫助,但結果并沒有奏效。我用了3個半小時做這個系統,但結果幾乎一點用都沒有。當然,這也是學習過程的一部分。
《Bouncemeister》
我們先來看看這款游戲長什么樣:你控制角色Jetta進行跳躍,到達出口即可通關。
這是《Bouncemeister》地圖編輯器,你可以把地圖的任何一段拖走、改變位置,它們會自動連接起來。
它還可以自動找到布局問題,如果某一塊地圖無法與其他區域連接,就會被標注出來,這對我而言是非常有用的。做了很多的關卡之后,還可以按住shift鍵輸入名字,搜索具體關卡。還有一個功能是shift+鼠標點擊,可以選擇所有連接起來的房間。
我們再來看《Bouncemeister》房間編輯器,它直接使用了Unity編輯器,所以在研發過程中可以直接看到游戲內實際效果。它有一些優勢,這個編輯器是已經存在的,我不需要再做一些額外的功能,比如回撤或者重做,尤其是多選、多個物體移動或者多個目標規模化的時候,比自己做編輯器方便很多。
不過,這種方式也有些不利之處,比如,你需要單獨的視窗看到游戲玩法,而不是直接在游戲里編輯,我很不喜歡這一點,因為它會讓編輯器當中的一切都看起來很小。另外,對于一些不適應的Unity功能,我還需要找到如何變通的方法。
接下來看看這個房間編輯器里的一些功能:
吸附到網格線(snap to grid),這個功能很棒,它的代碼也很簡單;
自動旋轉尖刺,這個功能也很不錯,隨后還會提到該功能,簡而言之,當你把尖刺拖動到某個表面,它的方向就會自動適應其方向。
自動延展層次體系,如圖,如果要手動展開這些層級目錄,我需要三次點擊、耗時7秒才能看看到所有內容,而使用了自動延展代碼之后,就可以立即看到這些內容,這節約了大量時間。
還有一個功能是鍵盤快捷鍵,圖中展示了一些快捷鍵,在關卡之間切換很好用,這樣的快捷鍵有很多,但我們沒時間逐一介紹。
展示房間連接錯配的線框(小工具),黃線處展示的是打開的其他房間,這樣,我不用頻繁回到大量的關卡,就可以知道哪些關卡的房間連接出現了問題。
《Music Story》
另一個是我做的《Music Story》,不過這個項目從未發布,它停留在了概念階段。游戲的想法是通過選擇的方式展示音樂劇情,所有的文本都與你聽到的音樂有關,并不是一個很有趣的挑戰。
我希望用一個無障礙系統將支線故事與音樂編組并連接起來,但這是一個很困難的挑戰,我希望可以快速創作內容,而不必擔心內容創作需要投入很多工作量,結果證明這是一個噩夢。我一開始就做了嘗試,但非常耗時間,我的目標是快速實現想法。
從圖中可以看到,我直接將很多數據寫入了代碼中,希望它能夠直接寫出對應的對話文本,這的確可以將音樂與文本匹配,但我覺得結果給人的感覺還是非常奇怪,結果還不如自己直接做分支劇情。
《Combi》
這是一款休閑手游,我們希望為它做1000多個關卡,然而我們只有三周的時間完成,這是非常不切實際的,而且我還是這款游戲唯一的開發者。考慮到游戲規則,程序化關卡生成會變得非常復雜,因此我不得不手動制作。
投入了2小時制作關卡之后,我感到壓力很大,因為這么短的時間根本不可能做出那么多的關卡。所以,我給自己的手機做了個編輯器,如圖:
首先,我們生成一個完全隨機的關卡,帶有可調節的參數,在游玩過程中可以手動編輯,你可以控制關卡中的內容,也可以完全去掉某些東西,還加入了保存關卡選項。最后,一個關卡制作只需要45秒左右即可完成,包括那些需要幾分鐘才能完成的高難度關卡。
我可以在醒來之后做關卡,可以在地鐵通勤路上,或者睡覺前,都可以隨時隨地編輯關卡,而且不會影響我的工作計劃。
這個關卡編輯器總共用了3天時間,它帶來的結果是拯救了我的精神健康,如果沒有這個編輯器,1000多個關卡可能會讓我手忙腳亂到崩潰。
什么時候適合做工具?
我的建議是,先“侵入(hack in)”內容,做一些實際的內容,讓關卡做到可玩。一旦有了可玩內容,你就會知道你需要或者不需要什么工具,提前做這些工具,除非你不知道,否則提前準備總不會有錯。
比如,之前的《Linelight》案例中,我用代碼寫了一些關卡,主要是希望測試游戲的可行性,最終成為了《Linelight》關卡編輯器。
你可能會浪費比想象中更多的時間。
所以,我的建議是先搞清楚你的偏好是什么,然后對此提出質疑,比如,你是否不慌不忙?如果不介意做重復動作,那么專門做工具是否有必要?或者,如果你希望提升效率,在想到的時候就去打造一個工具?
假設你不慌不忙,這時候要了解重復動作或者等待工具完成會浪費多少時間,比如,大量重命名/編輯文件,而且每周要做兩次以上。或者,需要離開鼠標、目視遠方一段時間,這種情況也會發生;或者,每次代碼編輯都需要等待15秒以上重新編譯,那很可能有方法節約時間。
另外,挑戰你的沾沾自喜,節約時間可能比你想象的容易很多,有些任務節約30%的時間可能并不需要投入很多精力。
如果你和我一樣,希望提升效率,我的建議是先做一些內容,然后看是否需要做一個工具,而不是反過來先做工具。因為,游戲設計很可能會發生變化,你做的工具越是具體化,那么它被淘汰的概率就會越高。
這就涉及到沉沒成本悖論,假設你為XYZ做了一個工具,對于開發者或者游戲策劃來說,砍掉或者改變XYZ功能就會越困難。比如,某些功能應該被砍掉,但由于做了工具,你可能并不會那么做,但這對游戲并不是正確的決定,如果不事先做工具,就可以避開這種情況。
我投入工具制作的門檻,是在沒有工具的情況下,到底會帶來多大的麻煩。我首先會嘗試在沒有工具的情況下研發,如果一件事不斷地讓我覺得煩躁或者效率很低,或許就會考慮專門做一個工具,當然,也有些時候并不會這么做。
隨后,我會思考的是,做一個工具可能需要多久、做出來之后能夠為我節約多少時間?
一個比較有代表性的案例就是前面我們提過的尖刺旋轉,在《Bouncemeister》當中旋轉一個尖刺需要選定目標、選擇旋轉角度,游戲里有很多的尖刺,這個過程會帶來很大的麻煩。
這種情況持續了幾周,然后我問自己,加速這個過程最簡單的方法是什么?我可以ctrl+R控制它旋轉90度,這需要我投入15分鐘。
這種方法更好一些,但依然感覺很笨拙。隨后我又問自己,做到自動旋轉尖刺需要多久?答案是可能需要2小時左右。那么,我是否想要為它做編程呢?這當然是有意義的。
我為它用掉了一個半小時,最終也為我節約了大量時間。一次旋轉只需要10秒左右的時間,如果每天要做50次旋轉,這意味著每個月我只需要投入3個小時,而且讓關卡設計流程更加流暢。
用90分鐘的時間,換來這樣的結果,當然是非常不錯的。
這是我給錯位房間設計的另一個工具,如果放大來看,可以看到這些房間之間實際上并不匹配,這是個問題,因為你很難直接看到。所以,我希望增加一個功能,能夠凸顯這些錯誤,讓你知道需要解決這個問題,這對游戲策劃很有幫助。
于是我問自己,是否想要增加這個功能?答案是否定的,因為這個問題帶來的麻煩并不是很大。所以,最終我沒有增加這個功能。
那么,對于這些情況,是否有正確的答案呢?顯然沒有,因為游戲研發本身就是一團亂麻,每個人都有自己的梳理方式。
不完整的工具
我做了很多不完整的工具,畢竟,我們的目標是節約時間,而不是做一款神奇的工具。比如,《Linelight》編輯器有很多的bug,比如,打開一個關卡需要快速點擊2-10次,有些關卡的rect bounds還是錯誤的,而且,連接不同關卡依然需要手動實現。我并沒有去解決這些問題,因為沒有那個必要,這些問題可能會浪費時間,但為此專門做工具所節約的時間并不值得。
最后,我復制了《Bouncemeister》很多的代碼,解決了很多問題,所以,這并不一定是最好的答案。
Unity代碼快捷方式(code shorts)
需要聲明的是,這些快捷方式僅適用于Unity研發,其中很多的東西都是我這么多年研發經驗積累的。它們當中很多都被我復制到了新項目里,都可以節約一些時間,你們不一定需要直接照搬,但可以作為啟發,也可以節約很多時間。
如果感興趣,可以到圖片上方的鏈接下載并使用這些快捷方式,我這里也會舉一些例子。比如每次腳本刷新都需要重新加載場景,在Unity當中,如果重新編譯,整個項目有可能會崩潰。基本上,屏幕中的這些代碼,就可以起到作用,至少對我來說,不必在每次改變之后停止或者運行項目,就可以自動重新加載場景。對于開發者來說,這些代碼至少可以為每次改動節約10秒鐘以上,尤其是對于比較大的項目來說,它節省下來的時間更多。
吸附到網格線,這是它的代碼,非常簡單,而且實用。
我還做了很多結構體(struct)用于不同項目,比如Color255.cs,ColorHSB.cs,都可以節約大量時間。還有Vector2Int.cs,基本上每款網格游戲我都會用到。
GameUtils.cs幾乎用在了我所有項目中的靜態類(static class)當中,它可以用到大量的常見函數當中,比如按像素設置SpriteRenderer大小,設置UIGraphic alpha、改變粒子系統屬性、設置編輯器鏡頭位置等等。
MathUtils.cs與上面的快捷方式很像,它可以返回隨機bool,還可以合并兩個矩形、讓一些小數點位數變成整數。Vector2有些功能是沒有內置的,比如絕對值、最大值、最小值等等,不過MathUtils.cs可以做到。
總結
我的第一個建議是避免籠統的工具。你可能想要一勞永逸,做一個工具、然后運用到所有新項目之中,個人認為,不要這么做,最好是為你的游戲做特別的工具,比如《Linelight》編輯器就是專門為這款游戲打造的,而且只需要幾個小時就可以完成。實際上,其中的一些代碼還可以用到其他具備類似功能的游戲中。
如果工具給你的感覺是“不完整”,沒有關系,因為它大概率會和游戲給你的感覺一樣不完美,你總會有更多東西想要加入到游戲中,所以不完整也沒關系。
犯錯也是可以接受的,因為這不過是另一種學習方式,也是生活的一部分。
優秀的工具可以讓游戲策劃處于最佳狀態,所以工具不僅是節約時間,還可以讓游戲設計更加流暢。我建議同行們認真檢查自己的流程,然后發現在哪些地方浪費了時間,如果你發現自己經常重復一些動作,這時候最好是做一個工具;如果只是自己喜歡增加工具,那么我建議先做一些內容,然后看是否需要為之做工具。
另外,定制工具還可以提升你對編程的興趣或者熱情,比如我就對編程越來越感興趣,這個建議不只是針對Unity,而是適用于所有引擎,以上就是今天分享的全部內容。
····· End ·····
GameLook每日游戲產業報道
全球視野 / 深度有料
