汪瑞(四川大學計算機學院,成都 610065)
基于Unity3D的多通道下服務器客戶端同步
汪瑞
(四川大學計算機學院,成都610065)
在計算機技術飛速發(fā)展,信息化水平不斷提高的今天,以計算機集群為驅動的多通道技術已經越來越為人所熟知,得到普遍應用。多通道下的服務器客戶端同步技術是指當系統(tǒng)中存在單個服務器,多個客戶機時,保證每個客戶機都與服務器同步運行。而基于Unity3D引擎的多通道同步技術則需要先使用Unity分別編譯出服務器和客戶機程序,然后保證客戶機與服務器同步運行,更具挑戰(zhàn)性和創(chuàng)新性,當結合3D球幕的時候,會帶來諸如3D全景游戲等不一樣的體驗。
在基于Unity3D引擎的多通道同步技術的設計中,需要考慮很多問題,如多主機下的碰撞檢測(如何保證能在服務器和客戶機上都能實現(xiàn)碰撞檢測,并產生碰撞的粒子效果);再如畫面的同步更新,這里主要關注和解決的是動態(tài)目標,包括人物移動、子彈飛行等的同步效果。基于Unity3D引擎的多通道同步技術就是為了解決這些問題而設計的,通過該項技術,用戶可以正確實現(xiàn)C/S同步,并且可以清楚看見同步效果,如主角移動、子彈飛行等。
網(wǎng)絡同步基本要義:實現(xiàn)服務器與客戶端的交互以及客戶端與客戶端的交互,而這首先要建立服務器與客戶端之間的連接,組成C/S結構,服務器一般相對獨立,可支持多個客戶端的訪問。服務器與客戶端交互原理為:客戶端向服務器發(fā)送請求,服務器給予反饋;或者服務器向客戶端發(fā)送請求,客戶端做出應答。在Unity引擎下,可以使用兩種方法建立客戶端與服務器之間的連接:
(1)基于UDP協(xié)議的無連接套接字(Socket)方式
使用無連接的套接字,我們能夠在自我包含的數(shù)據(jù)包里發(fā)送消息,采用獨立的讀函數(shù)讀取整個消息所讀取的消息是使用獨立的發(fā)送函數(shù)發(fā)送的。UDP是一種無連接的協(xié)議,因此,為了使服務器端應用能夠發(fā)送和接收UDP數(shù)據(jù)包,我們必須要做到以下兩點:創(chuàng)建一個Socket對象;將創(chuàng)建的套接字對象(Socket)與本地IPEndPoint(IP地址/端口組合)進行綁定。這樣,所創(chuàng)建的套接字就能夠在IPEndPoint上接收流入的UDP數(shù)據(jù)包或者將流出的UDP數(shù)據(jù)包發(fā)送到網(wǎng)絡中任意其他設備上。具體創(chuàng)建過程參見圖1。
圖1 簡單的UDP服務器的創(chuàng)建流程
建立UDP客戶端應用流程與服務器非常相似,都必須先要建立套接字對象以及本地IPEndpoint對象(IP地址/端口組合),由于客戶機不需要在指定的UDP端口等待流入的數(shù)據(jù),因此不需要使用Bind()方法,也即不用將套接字Socket與IPEndpoint對象進行綁定,而是使用在數(shù)據(jù)發(fā)送時系統(tǒng)隨機指定的一個UDP端口,并且使用同一端口接收返回的消息。
(2)Unity系統(tǒng)內的網(wǎng)絡方法(Network)
此時在本地創(chuàng)建服務器時,為了保證服務器能接收到客戶端發(fā)來的請求,需要給接收請求腳本所綁定的對象添加網(wǎng)絡視圖組件(一般是添加到主攝像中)要先在場景中添加網(wǎng)絡視圖組件,并判斷聯(lián)網(wǎng)狀態(tài),然后再創(chuàng)建服務器連接,具體流程參見圖2。
在客戶端的創(chuàng)建過程中,為了確保客戶端能向服務器發(fā)送消息請求,并且使得服務器能夠將來自某一客戶端的請求返回給(廣播消息)連接到服務器的所有客戶端,也必須要先添加網(wǎng)絡視圖組件—Network View;之后可以使用 RPC向服務器發(fā)送消息:networkView.RPC(“Function”,RPCMode;Message);其 中Function為服務器腳本中已經定義的接收消息函數(shù):[RPC]void Function();RPCMode為發(fā)送消息的模式,有五種,如向服務器發(fā)送;發(fā)送給除發(fā)送者外,當前連接到服務器的每一個人;發(fā)送給連接到服務器的所有人等。Message為發(fā)送的消息。本文的實驗及實驗結果是采用第二種方法實現(xiàn)的。
圖2 Unity創(chuàng)建服務器流程
本文設計游戲模式為太空射擊游戲,游戲以太空為背景,在游戲中,主角和敵人是不同的太空飛行器,游戲開始后,主角會迎著敵方的火力前進,并能向敵人發(fā)射子彈并摧毀敵人。為了更好的表現(xiàn)同步效果,游戲中設定兩個主角Player1,Player2;Player1由創(chuàng)建游戲的服務器端玩家控制,Player2由聯(lián)入局域網(wǎng)服務器的客戶端玩家控制,在游戲運行過程中,兩個游戲中的玩家信息(如位置、射擊等)會相互同步實時更新。另:部分游戲模型來源于網(wǎng)絡。
此節(jié)僅說明游戲場景背景的創(chuàng)建和游戲主角Player(飛船)的添加,其他的諸如攝像機和燈光的設計、添加敵人等由于篇幅關系不在贅述。
游戲背景的設計:菜單欄選擇File->New Scene,創(chuàng)建一個新場景;菜單欄選擇GameObject->Create Other->Plane,創(chuàng)建一個平面體作為天空背景模型;在Project右鍵選擇Create->Material創(chuàng)建一個材質球,命名為Background,選擇Select指定其貼圖;然后將Background材質球拖至Scene窗口的天空背景模型上為其指定材質。
創(chuàng)建主角:在Project窗口選中Player1.fbx,將其拖動到Hierarchy窗口創(chuàng)建服務器端玩家飛船模型的游戲體,并在Inspector窗口設定其坐標(Position),旋轉角度(Rotation)和縮放程度(Scale)。同理可添加客戶端對應玩家飛船Player2。
圖3 游戲場景效果圖
其他游戲元素的設定略,編譯各游戲腳本略。最終游戲場景效果如圖3。
我們在游戲場景中添加的兩個飛船分別命名為Player1,Player2,分別由服務器和客戶端兩個玩家控制,類似于局域網(wǎng)游戲模式。當創(chuàng)建游戲的玩家1(服務器端)或者連接到服務器的玩家2(客戶端)按下鍵盤上的W、S、A、D鍵時,能控制所對應的飛船Player1、Player2上下左右飛行,當按下F鍵時,飛船能沿著飛行方向發(fā)射子彈,擊打敵人。我們要做的同步即是將服務器端界面變化反映到客戶端或者將客戶端界面作出的更新反映到服務器游戲中,并且做出相應更新。例如當建立游戲的服務器端玩家按下W鍵控制Player1向前移動的時候,服務器端游戲程序會響應,并發(fā)送信號(發(fā)送W字母信息)到客戶端程序,客戶端接收到該信號,也作出相同的響應(客戶端界面上人物Player1也會向前移動);又或者當在客戶端按下F鍵,飛船Player2向敵人發(fā)射子彈,在服務器端飛船Player2也會向敵人發(fā)射子彈……
聲明發(fā)送網(wǎng)絡消息函數(shù):[RPC]
//初始化服務器
以服務器端發(fā)送W鍵為例:[RPC]
當服務器端玩家連續(xù)按下F鍵,操控左邊飛船Player1發(fā)射子彈時,可以看到在客戶端游戲界面上,飛船Player1也同時向前發(fā)射子彈,同時在服務器界面左上角顯示了連接到服務器的客戶端信息 (端口號等)。這表明服務器已正確創(chuàng)建,客戶端已經連接入該服務器,并且二者能夠正確的進行交互,且程序執(zhí)行效果好,靈敏度較高。
服務器端及客戶端運行效果分別如圖4、圖5所示:
圖4 服務器端運行界面
圖5 客戶端運行界面
介紹兩種在Unity引擎內創(chuàng)建服務器和客戶端的過程,并制作了一個簡單的射擊游戲具體實現(xiàn)了第二種方法。同時在日常的一些項目開發(fā)中使用該種方法,效果十分良好。
[1]宣雨松,王軍花.Unity3D游戲開發(fā)[M].北京:人民郵電出版社,2012.
[2]金璽曾.Unity3D手機游戲開發(fā)[M].北京:清華大學出版社,2013.
[3]Richard Blum.C#網(wǎng)絡應用編程[M].高春蓉譯.北京:電子工業(yè)出版社,2003.
[4]周存杰著.Visual C#.NET網(wǎng)絡核心編程[M].北京:清華大學出版社,2002.
Unity3D;Multi-Channel;Server;Client
Server and Client Synchronous in Multi-Channel Based on Unity3D
WANG Rui
(College of Computer Science,Sichuan University,Chengdu 610065)
1007-1423(2015)24-0026-04
10.3969/j.issn.1007-1423.2015.24.007
汪瑞(1991-),男,安徽安慶人,碩士研究生,研究方向為圖形圖像技術
2015-06-19
2015-07-21
近年來,多通道技術已經日益成熟并得到廣泛應用,而基于Unity3D引擎的多通道下服務器客戶端同步,是進行Unity多人游戲開發(fā)的關鍵步驟。介紹兩種創(chuàng)建服務器和客戶端的方法,并使用第二種方法設計適合局域網(wǎng)中兩名玩家操作的天空射擊游戲,實驗結果表明,該方法可行且靈敏度較高。
Unity3D;多通道;服務器;客戶端
國家863計劃項目(No.2013AA013902)
In recent years,the multi-channel technology has become more and mature,server and client synchronous in multi-channel based on U-nity3D is the key process to develop multi-players game in Unity.Introduces two methods to create server and client,and uses the second method design the spaceshotting game suitable for two players in the local area network,the experimental result shows that this method is feasible and has high sensitivity.