本文首發自inspoy的雜七雜八 | 菜雞inspoy的學習記錄
之前那篇cocos轉unity的系列算是坑了(撒花
前言
自己是在用unity去嘗試做遊戲的,中間也遇到了很多很多各種各樣的問題,也都在努力去解決。
到目前為止也取得了很明顯的成果:主流程都是通的,現在允許多個玩家同時線上,在同一個場景中移動,轉向,釋放技能;伺服器也能妥當的同步各個玩家的資訊給所有人。
不過問題也越來越多,由於現在網路通訊機制的問題,總是會出現莫名其妙的網路斷開,而且斷開的只是客戶端接收響應的通道,客戶端依然能夠發給服務端訊息, 服務端也可以收到,當然也正常地返回結果給客戶端,然而這裡客戶端就收不到了。
另外一個情況是:現在的同步機制是客戶端各自模擬邏輯和運動,服務端只是負責同步各自的位置,某個玩家把自己的位置告知服務端,服務端再廣播給所有其他玩家。這樣就會有個問題,由於網路延遲的存在,不同玩家看到的場面局勢是不一樣的,而且現在也沒有對技能釋放出來的丟擲物進行同步,那些火球的攻擊判定也是客戶端自行判斷的,而且不同客戶端的判斷結果很有可能不一樣,這已經很難再進行優化了,要改的話必須改成由服務端計算所有移動判定邏輯,客戶端只負責傳送指令和顯示服務端推送的位置資訊,自己移動時客戶端不做移動,僅當傳送給服務端的指令資訊被處理,服務端推送給客戶端位置變化的
開個新坑
既然之前的專案寫崩了,還是重新新開一個坑吧233這次決定開源,之後的部落格會盡量同步實際的開發進度,文章裡也會貼出部分程式碼,完整的程式碼可以去github上找,地址是這裡。
當然現在的話,想做個完整的遊戲還是很難,主要問題還是沒有美術,沒有美術,沒有美術orz
反正做這個專案的主要目的還是學習,美術資源的話考慮去AssetStore找找。
じゃ、 始まりましょうね~
建立專案
新建一個unity專案(我使用的是此時unity的最新穩定版5.5.2f1),首先為了版本控制,先做一些設定:
在Edit->Project Settings->Editor
裡面找到Version Control-Mode
,選擇Visible Meta Files
。還有Asset Serialization-Mode
,選擇Force Text
這樣做的作用在於可以更好地讓unity在git之類的版本控制工具下工作,使所有Assets的Meta檔案可見且被版本控制工具管理,強制把所有Assets以文字方式儲存,雖然這樣做的話可能會使asset的檔案尺寸變大,不過以純文字代替二進位制儲存在版本控制系統中的好處是很多的,首先可以更方便直觀地比較檔案版本之間的差異,而且當不同的人同時編輯同一個檔案時,兩份檔案可以很方便的被合併,二進位制儲存的話就不行了,只能獨佔簽出來避免衝突。
然後,再找到Edit->Project Settings->Player
,把裡面的Run In Background
打上勾
其實這個選項並不是必須的,只不過我們這個遊戲是多人聯機的,所以到時候測試的時候肯定要多開,如果不允許後臺執行的話視窗失去焦點的時候遊戲就會自動暫停執行,我們可能就不能很方便地觀察同步情況了。
目錄結構
這個根據個人習慣來定就好了,我這個專案是這樣:
Assets - Assets根目錄 | - Resources - 可能需要在程式中動態載入的資源 | - Prefabs - 儲存所有預設體 | - Views - 每個UIView的預設體,即MVP結構UI的M部分 | - Materials - 材質 | - Scenes - 遊戲場景 | - Scripts - C#指令碼 | - Conf - 配置相關,包括Data和Utils | - Entity - 遊戲場景中各種型別的實體,如角色,火球 | - Event - 事件系統 | - Gameplay - 遊戲邏輯相關 | - Network - 網路通訊相關 | - UI - MVP結構UI的VP部分 | - Editor - 編輯器擴充套件相關
完整程式碼
上面貼出的程式碼片段由於篇幅限制只保留了關鍵部分,完整的程式碼可在我的github上找到