從本章開始,系統(tǒng)學(xué)習(xí)Photon的網(wǎng)絡(luò)編程。PUN作為Photon對Unity定制化的網(wǎng)絡(luò)編程方案,得到了開發(fā)者的一致好評,因此,根據(jù)官方教程系統(tǒng)學(xué)習(xí)PUN是必要的,這樣可以加深對Unity網(wǎng)絡(luò)編程的理解,從而使用起來游刃有余。
文 / 丁建雄
圖 /
小白是單純?yōu)榕d趣而寫作的獨立創(chuàng)作人,如果您喜歡小白的文章,歡迎關(guān)注、交流、分享(引用請鏈接到本文)。
創(chuàng)建AppId,可以通過官網(wǎng)免費申請。這樣,我們就得到了一個可以同時容納20人的云應(yīng)用服務(wù)空間。
連接服務(wù)器、房間訪問和創(chuàng)建。這是聯(lián)網(wǎng)的基礎(chǔ)內(nèi)容,可以通過一個空對象掛載Launcher腳本實現(xiàn)。其中,Launcher腳本包含了版本、鏈接、回調(diào)函數(shù)等基礎(chǔ)內(nèi)容,可以作為標(biāo)準(zhǔn)化的對象嵌入到任何新的網(wǎng)絡(luò)應(yīng)用中。
創(chuàng)建UI系統(tǒng),從簡單的UI系統(tǒng)中,學(xué)會用戶交互,通過用戶輸入控制網(wǎng)絡(luò)。
使用簡單數(shù)據(jù)存儲PlayerPrefs系統(tǒng),通過UI控件,對玩家的基本信息進行存儲交互。
通過LoadScene()可以進行多場景之間的調(diào)用,這種調(diào)用可以通過場景號碼或者場景名稱來調(diào)用。
場景管理器:用于管理場景之間的連接、切換、交互等功能,是一個比較通用的模塊,可以作為一個預(yù)制件處理。
自定義的腳本可以看成一個自定義的組件,通過組件掛靠到具體的實例(Object)的方法,可以將腳本發(fā)揮作用;有些單純的腳本發(fā)揮作用的可以通過掛載在空對象上實現(xiàn)功能。
網(wǎng)絡(luò)編程需要對各種網(wǎng)絡(luò)操作流程有較深的理解,比如一個簡單的流程:連接服務(wù)器 - 將本機作為主機設(shè)置游戲空間網(wǎng)絡(luò) - 在網(wǎng)絡(luò)建好之后的回調(diào)函數(shù)中執(zhí)行創(chuàng)建并進入房間的方法 - 在進入房間之后的回調(diào)函數(shù)中加載游戲場景 - 游戲場景切換邏輯與進出房間的腳本掛靠。這樣以后,就完成了單純的基本網(wǎng)絡(luò)架構(gòu)。
建立玩家系統(tǒng):首先考慮的是模型,然后是動畫邏輯,然后是控制語句,接著是場景優(yōu)化(包括相機跟隨,姿態(tài)優(yōu)化等),后面還有對戰(zhàn)交互系統(tǒng)等更復(fù)雜邏輯的構(gòu)建。
這里面都是很深入的部分,學(xué)習(xí)的基本思路是先在本地實現(xiàn),然后加入網(wǎng)絡(luò)編程,這樣可以快速定位bug,提高效率。
代碼注意點1
- 習(xí)慣于用log來確保每一個可能的錯誤都被提取到,雖然很枯燥,但是卻有利于長遠打算。
-
Time.deltaTime是使得FixedUpdate真正活起來的幕后方法,如果要脫離幀率存在,可以在Update中使用這個方法定制新功能。 - Trigger與Collision的區(qū)別與聯(lián)系:都可以檢測碰撞,只不過Trigger方法不發(fā)生物理行為,而Collision方法可以實現(xiàn)全部的物理屬性。
- 聯(lián)網(wǎng)同步:變換同步組件+動畫同步組件,同時可以設(shè)置同步幀率特性(與本機幀率不同)。
- 加上
PhotonNetwork.Connected == true作為判斷條件,可以允許用戶本地測試而不影響聯(lián)網(wǎng)效果。
代碼注意點2
- 使用
IpunObservable.OnPhotonSerializeView重構(gòu)方法可以實現(xiàn)對本地 / 網(wǎng)絡(luò)玩家實時數(shù)據(jù)的分離、同步等功能。 - 所有Application的內(nèi)容都過時了,使用
SceneManager新方法可以管理,具體查找Standard Events的示例。 - 使用Static方法可以保證本地玩家的唯一性,同時需要使用this指針將實例連接到static變量中。
-
DontDestroyOnLoad(this.gameObject)方法可以保證有玩家退出時不對場景內(nèi)其他玩家造成銷毀的影響。