




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,騰訊云游戲應(yīng)用開發(fā),2,實(shí)現(xiàn)業(yè)務(wù)邏輯模塊,項(xiàng)目6,3,學(xué)習(xí)目標(biāo),實(shí)現(xiàn)游戲的幾個(gè)重要業(yè)務(wù)邏輯 掌握CS模式下協(xié)議的使用 掌握登錄注冊(cè)功能的基本實(shí)現(xiàn)方法,4,1,實(shí)現(xiàn)登錄功能,1.實(shí)現(xiàn)客戶端請(qǐng)求登錄方法,當(dāng)用戶在登錄界面中單擊“登錄”按鈕后,后臺(tái)嘗試與服務(wù)器建立連接,連接成功后發(fā)送登錄協(xié)議,協(xié)議格式為login;id;password;。 修改LoginPanel.cs腳本中的OnLoginClick方法,代碼如下,*登錄按鈕事件*/publicvoidOnLoginClick()if(idInput.text=|pwInput.text=)/*打開提示框*/PanelMgr.instance
2、.OpenPanel(用戶名密碼不能為空!);return;/如果服務(wù)器沒有連接,連接服務(wù)器if(NetMgr.instance.status!=NetMgr.Status.Connected)NetMto=newProtocolStr();/*連接*/if(!NetMgr.instance.Connect()PanelMgr.instance.OpenPanel(連接服務(wù)器失敗,5,1,實(shí)現(xiàn)登錄功能,1.實(shí)現(xiàn)客戶端請(qǐng)求登錄方法,發(fā)送登錄協(xié)議ProtocolStrprotocol=newProtocolStr();protocol.AddString(login)
3、;protocol.AddString(idInput.text);protocol.AddString(pwInput.text);/*一次性監(jiān)聽*/NetMgr.instance.Send(protocol,OnLoginBack,6,1,實(shí)現(xiàn)登錄功能,2.實(shí)現(xiàn)服務(wù)端登錄協(xié)議處理方法,在HandleConnMsg類中添加Msglogin方法,當(dāng)服務(wù)端收到login協(xié)議時(shí),分發(fā)給Mgslogin方法處理,publicvoidMsglogin(Connconn,ProtocolBaseprotoBase)stringid,pw;ProtocolStrprotocol=(ProtocolStr)
4、protoBase;id=protocol.GetString(1);pw=protocol.GetString(2);/*構(gòu)建返回協(xié)議*/ProtocolStrprotocolRet=newProtocolStr();protocolRet.AddString(login);/*數(shù)據(jù)庫校驗(yàn)*/如果用戶名密碼校驗(yàn)失敗if(!DataMgr.instance.CheckPassWord(id,pw)Console.WriteLine(Msglogin登錄失敗:用戶名和密碼錯(cuò)誤+conn.GetAddress();protocolRet.AddInt(-1); /返回失敗結(jié)果conn.Send(p
5、rotocolRet);return,7,1,實(shí)現(xiàn)登錄功能,2.實(shí)現(xiàn)服務(wù)端登錄協(xié)議處理方法,if(!ServNet.instance.KickOff(id)/如果踢下線失敗Console.WriteLine(Msglogin登錄失敗:擠下線失敗+conn.player.id);/返回失敗結(jié)果protocolRet.AddInt(-1);conn.Send(protocolRet);return;PlayerDataplayerData=DataMgr.instance.GetPlayerData(id); /獲取玩家數(shù)據(jù)if(playerData=null)Console.WriteLine(
6、Msglogin登錄失敗:獲取賬戶信息失敗+conn.player.id);protocolRet.AddInt(-1); /返回失敗結(jié)果conn.Send(protocolRet);return;conn.player=newPlayer(id,conn,playerData); /登入賬戶,加載數(shù)據(jù)protocolRet.AddInt(0); /返回成功結(jié)果conn.Send(protocolRet,8,1,實(shí)現(xiàn)登錄功能,3.實(shí)現(xiàn)客戶端處理回發(fā)結(jié)果方法,添加OnLoginBack方法,*登錄協(xié)議回執(zhí)*/publicvoidOnLoginBack(ProtocolBaseprotocol)/
7、*構(gòu)建協(xié)議*/ProtocolStrproto=(ProtocolStr)protocol;/*校驗(yàn)登錄結(jié)果*/intresult=proto.GetInt(1);if(result=0)GameMgr.instance.id=idInput.text; /保存賬號(hào)IDPanelMgr.instance.OpenPanel(登錄成功!);PanelMgr.instance.OpenPanel(); /*進(jìn)入游戲大廳*/PanelMgr.instance.ClosePanel(this);elseNetMgr.instance.Close(); /斷開連接PanelMgr.instance.Op
8、enPanel(登錄失敗,請(qǐng)檢查用戶名密碼,9,1,實(shí)現(xiàn)登錄功能,4.實(shí)現(xiàn)踢下線模塊,如果該角色在游戲中,則把它踢下線。并且發(fā)送Logout協(xié)議,向被踢下線的客戶端發(fā)送通知。 在ServNet中添加KickOff方法,代碼如下,*如果某id已經(jīng)在線就踢下線*/publicboolKickOff(stringid)for(inti=0;iconns.Length;i+)if(connsi=null)continue;if(!connsi.isUse)continue;if(connsi.player=null)continue;/*如果該玩家已經(jīng)在線*/if(connsi.player.id=i
9、d)lock(connsi.player)Console.WriteLine(檢查到+id+已在線,踢下線);/*通知客戶端下線*/ProtocolStrprotocolLogout=newProtocolStr();protocolLogout.AddString(logout);connsi.Send(protocolLogout);returnconnsi.player.Logout();returntrue,10,2,實(shí)現(xiàn)獲取自身數(shù)據(jù)功能,1.實(shí)現(xiàn)客戶端發(fā)送請(qǐng)求方法,在LobbyPanel.cs腳本的OnShowing方法的最后添加相關(guān)代碼,如下,*請(qǐng)求加載自身數(shù)據(jù)*/Protocol
10、Strproto=newProtocolStr();proto.AddString(getachieve); /發(fā)送協(xié)議,并注冊(cè)接收方法NetMgr.instance.Send(proto,RecvGetAchieve,11,2,實(shí)現(xiàn)獲取自身數(shù)據(jù)功能,2.實(shí)現(xiàn)服務(wù)端處理協(xié)議的方法,當(dāng)服務(wù)端接收到協(xié)議時(shí),分發(fā)給對(duì)應(yīng)的方法,將玩家的勝負(fù)場(chǎng)次寫入?yún)f(xié)議返回給玩家。 在HandlePlayerMsg類中添加協(xié)議處理方法Msggetachieve方法,代碼如下,*獲取玩家自身數(shù)據(jù)*/*返回協(xié)議getachieve,win,lost,*/publicvoidMsggetachieve(Playerplaye
11、r,ProtocolBaseprotoBase)ProtocolStrprotocolRet=newProtocolStr();protocolRet.AddString(getachieve);protocolRet.AddString(player.id);protocolRet.AddInt(player.playerData.win);protocolRet.AddInt(player.playerData.fail);player.conn.Send(protocolRet);return,12,2,實(shí)現(xiàn)獲取自身數(shù)據(jù)功能,3.實(shí)現(xiàn)客戶端處理回發(fā)結(jié)果,客戶端收到返回協(xié)議并更新到UI上,
12、代碼如下,*個(gè)人信息協(xié)議接收*/publicvoidRecvGetAchieve(ProtocolBaseprotocol)/*解析協(xié)議*/ProtocolStrproto=(ProtocolStr)protocol;IDtext.text=玩家:;IDtext.text+=proto.GetString(1);IDtext.text+=,勝場(chǎng):;IDtext.text+=proto.GetInt(2);IDtext.text+=,負(fù)場(chǎng):;IDtext.text+=proto.GetInt(3,13,3,實(shí)現(xiàn)注冊(cè)功能,1. 實(shí)現(xiàn)客戶端請(qǐng)求注冊(cè)方法,當(dāng)用戶在注冊(cè)界面中單擊“注冊(cè)”按鈕后,后臺(tái)嘗試
13、與服務(wù)器建立連接,連接成功后發(fā)送注冊(cè)協(xié)議,協(xié)議格式為register;id;password;。 修改RegPanel.cs腳本中的OnRegClick方法,代碼如下,*注冊(cè)按鈕事件*/publicvoidOnRegClick()/*本地校驗(yàn)*/用戶名密碼為空if(idInput.text=|pwInput.text=)PanelMgr.instance.OpenPanel(用戶名密碼不能為空!);return;/兩次密碼不同if(pwInput.text!=repInput.text)PanelMgr.instance.OpenPanel(兩次輸入的密碼不同!);return,14,3,實(shí)現(xiàn)
14、注冊(cè)功能,1. 實(shí)現(xiàn)客戶端請(qǐng)求注冊(cè)方法,連接服務(wù)器if(NetMgr.instance.status!=NetMgr.Status.Connected)NetMto=newProtocolStr();if(!NetMgr.instance.Connect()PanelMgr.instance.OpenPanel(連接服務(wù)器失敗!);/構(gòu)建協(xié)議ProtocolStrprotocol=newProtocolStr();protocol.AddString(register);protocol.AddString(idInput.text);protocol.AddSt
15、ring(pwInput.text);/發(fā)送NetMgr.instance.Send(protocol,OnRegBack,15,3,實(shí)現(xiàn)注冊(cè)功能,2. 實(shí)現(xiàn)服務(wù)端注冊(cè)協(xié)議處理方法,當(dāng)服務(wù)端收到register協(xié)議時(shí),分發(fā)給Msgregister方法處理。該方法首先解析協(xié)議中的用戶名和密碼。調(diào)用GetXXX是獲取協(xié)議數(shù)值的一種方法。然后調(diào)用DataMgr.instance.Register向user中表添加數(shù)據(jù),如果添加失敗,則通過protocol.AddInt(0)構(gòu)造參數(shù)為0的返回協(xié)議。最后通過CreatePlayer創(chuàng)建角色,并返回協(xié)議給客戶端,代碼如下,*注冊(cè)協(xié)議*/publicvoi
16、dMsgregister(Connconn,ProtocolBaseprotoBase)/*解析協(xié)議*/stringid,pw;ProtocolStrprotocol=(ProtocolStr)protoBase;id=protocol.GetString(1);pw=protocol.GetString(2);Console.WriteLine(Msgregister處理注冊(cè)協(xié)議:+conn.GetAddress()+用戶名:+id+密碼:+pw);/*注冊(cè)*/boolresult=DataMgr.instance.Register(id,pw,16,3,實(shí)現(xiàn)注冊(cè)功能,2. 實(shí)現(xiàn)服務(wù)端注冊(cè)協(xié)
17、議處理方法,構(gòu)建返回協(xié)議ProtocolStrprotocolRet=newProtocolStr();protocolRet.AddString(register);if(result)Console.WriteLine(Msgregister注冊(cè)成功+conn.GetAddress();protocolRet.AddInt(0);elseConsole.WriteLine(Msgregister注冊(cè)失敗+conn.GetAddress();protocolRet.AddInt(-1);/返回協(xié)議給客戶端conn.Send(protocolRet,17,3,實(shí)現(xiàn)注冊(cè)功能,3. 實(shí)現(xiàn)客戶端處理
18、回發(fā)結(jié)果方法,服務(wù)端處理協(xié)議后,會(huì)返回處理結(jié)果,格式為register;result;。result為0表示成功,-1表示失敗。客戶端收到返回協(xié)議再做出響應(yīng)。注冊(cè)成功則關(guān)閉注冊(cè)界面。注冊(cè)失敗則提示注冊(cè)失敗。添加OnRegBack方法,代碼如下,*注冊(cè)協(xié)議回執(zhí)*/publicvoidOnRegBack(ProtocolBaseprotocol)/*解析協(xié)議*/ProtocolStrproto=(ProtocolStr)protocol;intresult=proto.GetInt(1);if(result=0)PanelMgr.instance.OpenPanel(注冊(cè)成功!);/*返回登錄界面
19、*/PanelMgr.instance.ClosePanel(this);elseNetMgr.instance.Close();PanelMgr.instance.OpenPanel(注冊(cè)失敗,請(qǐng)更換用戶名,18,4,實(shí)現(xiàn)匹配功能,1. 實(shí)現(xiàn)客戶端的匹配請(qǐng)求,單擊“匹配”按鈕,發(fā)送相關(guān)協(xié)議。 在LobbyPanel.cs中添加新字段,代碼如下,*匹配狀態(tài)*/enumMatchStateMatching,NoneMatchStatestate=MatchState.None,19,4,實(shí)現(xiàn)匹配功能,1. 實(shí)現(xiàn)客戶端的匹配請(qǐng)求,修改LobbyPanel.cs中的OnMatchClick方法,代碼
20、如下,匹配按鈕事件publicvoidOnMatchClick()if(state=MatchState.None)ProtocolStrprotocol=newProtocolStr();protocol.AddString(matchin);NetMgr.instance.Send(protocol);state=MatchState.Matching;btnText.text=匹配中n(點(diǎn)擊取消);elseProtocolStrprotocol=newProtocolStr();protocol.AddString(matchout);NetMgr.instance.Send(proto
21、col);state=MatchState.None;btnText.text=匹配n(點(diǎn)擊開始,20,4,實(shí)現(xiàn)匹配功能,2. 創(chuàng)建服務(wù)端匹配管理類MatchMgr,MatchMgr類主要負(fù)責(zé)以下工作: 定義匹配隊(duì)列。當(dāng)匹配隊(duì)列滿足人數(shù)要求時(shí),創(chuàng)建房間,并將這些玩家添加到房間的玩家列表里。 定義游戲開始要求的人數(shù)。當(dāng)隊(duì)列滿足人數(shù)要求的時(shí)候,將隊(duì)列最前面的幾個(gè)人放到一個(gè)新建的房間類里。 控制隊(duì)列的進(jìn)入與離開。 添加MatchMgr匹配管理類,代碼如下,usingSystem;/*匹配管理*/usingSystem.Collections.Generic;publicclassMatchMgr/單
22、例publicstaticMatchMgrinstance;/匹配列表publicListlist=newList();/開始游戲需要的人數(shù)publicintbeginNum=4,21,4,實(shí)現(xiàn)匹配功能,2. 創(chuàng)建服務(wù)端匹配管理類MatchMgr,*構(gòu)造方法*/publicMatchMgr()instance=this;/*判斷匹配隊(duì)列中是否已經(jīng)足夠開局*/publicvoidCanBegin()if(list.Count=beginNum)Console.WriteLine(匹配成功,創(chuàng)建房間);Roomroom=newRoom();for(inti=0;ibeginNum;i+)room.
23、AddPlayer(list0);list.Remove(list0);/*通知所有匹配上的玩家進(jìn)入房間*/room.MatchOK(,22,4,實(shí)現(xiàn)匹配功能,2. 創(chuàng)建服務(wù)端匹配管理類MatchMgr,publicvoidAddPlayer(Playerplayer)lock(list)if(list.Contains(player)return;list.Add(player);player.tempData.status=PlayerTempData.Status.Matching;Console.WriteLine(Msgmatchin進(jìn)入匹配隊(duì)列+player.id);CanBegi
24、n();/*將玩家移出匹配隊(duì)列*/publicvoidRemovePlayer(Playerplayer)lock(list)if(!list.Contains(player)return;player.tempData.status=PlayerTempData.Status.None;list.Remove(player);Console.WriteLine(Msgmatchout離開匹配隊(duì)列+player.id,23,4,實(shí)現(xiàn)匹配功能,3. 創(chuàng)建服務(wù)端房間類Room,Room類主要負(fù)責(zé)以下工作: 當(dāng)匹配隊(duì)列滿足人數(shù)要求時(shí),創(chuàng)建房間,并將這些玩家添加到房間的玩家列表里。 創(chuàng)建房間時(shí),向房間
25、中所有玩家發(fā)送匹配成功協(xié)議。 分配隊(duì)伍,以錯(cuò)開的方式,比如135是紅隊(duì)、246是藍(lán)隊(duì)。 添加Room房間類,代碼如下,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;/房間publicclassRoom/狀態(tài)publicenumStatus/*準(zhǔn)備中*/Prepare=1,/*游戲中*/Fight=2,24,4,實(shí)現(xiàn)匹配功能,3. 創(chuàng)建服務(wù)端房間類Room,publicStatusstatus=Status.Prepare;publicintmaxPlayers=2; /玩家/*已準(zhǔn)備的玩家*/intreadyNum=0
26、;/*玩家列表*/publicDictionaryplayerlist=newDictionary();/*座位數(shù)組*/publicRoom()maxPlayers=MatchMgr.instance.beginNum;publicboolAddPlayer(Playerplayer)/添加玩家lock(playerlist)if(playerlist.Count=maxPlayers)returnfalse;/*修改玩家臨時(shí)數(shù)據(jù)*/player.tempData.room=this;player.tempData.team=SwitchTeam();player.tempData.statu
27、s=PlayerTempData.Status.Room;/*寫入*/playerlist.Add(player.id,player);returntrue,25,4,實(shí)現(xiàn)匹配功能,3. 創(chuàng)建服務(wù)端房間類Room,*分配隊(duì)伍*/*返回一個(gè)隊(duì)伍的ID*/publicintSwitchTeam()intcount1=0;intcount2=0;foreach(Playerplayerinplayerlist.Values)if(player.tempData.team=1)count1+;if(player.tempData.team=2)count2+;if(count1=count2)retu
28、rn1;elsereturn2,26,4,實(shí)現(xiàn)匹配功能,3. 創(chuàng)建服務(wù)端房間類Room,廣播publicvoidBroadcast(ProtocolBaseprotocol)lock(playerlist)foreach(Playerplayerinplayerlist.Values)player.conn.Send(protocol);/*匹配成功*/*通知所有玩家進(jìn)入房間,并廣播房間中所有玩家的信息*/publicvoidMatchOK()ProtocolStrprotocol=newProtocolStr();protocol.AddString(enterroom);Broadcast
29、(protocol,27,4,實(shí)現(xiàn)匹配功能,4. 創(chuàng)建服務(wù)端協(xié)議處理方法,添加HandleMatchMsg.cs文件用來處理匹配協(xié)議,它有兩個(gè)協(xié)議處理方法Msgmatchin和Msgmatchout,代碼如下,usingSystem;usingSystem.Collections.Generic;publicpartialclassHandlePlayerMsg/進(jìn)入匹配隊(duì)列publicvoidMsgmatchin(Playerplayer,ProtocolBaseprotoBase)MatchMgr.instance.AddPlayer(player);/離開匹配隊(duì)列publicvoidMs
30、gmatchout(Playerplayer,ProtocolBaseprotoBase)MatchMgr.instance.RemovePlayer(player,28,4,實(shí)現(xiàn)匹配功能,5. 客戶端響應(yīng)匹配結(jié)果,當(dāng)匹配成功后,服務(wù)端會(huì)發(fā)送enterroom協(xié)議,客戶端接收協(xié)議后進(jìn)入到房間。 在OnShowing方法的最后注冊(cè)進(jìn)入房間的協(xié)議,代碼如下,/*添加事件監(jiān)聽,匹配成功進(jìn)入房間*/NetMgr.instance.msgDist.AddListener(enterroom,RecvEnterRoom);,添加回調(diào)方法,代碼如下,*協(xié)議回發(fā)*/publicvoidRecvEnterRoo
31、m(ProtocolBaseprotocol)Debug.Log(RecvEnterRoom);PanelMgr.instance.OpenPanel();PanelMgr.instance.ClosePanel(this,29,5,實(shí)現(xiàn)準(zhǔn)備功能,1. 客戶端發(fā)送準(zhǔn)備通知,當(dāng)玩家單擊“確認(rèn)”按鈕(也就是游戲中常說的準(zhǔn)備)后,向服務(wù)端發(fā)送choosedhero協(xié)議。修改確認(rèn)按鈕的點(diǎn)擊事件,代碼如下,確認(rèn)選擇按鈕事件publicvoidOnYesClick()/*通知服務(wù)器*/ProtocolStrprotocol=newProtocolStr();protocol.AddString(choos
32、edhero);protocol.AddString(Archer);NetMgr.instance.Send(protocol);/*點(diǎn)擊一次準(zhǔn)備按鈕后,按鈕就失效*/yesBtn.onClick.RemoveAllListeners(,30,5,實(shí)現(xiàn)準(zhǔn)備功能,2. 服務(wù)端處理準(zhǔn)備結(jié)果,在HandleMatchMsg中添加處理choosedhero協(xié)議的方法,代碼如下,選擇英雄publicvoidMsgchoosedhero(Playerplayer,ProtocolBaseprotoBase)/*解析協(xié)議*/ProtocolStrprotocol=(ProtocolStr)protoBas
33、e;stringheroName=protocol.GetString(1);/*檢查是否可以開始*/player.tempData.room.ChoosedHero(player,heroName,31,5,實(shí)現(xiàn)準(zhǔn)備功能,2. 服務(wù)端處理準(zhǔn)備結(jié)果,每當(dāng)有一個(gè)玩家提交選擇英雄協(xié)議時(shí)進(jìn)行判斷,是否可以開始戰(zhàn)斗。在Room類中添加相關(guān)方法,代碼如下,*選擇英雄*/publicvoidChoosedHero(Playerplayer,stringheroName)/修改玩家臨時(shí)數(shù)據(jù)player.tempData.heroName=heroName;/當(dāng)前房間中準(zhǔn)備的玩家數(shù)量+1readyNum+;/
34、*是否可以開始游戲*/intbeginNum=playerlist.Count;Console.WriteLine(readyNum+位玩家已選擇英雄);/如果準(zhǔn)備的玩家=所有玩家,則可以開始if(readyNum=beginNum)Console.WriteLine(所有玩家選擇完畢,開始戰(zhàn)斗!);StartFight(,32,5,實(shí)現(xiàn)準(zhǔn)備功能,2. 服務(wù)端處理準(zhǔn)備結(jié)果,當(dāng)所有玩家都準(zhǔn)備完畢時(shí),向所有玩家發(fā)送游戲開始協(xié)議. 在Room類中添加方法,代碼如下,*開始游戲*/publicvoidStartFight()/*構(gòu)建fight協(xié)議*/ProtocolStrprotocol=newPro
35、tocolStr();protocol.AddString(fight);status=Status.Fight;intteamPos1=1;intteamPos2=1;lock(playerlist)protocol.AddInt(playerlist.Count);/*將每一個(gè)玩家的信息逐一添加到協(xié)議中*/foreach(Playerpinplayerlist.Values)/*玩家ID*/protocol.AddString(p.id,33,5,實(shí)現(xiàn)準(zhǔn)備功能,2. 服務(wù)端處理準(zhǔn)備結(jié)果,*選擇的英雄*/protocol.AddString(p.tempData.heroName);/*所在
36、隊(duì)伍*/protocol.AddInt(p.tempData.team);/*隊(duì)伍位置*/if(p.tempData.team=1)protocol.AddInt(teamPos1+);elseprotocol.AddInt(teamPos2+);/*修改所有玩家的臨時(shí)數(shù)據(jù)*/p.tempData.status=PlayerTempData.Status.Fight;p.tempData.isAlive=true;/*廣播*/Broadcast(protocol,34,5,實(shí)現(xiàn)準(zhǔn)備功能,3. 客戶端處理回發(fā)協(xié)議,當(dāng)服務(wù)端確定可以開始游戲時(shí),會(huì)向房間中每一個(gè)玩家發(fā)送一個(gè)fight協(xié)議,客戶端接收
37、fight協(xié)議,開始處理戰(zhàn)場(chǎng)。 添加協(xié)議監(jiān)聽并在關(guān)閉面板時(shí)注銷,代碼如下,*添加監(jiān)聽*/NetMgr.instance.msgDist.AddListener(fight,RecvFight,在OnClosing方法中刪除監(jiān)聽,代碼如下,publicoverridevoidOnClosing()NetMgr.instance.msgDist.DelListener(fight,RecvFight);,35,5,實(shí)現(xiàn)準(zhǔn)備功能,3. 客戶端處理回發(fā)協(xié)議,實(shí)現(xiàn)RecvFight方法,代碼如下,*處理fight協(xié)議*/publicvoidRecvFight(ProtocolBaseprotocol)P
38、rotocolStrproto=(ProtocolStr)protocol;/*開始戰(zhàn)斗*/PanelMgr.instance.OpenPanel();PanelMgr.instance.ClosePanel(this);/初始化戰(zhàn)場(chǎng),稍后實(shí)現(xiàn)/BattleManager.instance.StartBattle(proto,36,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,1. 創(chuàng)建BattleManager戰(zhàn)場(chǎng)管理類,添加BattleManager.cs腳本用來處理戰(zhàn)場(chǎng)布置,代碼如下,usingSystem.Collections;usingSystem.Collections.Generic;usingUni
39、tyEngine;publicclassBattleManager:MonoBehaviour/*角色的預(yù)制體*/publicGameObjectarcherPre;/*戰(zhàn)場(chǎng)中的所有玩家*/publicDictionarylist=newDictionary();/*單例*/publicstaticBattleManagerinstance;/*皮膚*/publicMaterialmat1,mat2;voidAwake()instance=this,37,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,2. 添加初始化戰(zhàn)場(chǎng)的方法,用StartBattle方法解析fight協(xié)議,實(shí)例化協(xié)議中的每個(gè)玩家,代碼如下,*開始戰(zhàn)
40、斗*/*處理一切戰(zhàn)斗準(zhǔn)備和預(yù)設(shè)*/publicvoidStartBattle(ProtocolStrproto)/*解析協(xié)議*/stringprotoName=proto.GetString(0);intcount=proto.GetInt(1); /玩家總數(shù)/清理場(chǎng)景ClearBattle();/實(shí)例化每一個(gè)玩家for(inti=0;icount;i+)stringid=proto.GetString(4*i+2);stringheroName=proto.GetString(4*i+3);intteam=proto.GetInt(4*i+4);/*出生點(diǎn)ID*/intswopID=prot
41、o.GetInt(4*i+5);/實(shí)例化角色GenerateBattleHero(id,heroName,team,swopID,38,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,3. 添加清理戰(zhàn)場(chǎng)方法,每次開啟新戰(zhàn)斗之前需要清理戰(zhàn)場(chǎng),包括清空玩家列表,恢復(fù)主攝像機(jī)的跟隨狀態(tài),銷毀所有角色和輔助物體(如準(zhǔn)心)。 添加ClearBattle方法,代碼如下,publicvoidClearBattle()/清除玩家列表list.Clear();/恢復(fù)主攝像機(jī)父級(jí)Camera.main.transform.SetParent(transform);/*銷毀所有的角色*/GameObjectheros=GameObject.
42、FindGameObjectsWithTag(Archer);for(inti=0;iheros.Length;i+)Destroy(herosi);/*銷毀所有的輔助物體*/foreach(GameObjectginGameObject.FindGameObjectsWithTag(Helper)GameObject.Destroy(g,39,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,4. 創(chuàng)建角色名稱,由于是多人對(duì)戰(zhàn),為了更好地識(shí)別隊(duì)友和敵人,可以在角色的頭上增加一個(gè)3D text模型,并且讓模型始終面向主攝像機(jī)。 在Archer中添加子物體3D Text,重命名為ID,Text字體大小設(shè)置為0.3,Posi
43、tion設(shè)為(0,1.32,0,40,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,4. 創(chuàng)建角色名稱,為了讓名稱一直面向玩家,需要給ID添加一個(gè)腳本FaceToCamera.cs,代碼如下,usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassFaceToCamera:MonoBehaviourvoidUpdate()transform.rotation=Camera.current.transform.rotation,41,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,5. 創(chuàng)建出生點(diǎn),游戲設(shè)定有兩組隊(duì)伍,每隊(duì)兩人。地圖上
44、需要預(yù)先設(shè)置好玩家的出生點(diǎn),在場(chǎng)景中新建空游戲?qū)ο骃pawn,如圖6-6-2所示,具體位置玩家可以自己設(shè)置,注意出生點(diǎn)不可以放到地形的下面,不然角色出生的時(shí)候會(huì)掉出地圖,42,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,6. 實(shí)例化玩家,GenerateBattleHero主要實(shí)現(xiàn)以下幾點(diǎn): 實(shí)例化角色模型,并將模型放到對(duì)應(yīng)出生點(diǎn)的位置。 為角色添加控制組件,為主角添加PlayerCtrl,為其他角色添加NetCtrl。 為主角設(shè)置相機(jī)跟隨。 為其他角色設(shè)置剛體。 針對(duì)不同隊(duì)伍,設(shè)置材質(zhì)和ID的顏色。 添加GenerateBattleHero方法,代碼如下,*實(shí)例化戰(zhàn)場(chǎng)角色*/voidGenerateBattleH
45、ero(stringid,stringheroName,intteam,intswopID)/*獲取出生點(diǎn)*/Transformsp=GameObject.Find(Spawn).transform;TransformswopTrans;if(team!=1,43,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,6. 實(shí)例化玩家,if(swopID5)Debug.LogError(swopID的格式不正確);return;/查找出生點(diǎn)對(duì)象swopTrans=sp.GetChild(team-1).GetChild(swopID-1);if(swopTrans=null)Debug.LogError(GenerateBa
46、ttleHero出生點(diǎn)錯(cuò)誤!);return;if(archerPre=null)Debug.LogError(GenerateBattleHero找不到預(yù)制體!);return,44,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,6. 實(shí)例化玩家,*實(shí)例化角色*/實(shí)例化模型GameObjectheroObj=(GameObject)Instantiate(archerPre);/名稱heroO=id;/*位置*/heroObj.transform.localPosition=Vector3.zero;heroObj.transform.position=swopTrans.position;heroObj.transform.rotation=swopTrans.rotation;/*添加組件*/如果這個(gè)是玩家自身if(id=GameMgr.instance.id)/添加玩家控制器PlayerCtrlpc=heroObj.AddComponent();pc.aimPoint=Resources.Load(Prefabs/AimMark,typeof(GameObject)asGameObject;pc.arrowPrefab=Resources.Load(Prefabs/Arrow,typeof(GameObject)asGameObject,45,6,實(shí)現(xiàn)戰(zhàn)場(chǎng)管理功能,6. 實(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 14《背影》教學(xué)設(shè)計(jì)2024-2025學(xué)年八年級(jí)語文上冊(cè)同步課堂(統(tǒng)編版)
- 上海國(guó)內(nèi)旅游合同范本
- 加油站供貨合同范本
- 保安管理服務(wù)合同范例
- 健身房市場(chǎng)推廣合同范本
- 第21課 活動(dòng)課 從考古發(fā)現(xiàn)看中華文明的起源(教學(xué)設(shè)計(jì)-課堂使用)2024-2025學(xué)年七年級(jí)歷史上冊(cè)同步備課系列(統(tǒng)編版2024)
- 企業(yè)合同范本英文
- 2024年宣城郎溪縣縣直事業(yè)單位引進(jìn)專業(yè)人才考試真題
- 第16課 明朝的科技、建筑與文學(xué)(教學(xué)設(shè)計(jì))2023-2024學(xué)年七年級(jí)歷史下冊(cè)同步教學(xué)設(shè)計(jì)(統(tǒng)編版)
- 勞動(dòng)合同范本 宿舍
- 三好學(xué)生競(jìng)選12
- 2024年河南鄭州二七區(qū)侯寨中心衛(wèi)生院招聘筆試真題
- 中國(guó)糖尿病防治指南+2024+解讀
- 崗位職責(zé)心得體會(huì)(2篇)
- 2025年上海寶冶集團(tuán)限公司招聘歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 機(jī)械設(shè)計(jì)基礎(chǔ) 課件 01機(jī)械設(shè)計(jì)概論
- GB/T 6822-2024船體防污防銹漆體系
- 全國(guó)第三屆職業(yè)技能大賽(智能網(wǎng)聯(lián)汽車裝調(diào)運(yùn)維)選拔賽理論考試題庫(含答案)
- 電信網(wǎng)絡(luò)詐騙犯罪的特征、治理困境及對(duì)策建議
- 救護(hù)車掛靠私立醫(yī)院協(xié)議書(2篇)
- 《血透患教》課件
評(píng)論
0/150
提交評(píng)論