游戲測試·關(guān)于GM的碎碎念


碎碎念
游戲測試過程中,使用GM(GameManager)是再正常不過的一個操作。
測試用GM功能與魔獸爭霸在全局聊天輸入"Who Is Your Daddy",GTA系列調(diào)出控制臺輸入各種CheatCode的功能相比,本質(zhì)上沒有區(qū)別。

他們令游戲內(nèi)容的執(zhí)行變得更加簡便,繼而提升整個游戲表現(xiàn)效率。作為一個玩家,使用GM或是各種作弊方式,多數(shù)是為了更加新鮮、爽快甚至獵奇的體驗(yàn);而作為一個游戲測試或者游戲開發(fā)者,GM只是在測試調(diào)試過程中,為了繞開紛繁復(fù)雜的交叉邏輯或避免機(jī)械化的操作而做的金手指。
別再覺得咱們是在玩游戲了~ QAQ
在接下來的文章里,我主要的內(nèi)容是談?wù)勛约簩M指令的見解以及項(xiàng)目過程中的經(jīng)驗(yàn),而不是游戲安全方面(作弊/反作弊)的睪端話題,所以對游戲安全感興趣的同學(xué),讓你們失望了,是小王太弱了!

GM的應(yīng)用場景
GM主要的應(yīng)用場景,主要可以分為兩類:1.游戲開發(fā)場景;2.游戲運(yùn)營場景
以下是針對應(yīng)用場景的分析腦圖,拋磚引玉:

開發(fā)環(huán)境
針對開發(fā)環(huán)境,GM的主要目的是為了便于游戲的功能驗(yàn)證和調(diào)試。
所以當(dāng)使用GM時,測試人員必須是確認(rèn)GM并不會影響自己的測試需求。比方說:本次測試需求本身需要驗(yàn)證通過“新的交互功能流程”,完成任務(wù)獲獎。這時候你再去用GM指令直接完成任務(wù)并獲獎,就不對了。
大家可能會覺得這也太笨了。這個例子本身有些極端,而作為測試,你需要風(fēng)險(xiǎn)意識,不僅是對開發(fā)人員,開發(fā)過程,甚至是你自己。扯遠(yuǎn)了。
介于GM指令的特點(diǎn)(集成各種游戲操作,可以繞過正常游戲流程繁瑣的邏輯限制),關(guān)于搭建游戲的自動化測試,為了實(shí)現(xiàn)玩家的各種自動化行為,很大程度上可以依賴GM功能。
運(yùn)營環(huán)境
而針對游戲運(yùn)營場景,GM功能更多的是去支持網(wǎng)絡(luò)游戲在營期間針對玩家們的一些公共行為。比方說違規(guī)行為的禁言,封號,周期更新的全局郵件獎勵,以及針對可預(yù)測的游戲事故做一些技術(shù)或運(yùn)營層面的應(yīng)急處理功能。這方面主要會讓服務(wù)器程序及運(yùn)維等職能去實(shí)現(xiàn)。

GM使用方式
說完了GM的應(yīng)用場景,再來給大家介紹一下GM功能主要使用的一些方式
①控制臺指令執(zhí)行
這種方式是游戲測試職能的常用GM使用方式,也是我個人比較習(xí)慣的使用方式。
簡而言之,這種執(zhí)行方式就像是文章開頭所說的“WhoIsYourDaddy”,在游戲測試環(huán)境下,打開特殊的控制臺。輸入設(shè)定好的指令“WhoIsYourDaddy”,即可你操控的單位即進(jìn)入人擋殺人佛擋殺佛的狀態(tài);或是像最基本的AddItem,加上物品ID和數(shù)量,AddMoney等等顧名思義的指令,在游戲測試過程中再稀疏平常不過。
指令執(zhí)行的好處是:一旦你熟練使用,介于指令的靈活屬性,你能輕松地定義和執(zhí)行更多且復(fù)雜的GM參數(shù)和操作。在開發(fā)環(huán)境甚至你想要實(shí)現(xiàn)的游戲環(huán)境下,你就像一位全能的法師,不斷地吟唱著各種咒語讓你在游戲內(nèi)呼風(fēng)喚雨。


②集成按鈕執(zhí)行
某些項(xiàng)目或是情況下,集成按鈕執(zhí)行也相當(dāng)受歡迎。
因?yàn)樗訜o腦,只要你會調(diào)出控制臺,然后認(rèn)識控制臺按鈕的文字并且點(diǎn)擊按鈕即可實(shí)現(xiàn)你想要的操作。
按鈕執(zhí)行幾乎是開發(fā)環(huán)境下能夠做到的最傻瓜的GM執(zhí)行方式
它很方便,你甚至不需要去背指令信息,只要你能夠理解按鈕上寫的是啥!
但是當(dāng)指令量變大,或是想要去定義更加復(fù)雜的GM內(nèi)容時,控制臺琳瑯滿目的按鈕就變成了累贅,按鈕難以支持個性化參數(shù),你不得不針對各種新的參數(shù)需求去反復(fù)的添加冗余的按鈕。在這時指令執(zhí)行的優(yōu)勢便體現(xiàn)出來了。


③WEB端搭建GM平臺
在WEB端搭建一個功能完備且使用便捷的GM平臺,通常是為了不熟悉游戲開發(fā)環(huán)境運(yùn)營職能者而開發(fā)的一個運(yùn)營向GM平臺。在此不贅述。既然到了WEB端,你可以把它作為一個新的工程對待,只是這個工程需要與游戲工程的內(nèi)容相互對接。
在網(wǎng)易工作經(jīng)歷時,有位服務(wù)端大佬似乎是一個人搭起了當(dāng)時參與的項(xiàng)目的完整GM平臺(不限于運(yùn)營向的功能,開發(fā)用了都說好),相當(dāng)牛逼。比如:對應(yīng)服務(wù)器/客戶端實(shí)時LOG,玩家信息查詢,GM執(zhí)行平臺,客戶端鏡像等等。

GM指令執(zhí)行框架開發(fā)經(jīng)驗(yàn)

簡單介紹下背景
服務(wù)器和網(wǎng)絡(luò)這塊的知識過于貧乏,我做不到如大佬完整的搭建起一個強(qiáng)大的GM功能平臺的行為
不過最近因?yàn)楸娝苤脑?,得以接觸新項(xiàng)目的GM功能,并且嘗試進(jìn)行了一系列客戶端工具級別的優(yōu)化。
項(xiàng)目主要是基于Unity插件SRDebugger的Console,制作一系列GM按鈕,按鈕執(zhí)行各種GM/調(diào)試功能,在我用時我已經(jīng)覺得按鈕令人眼花繚亂;雖然也支持指令輸出,指令是用Switch..Case去判斷執(zhí)行的,且指令只支持客戶端GMRPC相關(guān)的功能,指令相當(dāng)稀少??傊陀X得沒有之前的好用,也不便于擴(kuò)展(習(xí)慣用那套東西了....罪過)。所以以此為理由,下定決心,嘗試做一些優(yōu)化,幾乎沒有對工程插件以及舊有代碼進(jìn)行刪除或改動,而是在此基礎(chǔ)上去優(yōu)化一些代碼邏輯,便于指令執(zhí)行以及之后的GM功能拓展。

對比
簡單介紹一下優(yōu)化前的GMConsole情況:

SRDebugger插件本身是一個功能很強(qiáng)大的Unity Console插件,可以利用這個Console快速了解當(dāng)前硬件的基本信息(System),獲取實(shí)時的客戶端LOG(Console)以及客戶端性能數(shù)據(jù)(Profile),同時支持在Console內(nèi)部自定義Console界面及功能(Options)
插件文檔:http://www.stompyrobot.uk/tools/srdebugger/documentation

當(dāng)時已經(jīng)定義好的GMCommand類放置了各種GM功能,但絕大多數(shù)都使用按鈕去執(zhí)行,按鈕量已經(jīng)遠(yuǎn)遠(yuǎn)大于上面的圖的數(shù)量,說實(shí)話這個廣告圖的按鈕已經(jīng)看得我有些不適了。
雖然支持指令執(zhí)行,但指令執(zhí)行時,指令執(zhí)行的區(qū)域同樣是混在這一群按鈕中間。

而在優(yōu)化后,我重新梳理一下代碼以及交互的邏輯及表現(xiàn):

首先,通過新建GMAttribute和GMUtils類徹底解放switch..case模式下,理論上無止盡的case數(shù)。
利用C#反射機(jī)制,在GMUtils中進(jìn)行:
1.分析并整理GMCommand整體信息
2.分析玩家指令,并處理指令信息
3.根據(jù)分析情況決定實(shí)際GM的執(zhí)行邏輯和表現(xiàn)
GMCommand專心的去做GM相關(guān)的功能細(xì)節(jié),可以支持GMRPC的協(xié)議發(fā)送,也可以支持純客戶端的一些操作,GM功能、GM指令以及自動化測試之間變得更加的靈活
對SROptions的界面使用/排版也進(jìn)行了優(yōu)化,指令執(zhí)行可以獨(dú)立于整個Option界面外,相對的更加的整潔且易用,也根據(jù)SRDebugger本身支持的功能盡可能優(yōu)化指令的執(zhí)行方式。


實(shí)現(xiàn)的新功能
滿足多參數(shù)指令(基本功能優(yōu)化)
“指令 + 空格 + 正確的參數(shù)1 + 空格 + ..... + 正確的參數(shù)n”的指令格式,選擇發(fā)送指令,即可執(zhí)行需求的GM指令操作(優(yōu)化,正則做的比前人稍微復(fù)雜一丟丟罷了)
增加新的GM指令的行為本身變得更EZ了,繼續(xù)吐槽Switch...case的局限性
參數(shù)均為可選參數(shù)(存在默認(rèn)值)時,可以不輸入?yún)?shù),直接執(zhí)行帶參數(shù)的指令
GM指令可以重載(P.S:重載時同參數(shù)數(shù)量但參數(shù)類型不同的情況,目前不支持,不要這么做QAQ,也不支持大小寫不同導(dǎo)致的重名重參,簡直痛苦。)
在Unity環(huán)境下,Ctrl+G可以在本地桌面生成并打開一份當(dāng)前工程最新版本的“GM指令文檔.html”,即便不記指令,說明書總會用

缺陷,或是仍待優(yōu)化的點(diǎn)
由于SRDebugger的功能局限,難以實(shí)現(xiàn)用戶輸入智能匹配的功能。所以為了折中,目前支持追溯前十條發(fā)送過的功能。
重名重載相關(guān)的BUG點(diǎn)
可以考慮向大佬學(xué)習(xí),搭建平臺?估計(jì)得請服務(wù)器吃飯了,所以是我想多了QAQ.......
大家可以幫我想想,寫了好久,有些沒耐心了。就這樣吧。
唯一能確認(rèn)的則是自己的渺小。以上均為拋磚引玉,甚至微不足道的一些工作經(jīng)驗(yàn)之談。
