你好,歡迎來到川北在線
微信
騰訊微博
新浪微博
四個(gè)方面講解如何實(shí)現(xiàn)MMO中的技能系統(tǒng)同步
時(shí)間:2017-04-10 09:39   來源:游戲觀察   責(zé)任編輯:毛青青

  4月8日消息,在多人參與的MMO類大型游戲中,需要考慮到技能系統(tǒng)的同步問題。當(dāng)一個(gè)玩家釋放角色技能時(shí),其他玩家也會(huì)釋放其他或相同的技能,這時(shí)候如何協(xié)調(diào)好技能流程控制就非常關(guān)鍵,這回影響到玩家的游戲體驗(yàn)感。下面我們就來探討這一問題的解決方案。

  此篇文章基于之前文章介紹的技能系統(tǒng),主要介紹了如何實(shí)現(xiàn)MMO中的技能系統(tǒng)的同步。

  這里所說的技能系統(tǒng)包括:技能流程和技能創(chuàng)生體(法術(shù)場、彈道和buff)。

  首先介紹authority和proxy的概念,這兩個(gè)概念是基于單位unit的基礎(chǔ)上進(jìn)行的區(qū)分。

  authority表示單位的主控端,即此單位是由客戶端和還是服務(wù)端控制。對于玩家avatar,玩家本地的客戶端就是主控端。而對于怪物,他們的行為由服務(wù)端控制,主控端就是服務(wù)端。

  proxy表示代理端,表示被主控端控制。如對于怪物來說,所有的客戶端都是proxy;對于玩家A來說,服務(wù)端和其他玩家的客戶端都是proxy。

  0 技能同步的原則

  1.客戶端先行

  對于玩家控制的單位來說,玩家點(diǎn)擊按鈕釋放一個(gè)技能,客戶端首先響應(yīng),單位播放動(dòng)作以及相應(yīng)的技能特效。

 ≥我了解,有的已上線游戲并沒有做客戶端先行,而是所有的技能執(zhí)行請求都發(fā)給服務(wù)端,然后由服務(wù)端發(fā)起。

  這種模式技能流程控制會(huì)比較簡單,但是在網(wǎng)絡(luò)環(huán)境差的情況下,體驗(yàn)可能差一些。但是,目測也是可以接受的。

  2.技能流程以authority為發(fā)起端

  玩家單位技能發(fā)起是由她的客戶端,怪物的技能發(fā)起是由AI也就是服務(wù)端。

  3.技能結(jié)算在服務(wù)端發(fā)起。

  技能真正的結(jié)算,比如法術(shù)場檢測、buff結(jié)算、傷害計(jì)算以及扣血等,統(tǒng)一在服務(wù)端處理。

  1 技能執(zhí)行流程的同步

  這里所說的技能執(zhí)行流程指的是技能樹的一個(gè)執(zhí)行節(jié)點(diǎn)的流程。

  技能流程負(fù)責(zé)動(dòng)作、特效以及技能結(jié)算,其中技能結(jié)算包括:釋放法術(shù)場、彈道或buff。

  一個(gè)技能執(zhí)行節(jié)點(diǎn)的執(zhí)行流程中,需要同步的有兩個(gè)時(shí)間點(diǎn):

  技能開始:技能開始播放動(dòng)作

  技能結(jié)算:前搖結(jié)束,即能進(jìn)入結(jié)算邏輯。這類同步消息往往并不是由技能本身去同步,而是技能生成了法術(shù)場、彈道等,他們?nèi)プ鱿鄳?yīng)的同步。

  以玩家點(diǎn)擊技能按鈕開始釋放技能為例介紹技能同步流程,如圖所示:

  1.主控端點(diǎn)擊技能按鈕,技能開始播放動(dòng)作,主控端告訴服務(wù)端技能開始。

  2.服務(wù)端廣播給所有的客戶端(多玩家嘲),告知其他所有的客戶端此玩家開始執(zhí)行技能。其他客戶端收到指令后可是播放技能表現(xiàn)。

  3.服務(wù)端延遲一段時(shí)間后,服務(wù)端開始進(jìn)行技能結(jié)算,并且將結(jié)算結(jié)果通知客戶端。

  延遲時(shí)間=技能前搖時(shí)間-上行-下行,下行一半不能確定,所以默認(rèn)為上行=下行

  另一種中庸的計(jì)算方式是:延遲時(shí)間=技能前搖時(shí)間-上行,防止要求技能前搖時(shí)間過長

  使用此同步流程的表現(xiàn)為:

  1.要求技能前搖時(shí)間>2*網(wǎng)絡(luò)延遲,若前搖時(shí)間短,則延遲時(shí)間=0,效果可能差一些

  2.authority客戶端表現(xiàn)完美。

  3.proxy client表現(xiàn)一般,即玩家A看玩家B的效果為:玩家B剛開始執(zhí)行技能動(dòng)作,沒到前搖時(shí)間就進(jìn)行了技能結(jié)算。但是因?yàn)橥婕乙话阋膊粫?huì)過分關(guān)注其他玩家的動(dòng)作,所以是可以接受的。

  2 技能樹的同步

  我上篇文章 一個(gè)MMORPG的常規(guī)技能系統(tǒng) 已經(jīng)介紹,我們游戲使用的是技能樹來管理技能流程。那么就面臨一個(gè)問題,技能樹如何同步。

  最簡單最暴力的方式,是客戶端和服務(wù)端同時(shí)管理技能樹,并且將其狀態(tài)同步。這樣,客戶端和服務(wù)端的技能樹狀態(tài)統(tǒng)一、完備。

  后來發(fā)現(xiàn),對于proxy端,并不需要完備的技能樹信息,最節(jié)省的方式是proxy根本不接受技能樹同步信息,只是接受播放動(dòng)作、技能結(jié)算等信息。但這樣需要告訴其他proxy播放什么動(dòng)作、特效等。

  在我們系統(tǒng)中,技能同步包括三類同步消息:

  技能根節(jié)點(diǎn)enter (root_enter): 表示一個(gè)大技能的進(jìn)入。

  技能葉子節(jié)點(diǎn)enter(action_enter): 表示一個(gè)技能樹的執(zhí)行節(jié)點(diǎn)的進(jìn)入。

  根節(jié)點(diǎn)exit(root_exit) :表示大技能結(jié)束。

  根節(jié)點(diǎn)保存一個(gè)完整技能的信息,需要和技能模塊外部交互,因此需要知道技能的開始和結(jié)束。

  葉子節(jié)點(diǎn)的執(zhí)行代表著技能真正的執(zhí)行邏輯,也需要同步。

  而對于其他節(jié)點(diǎn),作為流程控制節(jié)點(diǎn),只需要在主端確保技能流程無誤即可

  后來這里進(jìn)行了進(jìn)一步的優(yōu)化,對于純根節(jié)點(diǎn),主控端(玩家控制的客戶端)將信息同步給服務(wù)端,服務(wù)端不再同步給其他客戶端。有的技能樹只有一個(gè)節(jié)點(diǎn),那么按照葉子節(jié)點(diǎn)的策略,主控端同步給服務(wù)端,服務(wù)端廣播給所有的其他客戶端!

  3 技能結(jié)算的同步

  技能結(jié)算包括創(chuàng)建法術(shù)場、buff、彈道、技能直接傷害等。

  法術(shù)場、彈道的同步

  法術(shù)場、彈道的同步比較類似,他們都作為一個(gè)entity(網(wǎng)絡(luò)同步單元)在服務(wù)端創(chuàng)建,創(chuàng)建以后使用entity管理機(jī)制服務(wù)端通知客戶端他們的創(chuàng)建和銷毀。

  以法術(shù)場為例,法術(shù)場的執(zhí)行和同步流程:

  服務(wù)端發(fā)起創(chuàng)建一個(gè)法術(shù)場,并且通知客戶端。

  法術(shù)場每隔一段時(shí)間結(jié)算一次,注意,法術(shù)場結(jié)算并不需要同步,每隔一段時(shí)間服務(wù)端執(zhí)行檢測邏輯,客戶端播放結(jié)算特效等。兩個(gè)邏輯互不依賴,也不要求時(shí)間一致。

  當(dāng)法術(shù)場結(jié)算時(shí)檢測到攻擊目標(biāo)時(shí),服務(wù)端計(jì)算攻擊傷害等信息,并將攻擊信息發(fā)給客戶端。

 ⊥戶端收到傷害信息,客戶端播放相應(yīng)的表現(xiàn),如法術(shù)場受擊特效等。此處還包括屬于通用模塊的跳字等。

  當(dāng)服務(wù)端的法術(shù)場時(shí)間到了進(jìn)行destroy時(shí),使用entity的管理機(jī)制通知所有客戶端destroy法術(shù)場。

  彈道的同步類似, 的區(qū)別就是法術(shù)場在某一位置使用攻擊盒檢測目標(biāo),而彈道是一個(gè)移動(dòng)的子彈,客戶端表現(xiàn)是一個(gè)特效在飛,而服務(wù)端每隔一段時(shí)間根據(jù)飛行速度等使用膠囊攻擊盒去檢測目標(biāo)碰撞。

  由以上可以發(fā)現(xiàn),法術(shù)場作為一個(gè)entity他的管理成本是比較高的,所以若策劃想出一些需求需要使用多個(gè)法術(shù)場實(shí)現(xiàn),一般通過拓展法術(shù)場功能使用一個(gè)法術(shù)場來實(shí)現(xiàn)。

  比如,策劃要做一個(gè)冰火兩重天法術(shù)場,即法術(shù)場在每次結(jié)算時(shí)使用不同的參數(shù),第一次結(jié)算使用火焰,第二次結(jié)算是冰霜。若這種需求較少,可以使用兩個(gè)法術(shù)場,但是如果要冰火雷毒水電風(fēng)魔奧術(shù)神圣*N重天,則代價(jià)太大。一般可以讓法術(shù)場支持每次使用不同的結(jié)算參數(shù)來結(jié)算即可。

  buff同步

  buff是附加在unit身上的東西(沒有unit就沒有buff,但是沒有unit可能有法術(shù)場),所以不需要使用entity來同步。

  服務(wù)端確定buff是否可以掛在unit上面。

 ⊥戶端和服務(wù)端都維護(hù)一個(gè)buff管理器,掛buff的消息通知所有客戶端,客戶端負(fù)責(zé)表現(xiàn),服務(wù)端負(fù)責(zé)結(jié)算即可。

  4 傷害、屬性的同步

  主要介紹下傷害的同步,順便附帶介紹下屬性同步。

  對于傷害結(jié)算來說,技能、buff、法術(shù)場和彈道都可能造成傷害,當(dāng)服務(wù)端發(fā)現(xiàn)造成傷害時(shí),服務(wù)端首先根據(jù)技能信息計(jì)算傷害值,計(jì)算以后將傷害信息發(fā)送給所有客戶端,所有客戶端接到信息后首先播放技能傷害相關(guān)的表現(xiàn),如受擊特效等,然后播放跳字等通用傷害客戶端表現(xiàn)。

  也就是說,傷害值的同步其實(shí)就是簡單的rpc消息。

  buff可能修改單位屬性,如攻擊力、攻擊速度等。這些屬性值的同步一般使用屬性同步,屬性同步的意思是當(dāng)一個(gè)值改變了,底層自動(dòng)把這個(gè)值同步給客戶端。

  血量等信息值都是用屬性同步方式。

  傷害計(jì)算和屬性模塊是一個(gè)重要且比較復(fù)雜的模塊(當(dāng)然,若游戲數(shù)值非常簡單也可以很簡單),后面我會(huì)寫文章詳細(xì)介紹這個(gè)模塊。

   投稿郵箱:chuanbeiol@163.com   詳情請?jiān)L問川北在線:http://fishbao.com.cn/

川北在線-川北全搜索版權(quán)與免責(zé)聲明
①凡注明"來源:XXX(非在線)"的作品,均轉(zhuǎn)載自其它媒體,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé),本網(wǎng)不承擔(dān)此類稿件侵權(quán)行為的連帶責(zé)任。
②本站所載之信息僅為網(wǎng)民提供參考之用,不構(gòu)成任何投資建議,文章觀點(diǎn)不代表本站立場,其真實(shí)性由作者或稿源方負(fù)責(zé),本站信息接受廣大網(wǎng)民的監(jiān)督、投訴、批評。
③本站轉(zhuǎn)載純粹出于為網(wǎng)民傳遞更多信息之目的,本站不原創(chuàng)、不存儲(chǔ)視頻,所有視頻均分享自其他視頻分享網(wǎng)站,如涉及到您的版權(quán)問題,請與本網(wǎng)聯(lián)系,我站將及時(shí)進(jìn)行刪除處理。



圖庫
合作媒體
金寵物 綠植迷
法律顧問:ITLAW-莊毅雄律師