學習Unet的一些過程


 

畢業設計的項目,需要用到手機作為控制端,這就需要用到Unity的網絡模塊。

因為只會設計到幾個簡單的按鈕命令,所以不打算做多么復雜的功能,一開始打算用C#的Socket編程,但是考慮到多線程的關系覺得以后跟UI結合起來處理會比較麻煩,機智的我決定使用Unity提供的Unet網絡模塊。不需要太麻煩,只需要cs之間發送消息就行。

         一開始我感覺自己掉進了一個坑,網上關於Unet的例子不要太少,而且很多都是基於多人游戲的。最無語的一點就是里面最牛的Commands和ClientRpc的遠程調用命令以及各種變量同步只支持同一對象的不同實例間調用,簡單點來說,就是客戶端和服務器必須是同一個安裝包,他倆只是打開方式不一樣。但是我只是想做一個控制器作為客戶端而已呀。但是我還是堅信,如此牛x的網絡模塊,肯定會支持我想要的這種傻x通信的。

         我仔細看了Unity所有的關於Network的組件。最后將目標鎖定在了NetworkManager上。接下來就是去看NetworkManager的API啦,果然,一拉下來我就知道沒有錯了

 

 

在Public Functions里存在許多On開頭的方法,對Unity稍微熟悉一點的都知道以On開頭的是Unity提供的回調函數,用於處理事件。同時也找到了StartClient、Host、Server這些方法。找到了常用的操縱方法和回調函數,接下來就是要找發送和接收消息的對象了。但是我沒有絲毫頭緒。我決定先將客戶端和服務器連接成功再說。於是,我先引用到NetworkManager的對象,在手機端調用StartClient方法,在電腦端調用StartSever方法。發現二者能連接成功。

         接下來就是處理一些連接事件了,在Scripting API文檔里看NetworkManager類的Description。這里用一段簡潔的代碼清楚的介紹了如何使用這些連接事件

 

 

是的,只需要寫一個類繼承NetworkManager類。就可以很容易的重寫回調函數,自定義連接事件了。何止爽歪歪。

         然后我將原來添加的NetworkManager組件刪掉,新建一個類並繼承自NetworkManager。重寫了一些需要用到的回調方法。完美搞定。

         現在能連接成功,並且也能處理一些連接事件了,接下來就是cs之間收發消息了。根據經驗,cs之間收發消息應該是依靠某種對象調用Send方法和Receive方法。繼續查閱API發現有這么五個可能會用到的類NetworkServer、NetworkClient、NetworkReader、NetworkWriter、NetworkConnection。因為我在NetworkServer、NetworkClient、NetworkConnection都找到了與send有關的方法;而NetworkReader、NetworkWriter一看就知道是一個讀一個寫。但是卻沒有在NetworkServer、NetworkClient、NetworkConnection這三個類找到任何與Receive有關的方法,就覺得很奇怪。按理說有了NetworkReader、NetworkWriter就能實現我想要的功能了,但是我發現回調函數都會傳遞一個NetworkConnection對象,所以我還是希望直接使用NetworkConnection類,於是拋棄了Reader和Writer,把重點放在了NetworkConnection類。繼續看API… 仔細查看了NetworkConnection的所以方法的介紹,發現有這么一個方法public void RegisterHandler(short msgType, Networking.NetworkMessageDelegate handler) 才意識到原來這里使用的是觀察者模式。再進NetworkMessageDelegate看看這個委托的聲明格式。我只需要自定義一個與NetworkMessageDelegate相同格式的方法。看看NetworkMessageDelegate的聲明格式:

public delegate void NetworkMessageDelegate(Networking.NetworkMessage netMsg)。這里又涉及到了一個類: NetworkMessage,依稀中記得NetworkConnection的send方法也需要傳遞一個NetworkMessage對象。說明我的方向沒有錯,NetworkConnection的消息傳遞是通過NetworkMessage類來封裝的。過程應該是非常明朗的。先構造一個NetworkMessage對象,將這個對象通過send發送出去,在另一端用注冊的方法接收NetworkMessage對象,最后解析成自己需要的信息。那么接下來最后一步--了解NetworkMessage類,繼續API…

    接下來遇到一個比較棘手的問題—我找不到構造NetworkMessage對象的方法,API里沒有提供構造函數,也沒有找到任何有用的靜態方法。打算將希望寄托到他的父類,在vs里雙擊選中NetworkMessage,F12轉到定義。才發現他沒有父類,簡直握草了,似乎走進了死胡同。這時只有拿出終極武器了,百度一下… 直接搜索NetworkMessage。在這篇文章中找到了方法。仔細研究了一下,發現和我的思路幾乎一樣。

    好了,最后來總結一下過程,先說服務器端:

1、 寫一個Sever類,繼承自NetworkManager。把這個類掛在一個空物體上,並在Inspector面板設置好參數

2、 寫按鈕點擊一個事件,調用StartServer方法

3、 使用override關鍵字重寫一些on開頭的網絡事件方法

4、 寫一個sendMsg的方法,在方法體內調用NetworkConnection的send方法

 

5、 寫一個public void XXX(NetworkMessage netMsg)這種聲明方式的方法,處理收到的消息

6、 找一個合適的時機,調用NetworkConnection的RegisterHandler方法,將第五步定義的方法注冊進來

客戶端:

 

1、  寫一個Client類,繼承自NetworkManager。把這個類掛在一個空物體上,並在Inspector面板設置好參數(注意,客戶端的NetworkAddress應該填寫服務器端的IP,注意保持端口一致)

2、  寫按鈕點擊一個事件,調用StartClient方法

3、  使用override關鍵字重寫一些on開頭的網絡事件方法

4、  寫一個sendMsg的方法,在方法體內調用NetworkConnection的send方法

5、  寫一個public void XXX(NetworkMessage netMsg)這種聲明方式的方法,處理收到的消息

6、  找一個合適的時機,調用NetworkConnection的RegisterHandler方法,將第五步定義的方法注冊進來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM