理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?

遊資網發表於2019-11-19
理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?

作者:盧克·麥克米蘭(Luke McMillan)

前言

作為本系列的開篇(理性設計手冊系列),本篇的內容對於理性關卡設計理論來說,具有著極為重要的意義,請耐心閱讀 --編譯者Katana

正文

設計是高度個人化的一項工作-我對此沒有任何異議,並且我已經看到許多獨特且多樣化的設計方法。過去困擾我的是看起來像某種圍繞著有效設計實踐的神祕主義。"禪系”(Zen)設計理念來源於音樂創作的背景之下,規則和啟發佔據了主導地位。這對我而言卻並不適用,尤其是當你考慮到這些“胡說八道”的理論將可能帶來相關的財務風險時,Dan Cook,Raph Koster,Joris Dormins,Steve Swink,Ernest Adams和Jesse Schell(僅舉幾例!)已經在將“鍊金術”轉變為科學理論的道路上取得了重大進展。這種理解遊戲的新方法,其分支之一是Rational Design(即理性設計)或者Rational Level Design [RLD]。我以前在這裡寫過一些關於這個概念的文章,但是從一開始我並沒有公開地發表過任何文章。

我本來最初的目的是把這一切理論都整合編寫成免費開源的教科書,命名為“ The Rational Designers Handbook”(即理性設計師手冊)。後來我改變了主意,決定將自己的工作手冊變成一系列在Gamasutra上的部落格文章。這樣,我可以讓其他的遊戲開發者、學者和教育工作者自行選擇、共同創作。因此,這裡是理性設計師手冊的第一部分-導論。

什麼是理性的關卡設計(The Rational Level Design) / RLD?

理性關卡設計(RLD)是一種客觀地量化使用者體驗元素的方法,目的是創造一致的遊戲體驗。RLD最常用於理解各種遊戲元素如何影響難度。由於難度在確定使用者體驗中起著重要作用(憤怒和無聊之間的不穩定平衡!),因此我們可以使用RLD中的目標——數字驅動系統來打造使用者體驗。雖然RLD現在不僅僅用於建立遊戲關卡,但RLD標籤已經被定義,被用來描述使用這種資料驅動方法的設計活動。

我們為什麼要使用RLD?

RLD最常用於具有重大財務責任的專案中,或者是有多團隊合作的專案。儘管RLD是基於一組客觀的度量來構建使用者體驗,但它在大型生產環境中的廣泛使用,很大程度上是為了降低風險的結果

在RLD中,遊戲元素的修改和建立是基於對使用者資料的觀察和數學回歸方法建立的近似值。RLD的主要優點是,它通過量化通常被認為是過於無形或抽象而無法用傳統方法表示的生產過程,將設計師團隊聯絡起來。

對學生和那些學習設計的來說,RLD還是一個有效的工具。與“禪系”設計不同,禪系的設計更傾向於經驗和直覺,而不是具體的度量。而RLD方法提供了一個框架和流程,可以幫助有效減輕設計中的某些奧祕(黑盒)。許多采用RLD方法的設計師最終將其概念融入到自己的設計風格中,並創造出一種Zen/RLD的混合體,這種混合體由經驗告知,由邏輯推進。

行業工具&必備知識

RLD受益於這樣一個事實:即實現它所需的許多工具都是現成的,有時是免費的,而且通常都有完整的文件記載。儘管一些大型發行商和開發者已經開發了他們自己的內部工具,但是你也可以實現自己的RLD Pipeline

  • 網格紙(是的,我說紙!)
  • 尺子,筆,量角器,三角尺,科學計算器等
  • 某種型別的電子表格應用程式

除了工具之外,對數學的良好理解也將大有幫助。

本文的目的&RLD手冊的後續更新

本文(和後續文章)旨在為希望將RLD用作其自身設計過程一部分的人員提供參考。本系列涵蓋RLD的許多示例,以及它們是如何作為開發和分析工具來實現的。重要的是要注意,本系列文章是遊戲設計的廣泛知識體系的一部分。在整個系列中,你將看到其他來源的連結和參考。我強烈建議你能花時間閱讀這些作者的作品。最重要的是要承認設計過程通常是非常個人化的,你最終需要選擇最能引起共鳴的模型和結構。

流程和“不固定”的東西:我們如何建立難度編號?

要了解我們如何在RLD流程中建立難度編號,我們需要了解幾個主要問題:

  • 從數學上講,複雜度的線性增長往往會導致遊戲難度的指數級增長。可以認為這是你的RLD表格和玩家實際心理之間的聯絡,它們與這些表格的最終產品相互作用。
  • RLD始終是起點,並且設計中總會有一些無法用編號客觀表達的元素
  • 當編號失敗時,將朝著混亂的方向去建立有趣的遊戲關卡體驗


線性增長&指數難度

為了理解我們的RLD編號來自何處,我們需要仔細檢查第一點。線性複雜度,會導致難度呈指數級上升維數是此過程中使用的關鍵術語之一。從數學上講,維數是我們列舉一組修飾符(Modifier)的所有可能結果所需的空間維數

舉例來說,假設我們基於六面骰子的結果來建立遊戲。這個六面骰子將被視為我們的修飾符。從統計學上講,我們說六面骰子是一個概率空間,由六個結果組成。玩家可以擲骰子,並有六分之一的機會擲出任何數字。這種型別的“事件”只有一個維度,因為我們只需要一個軸就可以。雖然這有點平淡無奇,但我們的列舉看起來像這樣……(圖1)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖1

如果我們將遊戲擴充套件到包含兩個骰子(修飾符)的結果,那麼我們需要使用兩個軸來列舉一組事件(圖2)。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖2

在兩次擲骰子事件中,我們可以看到一個軸是如何修改另一個軸(一加一等於二),依此類推。我們還可以看到每次一個元素被新增到我們的設計中時,它是如何指數級增加玩家必須處理的潛在的排序結果。通過使用2個六面骰子,我們已經從6個結果變成了36個結果。不僅如此,通過新增一個額外的修飾符,某些結果出現的概率將變得更加複雜,這將會變的有趣起來。通過簡單地使用兩個修飾符,我們得到了一個更為複雜的概率空間:像總值為2或12的事件,變成了36分之一的概率事件,而總值合計為7的事件則變成了六分之一的概率事件。儘管線性增長的修改導致了概率空間呈指數級上升,人類有能力應對這些巨大的概率空間。許多人認為,這是我們在模式識別中找到這種樂趣的原因之一。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
我們可以用不同的方式將這一概念視覺化,其中一種方法是通過將玩家在任何一點(階段)上可能擁有的選項數量作為分支決策樹來考慮。在上面的圖片中,我們可以看到在任何一個階段(左)有三個選項比僅只有兩個(右)要複雜得多。

注:19.11.12日凌晨時,數值策劃群的一位群友所提到的關卡中的層次感便是由此而來,實質上是通過不同階段所面臨的概率空間來進行控制。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖3

圖3描繪了RLD問題——每當我們修改或新增一個元素到遊戲中時,難度的增長率不是線性的,而是呈現出指數級增長的趨勢,直到遊戲將變得完全不可能通過的程度。

建立我們的RLD編號

既然我們理解了複雜度的線性增加是如何導致難度指數增加的,那麼現在可以將其納入關卡設計的上下文(環境)中。假設你面臨一個跳躍挑戰,平臺之間的間隙呈線性遞增。此示例是使用預設的物理和控制元件型別在Unreal Development Kit(UDK)中建立的。在這裡,我建立了一個測試關卡來了解我的空間度量,即瞭解實際空間測量值與我作為玩家的經驗之間的關係。(圖4)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖4

在這裡我有四個平臺,我想在它們之間跳躍。每個連續的平臺都使用的是間隙的線性增加。在此示例中,我每次都將相繼的每個平臺通過16UU(虛幻單位/現實世界中的測量值大約為32釐米)[1]隔開。使用此空間測試,我將要求一組新的測試人員在沒有任何預先培訓的情況下在平臺之間跳轉。每次測試完成後,我都會記錄每個平臺上的失敗次數,當然我也會親自觀察這些測試,這樣我就可以將任意數字等同於玩家的經驗。這些型別的實驗真正有趣的是,你會發現失敗率始終會呈指數級增長,即使是在分離平臺中的間隙僅呈線性增長的情況下。

難度總是提升到指數增長點。當你試圖以圖形方式繪製資料時,這是最好的表示方法。基於這個準確的實驗,我發現十分之一的測試者在第一次嘗試時就沒有通過簡單跳躍。十分之二的測試者在第一次嘗試中沒有通過中等跳躍,十分之六的測試者在第一次嘗試中沒有通過困難跳躍。然後,這導致我建立了一個表格(圖5),有三個難度等級:簡單、中等和困難。然後,根據測試資料的失敗率為每個難度等級分配一個數字。“ RLD難度值”是每十次嘗試中的失敗嘗試次數。最困難的一種跳躍,現在被分配的難度是“六”,因為十次嘗試中有六次失敗,並且這種模式的延續遍及到我的表格。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖5

需要注意的一件重要的事情是,簡單的任務總是需要一些風險因素,並且難度在成為不可能之前是有限度的。(圖6)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖6

修飾符&尺寸

所以我們現在有了一組簡單的數字,可以用來設計跳躍挑戰。但是這些數字做出了一些假設

1.玩家將總是跳至處於相同水平高度的平臺上。

2.連續八次輕鬆跳躍的挑戰和一次困難跳躍的挑戰一樣困難。

從經驗中我們知道,事實並非如此。為了糾正這兩個問題,我們需要檢視我們的修飾符是什麼,以及它們的值應該是什麼。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖7

在此示例的上下文(環境)中,我們應該考慮的第一個修飾符應該是重力(圖7)。我們知道,在玩家將無法到達平臺之前,平臺的高度是有限的。我們也知道,平臺會有一個非常低的位置(Point),以至於玩家著陸時會因重力而導致死亡。通過進行空間測試,我們可以量化這些數字,並使用一些簡單的數學方法從這些點開始向後計算。

圖8是使用任何新遊戲引擎時應建立的沙箱環境型別的示例。這些環境將根據遊戲而變化,但是在第一人稱遊戲(UDK最適合這種環境)的情況下,你將需要一種方法來測試諸如奔跑速度,跳躍距離等內容。最重要的是,這些型別的測試環境對於瞭解遊戲的“感覺”是非常寶貴的。基於此互動,嘗試將感覺轉化為一個客觀的度量體系。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖8

UDK中建立的一系列跳躍平臺-我將使用的引擎。每組由九個不同的平臺組成,這些平臺逐漸增加高度和間隙的寬度。這個沙箱的目的是尋找出玩家可以做什麼的極限,然後將其用作我們的最大跳躍/(不可能跳躍)值,以此計算出我們的RLD度量

注:這裡要提及一下我所在團隊的編劇,與他合作製作關卡時,他通過數學方法的方式準確地計算出玩家的極限跳躍距離以及可跳躍高度,與此處所呈具有異曲同工之妙。此種通過計算基於玩家處所得數值驅動設計的方式,為建立一套客觀的度量體系打好了基礎。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖9

我們從最初的測試資料中知道,對於一個在不同水平高度的平臺之間跳躍的玩家來說,我們的RLD編號是什麼。我們知道,有十分之一的測試人員未能通過128UU跳躍,十分之二的測試人員未能通過160UU跳躍,十分之六的測試人員未能通過192UU跳躍(在上表中以紅色突出顯示)。基於此資料,我們現在知道,對於概率空間中寬度x高度的任何單個排列,我們都不應超過RLD編號為六的值。

在這一點上,您需要動手做一些數學運算-特別是我們需要使用我們擁有的資料,並找到最好的方法來插值丟失的資料。我們知道難度往往是指數級的,因此有理由認為我們應該考慮將指數迴歸作為起點。="http://www.xuru.org/rt/TOC.asp">可以在此處找到一套迴歸工具。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖10

使用該工具(圖10),輸入了每個點的資料。有時,你會發現需要嘗試多種迴歸方法,然後才能獲得可接受的誤差範圍。在這種情況下,指數迴歸不起作用,而對數迴歸則起作用。(圖11)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖11

現在我已經得到了一個公式來使用,然後我可以使用這個公式來插值一個序列中丟失的所有資料。當我將結果圖形繪製出時,可以看到我的指數級曲線開始形成。我們現在得到的是沿一個軸的每個排列的近似失敗率。現在,我們的任務是回到我們建立的空間測試中,並試圖找出每個序列的極限。就本示例而言,我們將使用6這個數字來表示最大值。)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖12 [2]

至此,你有兩個選擇,我將按照優先順序列出它們。

1.根據你對問題的理解插入剩餘值,但僅使用數字1、2和6表示從容易到困難 //即手動控制
2.使用迴歸工具以數學方式計算出這些值

儘管方法二在數學上是正確的,但它往往不能準確地反映出問題的心理影響。例如,當你跑到其中一個壁架上時,可能會出現懷疑、緊張、放鬆等內部狀態,從而扭曲實際結果。正是因為這個原因,我個人喜歡手動插值。同樣,這再次證明了RLD是設計中某些元素的一個很好的起點。從上表中可以看到,我發現高度的小幅增加並沒有真正使跳躍挑戰變得更加困難,直到我們接近64UU高。一旦確定了這些最高點,我們就可以定義任何超出限制的內容(用黑色突出顯示)或任何實際上不應視為風險的內容(即值小於1)。

對於類似的情況,你通常會發現你最終得到了一組模仿該模式的RLD編號。(圖13)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖13 [3]

你可以通過使用繪圖工具在試驗系統中對這些曲線中的每條曲線進行微調,也可以使用用於建立原始序列的迴歸工具。試錯法涉及在每個序列上實時繪製資料圖形,然後調整每個序列中的數字,直到獲得圖形化的斜率,類似於使用正確的對數迴歸方法建立的斜率

現在,如果你是一名設計師,並且對用於內插這些值的時候所用到的數學計算感到迷惑不解,那麼你需要聽聽我的講解,讓我來幫助你弄清楚這些值的祕密,信不信由你。

汽車售後ECU(電子控制單元)調整軟體通常具有表格系統,該表格系統將基於有限的資料集自動執行對數,指數和多項式迴歸!它們的工作方式通常與Microsoft Excel的線性迴歸工具相同,但使用的是經過修改的公式。最好的部分是,如果你計劃對你的RLD編號進行規範化,將其打入你選擇的調諧軟體中,它將為你提供相當完整的資料點集,供你進行調整!

任意的修飾符

在此示例的上下文中,我們需要考慮的最後一個修飾符是玩家到達檢查點之前所需的連續跳躍量。連續的步數越多,難度就越大-儘管有時很難找到一個客觀的來源來幫助我們為這樣的修飾符定義一個數字。與重力修正不同的是,在我們認為它是“不可能”的值之前,它可能是一個接近無窮大的數。在這種情況下,你需要使用任意的修飾符。即使這些數字是任意的,你也需要基於某種邏輯。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖14

在圖14中,我們有三個不同部分的跳躍挑戰。每個區域都被一個“安全區域”分割,玩家可以在這個區域休息並選擇進入下一個挑戰區域。作為設計師,我們需要一些方法來定義每個部分所採取的步數對難度造成的影響。由於每個安全區域的步數都可能會很長,因此選擇一個數字序列(在繪製圖形時保持一個相當一致的斜率)非常重要。實際上,可以從音訊工程領域獲得一個好的經驗法則。如果你有一個非常安靜的小提琴演奏者,你需要多少個額外的小提琴演奏者將音量加倍?這聽起來很奇怪,你大約需要十個小提琴演奏者才能使音量加倍!同樣的原理也適用於這個例子和對困難的感知。因此,你的數字序列應該是一個接近線性的發展(near linear progression)。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖15

在上面的例子中,我建立了一系列的修飾符,然後我將可以使用它們來修改跳躍挑戰中每個部分的整體難度。這些數字是以上面的小提琴例子為基礎的–當我們將某物乘以10時;我們大概將感知到的難度翻了一番。作為首席設計師,你將始終需要為這樣的系統指定一個上限,以便團隊中的其他人可以共享一套一致的遊戲空間開發規則。

數字心理學

有人認為RLD是一種過度解構主義、數學化和枯燥的遊戲體驗設計方式。當單獨使用時,似乎沒有任何型別的測試。這似乎是事實,但是當正確和一致地使用時,RLD在塑造使用者體驗方面則是一個強大的工具。困難在遊戲體驗中扮演著重要的角色,為了保持玩家的參與度,遊戲的設計應始終帶有焦慮的高峰和低谷,但是在這種“自然”的過程中意想不到的中斷則會是非常有害的。(圖16)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖16 [4]

RLD的製作經驗

既然我們對修飾符的影響有了清晰的認識,那麼我們就可以著眼於製作關卡中的元素-特別是跳躍挑戰。儘管RLD看起來像是簡陋和沒有價值的,但是有一個非常可衡量的心理因素可以使它正確(和錯誤!)。理想的遊戲體驗是,焦慮會隨著時間的流逝而增加,並且在設計中的元素沒有去破壞心流或者沉浸感。而難度對於這種沉浸感和心流具有最大的影響。當事情太容易時,我們往往會感到無聊,而當事情太難時,我們就會感到沮喪。通過使用RLD來打造我們的遊戲體驗,我們確保難度遵循這個久經考驗的真實公式。

為了展示遊戲體驗和通過RLD進行細緻的關卡構建之間的聯絡,讓我們繼續跳躍挑戰的示例。我們想設計一個有三個截然不同的部分的跳躍挑戰(圖17)。每個部分都有一個安全區域作為檢查點。我們已經定義了每個跳躍型別的RLD編號,首先基於使用者測試,然後通過數學回歸(以及更多測試)。我們還通過包含的另外兩個修飾符擴充套件了挑戰的維度:重力和步數。現在是時候拿出圖表畫出一個概念了。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖17

如果要在不帶修飾符的情況下繪製此示例的圖,那麼我們將得出類似於以下示例的內容(圖18)。我們面臨的挑戰很容易開始,但難度卻大大增加。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖18

通過只繪製一個修飾符,我們的圖形表明我們已經創造了一個突破性的挑戰。將焦慮/無聊標籤應用到該圖時,你可以看到我們如何走出流動通道並進入危險區域(圖19)。但是,我們錯過了這一跳躍挑戰的兩個重要修飾符。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖19

一旦新增了額外的修飾符,我們的圖表就開始更能反映玩家對挑戰的感知(圖20)。我們在挑戰的第二部分看到的極端峰值有所緩解。但是,挑戰的第二部分仍然存在問題。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖20

RLD總是一個修改和完善的過程。關於這一挑戰最明顯的事情是,中間區域在目前的形式下太困難了。我們需要回頭看看修飾符,看看我們能做什麼來解決這個問題。我們有幾個選擇,可以根據我們的指標使用;

1.縮小間隙

2.保持間隙不變並調整垂直度

3.減少步數

RLD的最重要元素之一是識別度量系統的優先順序。你將需要至少三個指標–主一級、二級和三級。指標之間的關係通常總是可傳遞的。也就是說,調整一級指標將產生最大的影響,並且將對二級和三級指標等產生級聯效應。

在這個挑戰中,如果我只是簡單地使用較小的跳躍(即簡單的跳躍),那麼我知道這很可能會改變挑戰,從太難變成太容易。然後我遵從我的第二個指標-垂直修正/重力修正。根據邏輯,要求玩家跳到較低的平臺會稍微容易一些。我們仍然保持相同的間距,但只需應用其中一個修飾符來調整數字。

注:指標這個詞語等同於度量

基於此邏輯,你可以使用之前建立的表來建立跳躍的組合,從而略微降低難度。在這種跳躍式挑戰的情況下,只需將每個連續的步調降低16UU,即可得到理想的結果(圖20)。重要的是要注意,我在繪製圖紙之前參考了表格並計算了實際示例。這是在預生產過程中進行RLD工作的好處–迭代變得更快,解決設計問題變得更加面向流程,而不是隨意的使用者需求評價過程。

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖21

當我們繪製最終結果的圖表時,我們得出了一個大大改進的難度分佈(圖21)。請記住,困難永遠是相對的-隨著玩家技能的提高,人們對什麼是(不什麼是)困難的理解也會隨之增加。儘管此圖顯示了跳躍挑戰進入焦慮區域的第三部分,但這應該是你的分佈大致所在的位置。

混亂與RLD的主要度量

混亂是當你從這個跳躍挑戰開始時,玩家對難度的感知發生的變化…(圖22)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖22

對此……(圖23)

理性關卡設計手冊:如使用RLD理論指導遊戲關卡開發?
圖23

在這兩種情況下,我們的跳臺都使用相同的高度和距離度量進行分佈,但是挑戰的表現形式是不同的,甚至可能是混亂的。

現在當我說混亂時,我的意思不是指雜亂無章或無序,隨機和無知的設計決策。在RLD的上下文中,混亂是指所有不能輕易以量化和客觀的方式來表達的修飾符(無論是遊戲還是玩家的思維,在遊戲體驗中都是顯而易見的)。儘管我們沒有量化這些現象,但是我們還是在RLD的過程中使用它們並加以考慮。換句話來說,混亂是RLD的一部分,我們不能用數字來表示它,但它仍然是玩家體驗的組成部分。

混亂元素的一個很好的例子是,考慮到美學在跳躍挑戰中對難度的感知所起的作用。我們可以在美學上以多種方式實現相同的跳躍挑戰。雖然我們可能會改變如何使用各種藝術手段來實現難題或挑戰,但數值難度和感知難度可能會有很大的不同。例如,難題或挑戰的一種實現可能會有震耳欲聾或者是無聲音訊,它們使玩家不知所措,而另一種版本則可能是相同的形式,通過音訊以外的藝術手段表現出來。

那麼哪一個更困難呢?

答案是,從RLD的角度來看,兩者都同樣困難。只不過單純從美學(每個人不同的審美觀點)上來看,其中一個相對於另外一個會更難一些。

在我的下一篇文章中,我將探討全域性度量的概念,以及我們如何解釋這些影響難度度量的“其他”元素。

注:


[1] The conversion between UU and real world measurements depends largely on how the underlying physics system has been written. Although many different games use Unreal Engine, the translation of UU to real world measurements varies slightly.
[2] The black sections indicate permutations that are off limits. In the case of Figure 12, this blacked out sections are impossible under normal circumstances
[3] Just like the example given in Figure 12, more sections have been blacked out in this table to represent permutations which are too simple to be considered a puzzle.
[4] This explanation of the “Flow Channel” is derived from Jesse Schell. The art of game design a book of lenses. Elsevier/Morgan Kaufmann, 1st edition, August 2008.

相關閱讀:

在遊戲設計中引導玩家 剖析2D射擊遊戲設計中的壓縮和漏斗理論


原文連結
https://link.zhihu.com/?target=https%3A//www.gamasutra.com/blogs/LukeMcMillan/20130806/197147/The_Rational_Design_Handbook_An_Intro_to_RLD.php
譯者專欄:https://zhuanlan.zhihu.com/p/91338673

相關文章