蘋果手遊開發工具:GameplayKit使用指南

蘋果

【Gamelook專稿,轉載請註明出處】

Gamelook報道/在6月9日凌晨舉行的WWDC 2015大會上,蘋果宣佈iOS 9的同時推出瞭兩個非常重要的工具,分別是GameplayKit以及ReplayKit,從該公司的介紹中來看,這兩個工具對於iOS手遊開發者以及歐美遊戲視頻相關領域可能會產生比較大的影響。

簡單的說,GameplayKit就是一個幫助新手開發者們在OS X和iOS平臺創作遊戲的基礎工具和技術框架,可提供遊戲資源、模塊、玩法設計以及系統規則方面的內容,並不包括視覺渲染等功能。因此,可能對於有些資深開發者們來說,支持多平臺發佈、功能更為復雜的遊戲研發框架或許會更適合。

而ReplayKit的細節透露較少,在蘋果的官網,我們可以看到,玩傢們可以通過該功能在遊戲中錄制、編輯並在線分享遊戲,並沒有進一步的說明。

 

147

以下請看Gamelook整理的蘋果官方《GameplayKit 參考和編程指南》(由於篇幅限制,這裡僅翻譯概念部分,想瞭解實例請移步蘋果官網,還可下載樣本遊戲代碼):

第一部分:框架參照

提示:這是一個正在研發的API或技術的概要文件,蘋果公司提供這些信息主要是為瞭幫助你通過蘋果產品使用這些技術或者編程界面而做好計劃,該信息有可能會在未來發生改變,本文當中提到的軟件應該以最終發佈的操作系統測試和最終文檔為準,未來有可能會提供新版本的文檔信息。

GameplayKit是一個面向對象的框架(Object-oriented framework),為在OS X和iOS平臺打造遊戲提供基礎工具與技術。GameplayKit包括為設計遊戲功能而提供的工具、可重復使用的架構,還包括為創造和提高玩法功能而研發的技術,比如角色移動和敵人的行為設計等等。

初識GameplayKit

GameplayKit框架包含瞭一些獨立的分支系統,覆蓋瞭遊戲設計和研發的多個領域。

隨機化(Randomization):使用GKRandom協議、GKRandomSource以及GKRandomDistribution class,而且還有更多獨特的subclasses來增加遊戲玩法的不確定性,同時不需要以增加BUG調試量為代價。

狀態機(State Machines):使用GKStateMachine和GKState class打造模塊化的玩法系統。

Minmax Strategist:GKMinmaxStrategist class為回合制遊戲中的敵人提供AI設計,想要使用一個Strategist的話,你需要用GKGameModel協議以及相關協議來描述遊戲玩法。

尋路系統(pathfinding):使用GKGraph和GKGraphNode class以及它們的subclasses來為你的遊戲世界導航建模,並且為遊戲對象找到可以使用的路線。

代理、目標和行為:GKAgent class提供模擬功能你可以通過GkGoal對象為遊戲單位定制化移動行為規則,每一個class都為一個代理自動跟隨設計瞭高等目標。

規則系統:使用GKRuleSystem和GKRule class打造復雜的遊戲邏輯,包括模糊推理(fuzzy reasoning)以及應急行為。

第二部分:GameplayKit編程指南

GameplayKit是為iOS和OS X平臺做遊戲而研發的一系列基礎工具和技術,與更高級的SpriteKit以及SceneKit遊戲引擎不同的是,GameplayKit並不包含動畫和視覺渲染等內容。GameplayKit主要是幫助開發者研發遊戲的玩法並設計模塊化組件、用最少的努力做出可擴展的遊戲架構。

GameplayKit功能

打造、改善和維護一個復雜的遊戲需要非常好的遊戲設計。GameplayKit提供一個實體組件架構,幫助你設計可以重復使用的玩法代碼,並為解決復雜的面向過程的代碼提供一個狀態機系統(State Machine System)。GameplayKit還包含瞭一些隨機化的工具,可以為很多種玩法提供基本的資源。

創作一款優秀的遊戲還需要使用復雜的算法(algorithms)來解決很多常見的遊戲玩法問題。通過GameplayKit,你不再需要寫自己的算法,而是可以直接使用GameplayKit提供的資源,這樣開發者就有更多的時間專註於把玩法做到更加獨特。

比如,你可以使用Minmax Strategist功能為回合制遊戲打造AI系統、通過尋路功能為遊戲角色設計導航路線,為高等級的遊戲角色設置自動行走或者使用與代碼分離的規則系統並實現模糊邏輯推理(Fuzzy Logic Reasoning)。

由於GameplayKit在iOS和OS X系統中是獨立於高級遊戲引擎而存在的,因此你可以拿它與任何可以做一個完整遊戲的技術進行整合,比如做2D遊戲用的SpriteKit、做3D遊戲用的SceneKit或者使用Metal/OpenGL ES定制化的第三方遊戲引擎。對於畫質要求不高的遊戲來說,你甚至可以隻用GamePlayKit和(iOS裡的)UIKit或者(OS X中的)AppKit直接創作遊戲。

隨機化

遊戲中有很多玩法都是基於概率和機會。桌遊中玩傢用骰子決定移動步數、紙牌遊戲有洗牌的玩法、街機遊戲的敵對生物會在不可預測的時間出現、RPG遊戲裡的每一步動作都有成功或者失敗的可能、開放世界遊戲裡的背景角色會自然移動,這裡實在有太多太多的例子可以佐證。意想不到的驚喜可以讓一款遊戲變得更有趣,每一步都有變化的行為可以增加遊戲的重復體驗價值,模仿自然界系統的元素可以讓遊戲更加生動真實。

做一款依靠概率因素的遊戲,通常需要使用一個虛擬隨機數字生成器,或者說是隨機資源。然而,並非所有的隨機資源都是平等的,如果使用不當就達不到開發者的目的。在一款遊戲中打造優秀的虛擬隨機行為,你通常需要做到以下特點:

隨機性:一個隨機數字生成器應該產生不可預測的行為(至少看起來是這樣),但是,隨機性是怎麼衡量的呢?計算機化的虛擬隨機數字生成器是基於無序的有窮數列。最終,這個數列終究會發生重復,至於在重復之前可以生成多少隨機數字,完全取決於資源使用的算法。更重要的是,當用二進制來看生成數字的時候,有些數字甚至是可以預測的,當然這取決於隨機資源的算法。

遊戲性能:更為復雜的算法可以產生更多的不可預測性,但代價是更多的處理時間。如果你的遊戲為每一幀都使用多個隨機數字,並且需要保持60FPS的運行幀率,一個復雜的隨機源可能就會讓你的遊戲變得很慢,在選擇隨機源的時候,一定要衡量隨機性與遊戲性能的關系。

決定機制:高質量的遊戲都需要測試,但真正的隨機性會讓你很難創造一個特定的測試環境。一個隨機源(Random Source)應該在遊戲中為玩傢們保留表面上的不可預測性,但同時要允許多次重復之後的特定結果。決定機制隨機源對於聯網遊戲來說是必要的,你需要確保隨機遊戲玩法對於所有人都是平等的。

獨立性:由於隨機源是基於一個數列,所以下一個出現的數字一定程度上取決於已經出現過的數字。然而,一款遊戲通常包含多個隨機元素。比如說,如果一款遊戲在玩法和美觀方面都加入瞭隨機性,比如競技遊戲中,玩傢們的對手往往是隨即匹配的,而他們的角色可以在遊戲中選擇聊天對話,增加遊戲的獨特性。如果對話系統和已有的功能使用同一個隨機器的話,一名老練的玩傢或許就可以預測下一個對話框是什麼內容。

透明的分配機制:對於很多玩法中的隨機化使用來說,數字應該使用統一的分配機制,也就是說,所有人生成一個特定數字的可能性應該是相同的。而對其他用途的遊戲來說,這些隨機數字應該遵循特定的分配機制,比如說很多遊戲都加入瞭正常的分配機制,隨機的樣本經常會產生與平均值相近的數字。

GameplayKit包含多個隨機化的class,足以滿足開發者們的這些目標。

如何在你的遊戲中使用隨機化功能

GameplayKit中所有的隨機化class都是按照GKRandom協議,可以用最少的界面生成隨機數字,首先你需要選擇一個適合自己遊戲任務的隨機生成器:

在大多數情況下,你需要一些按照特定范圍固定分配的隨機數字對於這類任務來說,使用GKRandomDistribution就可以瞭。如果要定制化隨機行為同時保持統一分配,你可以選擇不同的GKRandomSource子類為GKRandomDistribution對象提供基本的隨機數值。

為定制化隨機數字的分配,請使用GK GaussianDistribution或者GKShuffledDistribution class。

如果你不需要特定范圍或者分配隨機數字,可以直接使用GKRandomSource subclasses。

你還可以直接使用GKRandomSource classes的一種來為一組數列進行隨機排序,比如為紙牌洗牌。首先,選擇你需要的隨機源對象,然後把數列放到隨機源當中。這種方法可以返回原數列的數字,不過是亂序排列。

實體和組件(Entities and Components)

和任何的軟件一樣,設計一款復雜的遊戲需要規劃一個很好的架構。隨著你的遊戲變得越來越大、內容越來越豐富,最初做樣本遊戲Demo時的一些決定可能會成為遊戲發展路上的障礙。GameplayKit可以提供一個讓你從一開始就可以重復利用的架構,把遊戲中不同的方面分隔開來。

在這種架構裡,一個實體指的是遊戲相關對象的類型總稱。實體可以代表對玩法非常重要的對象,比如玩傢以及敵人角色;也可以是隻存在於遊戲中很少和玩傢進行互動的對象,比如某個關卡裡的動畫裝飾。實體還可以是創意或者遊戲的UI元素,比如決定何處放置地方角色的系統或者管理玩傢角色裝備的系統等等。

一個實體隻有容納瞭遊戲組件之後才開始起作用,一個組件指的是處理特定而有限方面外觀或者行為的對象。由於一個組件的功能范圍是有限的,而且不隸屬於特定實體,所以你可以在多個實體中重復使用同一個組件。

狀態機(State Machines)

幾乎在所有的遊戲中,玩法相關的邏輯都高度依賴於目前遊戲的狀態。比如動畫代碼的改變可能取決於一個玩傢的角色目前在行走、跳躍還是站立。敵人的移動代碼可能取決於你為其所做的模擬決定,比如是否追逐較弱的玩傢或者躲開強大的玩傢等等。甚至你的遊戲在特定時間運行的幀率代碼更新也取決於遊戲是在進行、暫停還是在菜單或者過場動畫界面。

當你開始研發一款遊戲的時候,很容易把所有取決於遊戲狀態的代碼放到同一個地方。不過,隨著你的遊戲變得越來越復雜,單一的方法已經很難支撐進一步的擴展。

狀態機可以幫助你定義不同遊戲狀態下的規則,這些定義被稱為狀態機。然後,你就可以把相關的狀態和任意代碼聯系起來,可以在不同遊戲狀態下切換模式,使用狀態機管理代碼可以讓你更容易給遊戲中的復雜行為進行理性面對,狀態機可以用於你遊戲中的任何一部分。

Minmax Strategist功能

很多遊戲在視頻遊戲(Video Gaming)出現之前就已經非常流行瞭,尤其是桌遊,比如十五子棋、國際象棋、石頭剪刀佈以及Go等等,從邏輯意義上講都是遊戲。玩傢們想要在這些遊戲中獲勝就需要在每次機會中規劃好最佳的行動,考慮到對手的步驟。這類遊戲玩起來很帶感,不管對手是另外一個人還是電腦玩傢。

在GameplayKit中,Strategist就是AI的簡單形式,你可以為這類遊戲創造電腦對手。使用Minmax策略的遊戲使用的GKMinmax class和支持API應該具有以下特點:

順序性:每個玩傢都需要按順序行動,也就是說,玩傢們要輪流體驗。

對抗性:一個玩傢贏,就必須有其他玩傢(們)輸,這類遊戲的設計理念是,一個玩傢的每一步都應該讓自己離勝利越來越近,或者讓其他玩傢們離失敗越來越近。

可知性:玩傢們可以自信的猜測自己的每一步可以帶來什麼樣的後果,也就是說,玩傢們的行動是不取決於機會和概率的。

完美的信息:所有對於遊戲結果重要的信息必須始終對所有玩傢開放。比如,國際象棋的輸贏基於雙方在棋盤上的位置,不過大多數玩傢在大多數情況下都可以看到這些位置。如果有人在過程中藏瞭棋子的話,那麼就不是完美的信息瞭,因為一個玩傢的行動出現瞭未知因素。

尋路系統(Pathfinding)

在很多遊戲中,導航都是非常重要的概念,一些回合制遊戲要求玩傢們選擇通往目標的路徑,很多動作和冒險遊戲把角色放到一些迷宮當中,玩傢們必須揭開謎題才能實現玩法目標,敵方角色必須按照既定方式給玩傢帶來挑戰。決定如何設置遊戲迷宮、或者其他導航方面的過程就是尋路。GameplayKit為你的遊戲提供一系列的地圖以及尋路工具,你可以用來移動角色或者其他的遊戲組件。

使用GameplayKit尋路工具需要把遊戲中的導航區域描述為一張圖表,上面有不同的位置或者節點一個組件從一個位置到另一個位置的移動路徑是不同的。由於大多數的2D遊戲都比較適合,所以為這些遊戲做尋路系統是非常容易的。

代理、目標和行為(Agents, Goals, and Behaviors)

在很多種遊戲中,遊戲組件的實時移動都具有一定程度的自動化。比如玩傢可以在一個遊戲中拖動角色去特定區域,然後角色會自動行走並達到該地點。敵方角色可能會在圖中攻擊,計劃打斷玩傢的行動。同盟玩傢可以通過消息告訴玩傢,保持平行的距離。在所有的情況下,每一個組件的移動都可能具有現實制,所以遊戲角色依然可以實時移動和變換方向

GameplayKit中的代理系統可以提供有效的自動移動方式,一個代理意味著遊戲中的組件會按照時機的特點進行2D空間移動,比如尺寸、位置以及速率,當然也包括速率改變時候的阻力。一個組件的移動取決於其行動目標。

目標就是可以長期影響代理移動行為的目標。

行為和帶動一個遊戲組件移動的一個或者多個目標有關,比如,一個目標可能包含直接移動到一個點,路上避免所有障礙。當你把行為中的多個目標綜合起來之後,就可以為每一個帶來相關影響的目標分配權重。

規則系統(Rule Systems)

一些遊戲包含非常復雜的規則,比如回合制RPG戰鬥遊戲可能會規定對方角色抵達相同區域之後的反應,比如誰先手?是否可以相互攻擊?如果角色試圖攻擊或者與另一個角色互動的時候會發生什麼等規則。

有些最有趣的遊戲包括突發的行為,簡單個體之間的互動可以為整個系統帶來樂趣。

在GameplayKit當中,規則系統解決瞭這些問題。通過遊戲邏輯數據的對比,規則系統可以幫助你把遊戲分解為功能性、可重復使用性、以及可擴展組件,簡單的規則也可以到來復雜的行為。

GameplayKit包含兩個主要的規則系統打造class,分別是代表永恒狀態下的特定決定規則GKRule,以及決定一些特定方面狀態數據的規則GKRuleSystem。

Comments are closed.