實現(xiàn)業(yè)務(wù)邏輯模塊PPT精品文檔_第1頁
實現(xiàn)業(yè)務(wù)邏輯模塊PPT精品文檔_第2頁
實現(xiàn)業(yè)務(wù)邏輯模塊PPT精品文檔_第3頁
實現(xiàn)業(yè)務(wù)邏輯模塊PPT精品文檔_第4頁
實現(xiàn)業(yè)務(wù)邏輯模塊PPT精品文檔_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1,騰訊云游戲應(yīng)用開發(fā),2,實現(xiàn)業(yè)務(wù)邏輯模塊,項目6,3,學(xué)習(xí)目標(biāo),實現(xiàn)游戲的幾個重要業(yè)務(wù)邏輯 掌握CS模式下協(xié)議的使用 掌握登錄注冊功能的基本實現(xiàn)方法,4,1,實現(xiàn)登錄功能,1.實現(xiàn)客戶端請求登錄方法,當(dāng)用戶在登錄界面中單擊“登錄”按鈕后,后臺嘗試與服務(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,實現(xiàn)登錄功能,1.實現(xiàn)客戶端請求登錄方法,發(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,實現(xiàn)登錄功能,2.實現(xiàn)服務(wù)端登錄協(xié)議處理方法,在HandleConnMsg類中添加Msglogin方法,當(dāng)服務(wù)端收到login協(xié)議時,分發(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ù)庫校驗*/如果用戶名密碼校驗失敗if(!DataMgr.instance.CheckPassWord(id,pw)Console.WriteLine(Msglogin登錄失敗:用戶名和密碼錯誤+conn.GetAddress();protocolRet.AddInt(-1); /返回失敗結(jié)果conn.Send(p

5、rotocolRet);return,7,1,實現(xiàn)登錄功能,2.實現(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,實現(xiàn)登錄功能,3.實現(xiàn)客戶端處理回發(fā)結(jié)果方法,添加OnLoginBack方法,*登錄協(xié)議回執(zhí)*/publicvoidOnLoginBack(ProtocolBaseprotocol)/

7、*構(gòu)建協(xié)議*/ProtocolStrproto=(ProtocolStr)protocol;/*校驗登錄結(jié)果*/intresult=proto.GetInt(1);if(result=0)GameMgr.instance.id=idInput.text; /保存賬號IDPanelMgr.instance.OpenPanel(登錄成功!);PanelMgr.instance.OpenPanel(); /*進(jìn)入游戲大廳*/PanelMgr.instance.ClosePanel(this);elseNetMgr.instance.Close(); /斷開連接PanelMgr.instance.Op

8、enPanel(登錄失敗,請檢查用戶名密碼,9,1,實現(xiàn)登錄功能,4.實現(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,實現(xiàn)獲取自身數(shù)據(jù)功能,1.實現(xiàn)客戶端發(fā)送請求方法,在LobbyPanel.cs腳本的OnShowing方法的最后添加相關(guān)代碼,如下,*請求加載自身數(shù)據(jù)*/Protocol

10、Strproto=newProtocolStr();proto.AddString(getachieve); /發(fā)送協(xié)議,并注冊接收方法NetMgr.instance.Send(proto,RecvGetAchieve,11,2,實現(xiàn)獲取自身數(shù)據(jù)功能,2.實現(xiàn)服務(wù)端處理協(xié)議的方法,當(dāng)服務(wù)端接收到協(xié)議時,分發(fā)給對應(yīng)的方法,將玩家的勝負(fù)場次寫入?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,實現(xiàn)獲取自身數(shù)據(jù)功能,3.實現(xiàn)客戶端處理回發(fā)結(jié)果,客戶端收到返回協(xié)議并更新到UI上,

12、代碼如下,*個人信息協(xié)議接收*/publicvoidRecvGetAchieve(ProtocolBaseprotocol)/*解析協(xié)議*/ProtocolStrproto=(ProtocolStr)protocol;IDtext.text=玩家:;IDtext.text+=proto.GetString(1);IDtext.text+=,勝場:;IDtext.text+=proto.GetInt(2);IDtext.text+=,負(fù)場:;IDtext.text+=proto.GetInt(3,13,3,實現(xiàn)注冊功能,1. 實現(xiàn)客戶端請求注冊方法,當(dāng)用戶在注冊界面中單擊“注冊”按鈕后,后臺嘗試

13、與服務(wù)器建立連接,連接成功后發(fā)送注冊協(xié)議,協(xié)議格式為register;id;password;。 修改RegPanel.cs腳本中的OnRegClick方法,代碼如下,*注冊按鈕事件*/publicvoidOnRegClick()/*本地校驗*/用戶名密碼為空if(idInput.text=|pwInput.text=)PanelMgr.instance.OpenPanel(用戶名密碼不能為空!);return;/兩次密碼不同if(pwInput.text!=repInput.text)PanelMgr.instance.OpenPanel(兩次輸入的密碼不同!);return,14,3,實現(xiàn)

14、注冊功能,1. 實現(xiàn)客戶端請求注冊方法,連接服務(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,實現(xiàn)注冊功能,2. 實現(xiàn)服務(wù)端注冊協(xié)議處理方法,當(dāng)服務(wù)端收到register協(xié)議時,分發(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é)議給客戶端,代碼如下,*注冊協(xié)議*/publicvoi

16、dMsgregister(Connconn,ProtocolBaseprotoBase)/*解析協(xié)議*/stringid,pw;ProtocolStrprotocol=(ProtocolStr)protoBase;id=protocol.GetString(1);pw=protocol.GetString(2);Console.WriteLine(Msgregister處理注冊協(xié)議:+conn.GetAddress()+用戶名:+id+密碼:+pw);/*注冊*/boolresult=DataMgr.instance.Register(id,pw,16,3,實現(xiàn)注冊功能,2. 實現(xiàn)服務(wù)端注冊協(xié)

17、議處理方法,構(gòu)建返回協(xié)議ProtocolStrprotocolRet=newProtocolStr();protocolRet.AddString(register);if(result)Console.WriteLine(Msgregister注冊成功+conn.GetAddress();protocolRet.AddInt(0);elseConsole.WriteLine(Msgregister注冊失敗+conn.GetAddress();protocolRet.AddInt(-1);/返回協(xié)議給客戶端conn.Send(protocolRet,17,3,實現(xiàn)注冊功能,3. 實現(xiàn)客戶端處理

18、回發(fā)結(jié)果方法,服務(wù)端處理協(xié)議后,會返回處理結(jié)果,格式為register;result;。result為0表示成功,-1表示失敗??蛻舳耸盏椒祷貐f(xié)議再做出響應(yīng)。注冊成功則關(guān)閉注冊界面。注冊失敗則提示注冊失敗。添加OnRegBack方法,代碼如下,*注冊協(xié)議回執(zhí)*/publicvoidOnRegBack(ProtocolBaseprotocol)/*解析協(xié)議*/ProtocolStrproto=(ProtocolStr)protocol;intresult=proto.GetInt(1);if(result=0)PanelMgr.instance.OpenPanel(注冊成功!);/*返回登錄界面

19、*/PanelMgr.instance.ClosePanel(this);elseNetMgr.instance.Close();PanelMgr.instance.OpenPanel(注冊失敗,請更換用戶名,18,4,實現(xiàn)匹配功能,1. 實現(xiàn)客戶端的匹配請求,單擊“匹配”按鈕,發(fā)送相關(guān)協(xié)議。 在LobbyPanel.cs中添加新字段,代碼如下,*匹配狀態(tài)*/enumMatchStateMatching,NoneMatchStatestate=MatchState.None,19,4,實現(xiàn)匹配功能,1. 實現(xiàn)客戶端的匹配請求,修改LobbyPanel.cs中的OnMatchClick方法,代碼

20、如下,匹配按鈕事件publicvoidOnMatchClick()if(state=MatchState.None)ProtocolStrprotocol=newProtocolStr();protocol.AddString(matchin);NetMgr.instance.Send(protocol);state=MatchState.Matching;btnText.text=匹配中n(點擊取消);elseProtocolStrprotocol=newProtocolStr();protocol.AddString(matchout);NetMgr.instance.Send(proto

21、col);state=MatchState.None;btnText.text=匹配n(點擊開始,20,4,實現(xiàn)匹配功能,2. 創(chuàng)建服務(wù)端匹配管理類MatchMgr,MatchMgr類主要負(fù)責(zé)以下工作: 定義匹配隊列。當(dāng)匹配隊列滿足人數(shù)要求時,創(chuàng)建房間,并將這些玩家添加到房間的玩家列表里。 定義游戲開始要求的人數(shù)。當(dāng)隊列滿足人數(shù)要求的時候,將隊列最前面的幾個人放到一個新建的房間類里。 控制隊列的進(jìn)入與離開。 添加MatchMgr匹配管理類,代碼如下,usingSystem;/*匹配管理*/usingSystem.Collections.Generic;publicclassMatchMgr/單

22、例publicstaticMatchMgrinstance;/匹配列表publicListlist=newList();/開始游戲需要的人數(shù)publicintbeginNum=4,21,4,實現(xiàn)匹配功能,2. 創(chuàng)建服務(wù)端匹配管理類MatchMgr,*構(gòu)造方法*/publicMatchMgr()instance=this;/*判斷匹配隊列中是否已經(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,實現(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)入匹配隊列+player.id);CanBegi

24、n();/*將玩家移出匹配隊列*/publicvoidRemovePlayer(Playerplayer)lock(list)if(!list.Contains(player)return;player.tempData.status=PlayerTempData.Status.None;list.Remove(player);Console.WriteLine(Msgmatchout離開匹配隊列+player.id,23,4,實現(xiàn)匹配功能,3. 創(chuàng)建服務(wù)端房間類Room,Room類主要負(fù)責(zé)以下工作: 當(dāng)匹配隊列滿足人數(shù)要求時,創(chuàng)建房間,并將這些玩家添加到房間的玩家列表里。 創(chuàng)建房間時,向房間

25、中所有玩家發(fā)送匹配成功協(xié)議。 分配隊伍,以錯開的方式,比如135是紅隊、246是藍(lán)隊。 添加Room房間類,代碼如下,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;/房間publicclassRoom/狀態(tài)publicenumStatus/*準(zhǔn)備中*/Prepare=1,/*游戲中*/Fight=2,24,4,實現(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ù)據(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,實現(xiàn)匹配功能,3. 創(chuàng)建服務(wù)端房間類Room,*分配隊伍*/*返回一個隊伍的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,實現(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,實現(xiàn)匹配功能,4. 創(chuàng)建服務(wù)端協(xié)議處理方法,添加HandleMatchMsg.cs文件用來處理匹配協(xié)議,它有兩個協(xié)議處理方法Msgmatchin和Msgmatchout,代碼如下,usingSystem;usingSystem.Collections.Generic;publicpartialclassHandlePlayerMsg/進(jìn)入匹配隊列publicvoidMsgmatchin(Playerplayer,ProtocolBaseprotoBase)MatchMgr.instance.AddPlayer(player);/離開匹配隊列publicvoidMs

30、gmatchout(Playerplayer,ProtocolBaseprotoBase)MatchMgr.instance.RemovePlayer(player,28,4,實現(xiàn)匹配功能,5. 客戶端響應(yīng)匹配結(jié)果,當(dāng)匹配成功后,服務(wù)端會發(fā)送enterroom協(xié)議,客戶端接收協(xié)議后進(jìn)入到房間。 在OnShowing方法的最后注冊進(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,實現(xiàn)準(zhǔn)備功能,1. 客戶端發(fā)送準(zhǔn)備通知,當(dāng)玩家單擊“確認(rèn)”按鈕(也就是游戲中常說的準(zhǔn)備)后,向服務(wù)端發(fā)送choosedhero協(xié)議。修改確認(rèn)按鈕的點擊事件,代碼如下,確認(rèn)選擇按鈕事件publicvoidOnYesClick()/*通知服務(wù)器*/ProtocolStrprotocol=newProtocolStr();protocol.AddString(choos

32、edhero);protocol.AddString(Archer);NetMgr.instance.Send(protocol);/*點擊一次準(zhǔn)備按鈕后,按鈕就失效*/yesBtn.onClick.RemoveAllListeners(,30,5,實現(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,實現(xiàn)準(zhǔn)備功能,2. 服務(wù)端處理準(zhǔn)備結(jié)果,每當(dāng)有一個玩家提交選擇英雄協(xié)議時進(jìn)行判斷,是否可以開始戰(zhàn)斗。在Room類中添加相關(guān)方法,代碼如下,*選擇英雄*/publicvoidChoosedHero(Playerplayer,stringheroName)/修改玩家臨時數(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,實現(xiàn)準(zhǔn)備功能,2. 服務(wù)端處理準(zhǔn)備結(jié)果,當(dāng)所有玩家都準(zhǔn)備完畢時,向所有玩家發(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);/*將每一個玩家的信息逐一添加到協(xié)議中*/foreach(Playerpinplayerlist.Values)/*玩家ID*/protocol.AddString(p.id,33,5,實現(xiàn)準(zhǔn)備功能,2. 服務(wù)端處理準(zhǔn)備結(jié)果,*選擇的英雄*/protocol.AddString(p.tempData.heroName);/*所在

36、隊伍*/protocol.AddInt(p.tempData.team);/*隊伍位置*/if(p.tempData.team=1)protocol.AddInt(teamPos1+);elseprotocol.AddInt(teamPos2+);/*修改所有玩家的臨時數(shù)據(jù)*/p.tempData.status=PlayerTempData.Status.Fight;p.tempData.isAlive=true;/*廣播*/Broadcast(protocol,34,5,實現(xiàn)準(zhǔn)備功能,3. 客戶端處理回發(fā)協(xié)議,當(dāng)服務(wù)端確定可以開始游戲時,會向房間中每一個玩家發(fā)送一個fight協(xié)議,客戶端接收

37、fight協(xié)議,開始處理戰(zhàn)場。 添加協(xié)議監(jiān)聽并在關(guān)閉面板時注銷,代碼如下,*添加監(jiān)聽*/NetMgr.instance.msgDist.AddListener(fight,RecvFight,在OnClosing方法中刪除監(jiān)聽,代碼如下,publicoverridevoidOnClosing()NetMgr.instance.msgDist.DelListener(fight,RecvFight);,35,5,實現(xiàn)準(zhǔn)備功能,3. 客戶端處理回發(fā)協(xié)議,實現(xiàn)RecvFight方法,代碼如下,*處理fight協(xié)議*/publicvoidRecvFight(ProtocolBaseprotocol)P

38、rotocolStrproto=(ProtocolStr)protocol;/*開始戰(zhàn)斗*/PanelMgr.instance.OpenPanel();PanelMgr.instance.ClosePanel(this);/初始化戰(zhàn)場,稍后實現(xiàn)/BattleManager.instance.StartBattle(proto,36,6,實現(xiàn)戰(zhàn)場管理功能,1. 創(chuàng)建BattleManager戰(zhàn)場管理類,添加BattleManager.cs腳本用來處理戰(zhàn)場布置,代碼如下,usingSystem.Collections;usingSystem.Collections.Generic;usingUni

39、tyEngine;publicclassBattleManager:MonoBehaviour/*角色的預(yù)制體*/publicGameObjectarcherPre;/*戰(zhàn)場中的所有玩家*/publicDictionarylist=newDictionary();/*單例*/publicstaticBattleManagerinstance;/*皮膚*/publicMaterialmat1,mat2;voidAwake()instance=this,37,6,實現(xiàn)戰(zhàn)場管理功能,2. 添加初始化戰(zhàn)場的方法,用StartBattle方法解析fight協(xié)議,實例化協(xié)議中的每個玩家,代碼如下,*開始戰(zhàn)

40、斗*/*處理一切戰(zhàn)斗準(zhǔn)備和預(yù)設(shè)*/publicvoidStartBattle(ProtocolStrproto)/*解析協(xié)議*/stringprotoName=proto.GetString(0);intcount=proto.GetInt(1); /玩家總數(shù)/清理場景ClearBattle();/實例化每一個玩家for(inti=0;icount;i+)stringid=proto.GetString(4*i+2);stringheroName=proto.GetString(4*i+3);intteam=proto.GetInt(4*i+4);/*出生點ID*/intswopID=prot

41、o.GetInt(4*i+5);/實例化角色GenerateBattleHero(id,heroName,team,swopID,38,6,實現(xiàn)戰(zhàn)場管理功能,3. 添加清理戰(zhàn)場方法,每次開啟新戰(zhàn)斗之前需要清理戰(zhàn)場,包括清空玩家列表,恢復(fù)主攝像機的跟隨狀態(tài),銷毀所有角色和輔助物體(如準(zhǔn)心)。 添加ClearBattle方法,代碼如下,publicvoidClearBattle()/清除玩家列表list.Clear();/恢復(fù)主攝像機父級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,實現(xiàn)戰(zhàn)場管理功能,4. 創(chuàng)建角色名稱,由于是多人對戰(zhàn),為了更好地識別隊友和敵人,可以在角色的頭上增加一個3D text模型,并且讓模型始終面向主攝像機。 在Archer中添加子物體3D Text,重命名為ID,Text字體大小設(shè)置為0.3,Posi

43、tion設(shè)為(0,1.32,0,40,6,實現(xiàn)戰(zhàn)場管理功能,4. 創(chuàng)建角色名稱,為了讓名稱一直面向玩家,需要給ID添加一個腳本FaceToCamera.cs,代碼如下,usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassFaceToCamera:MonoBehaviourvoidUpdate()transform.rotation=Camera.current.transform.rotation,41,6,實現(xiàn)戰(zhàn)場管理功能,5. 創(chuàng)建出生點,游戲設(shè)定有兩組隊伍,每隊兩人。地圖上

44、需要預(yù)先設(shè)置好玩家的出生點,在場景中新建空游戲?qū)ο骃pawn,如圖6-6-2所示,具體位置玩家可以自己設(shè)置,注意出生點不可以放到地形的下面,不然角色出生的時候會掉出地圖,42,6,實現(xiàn)戰(zhàn)場管理功能,6. 實例化玩家,GenerateBattleHero主要實現(xiàn)以下幾點: 實例化角色模型,并將模型放到對應(yīng)出生點的位置。 為角色添加控制組件,為主角添加PlayerCtrl,為其他角色添加NetCtrl。 為主角設(shè)置相機跟隨。 為其他角色設(shè)置剛體。 針對不同隊伍,設(shè)置材質(zhì)和ID的顏色。 添加GenerateBattleHero方法,代碼如下,*實例化戰(zhàn)場角色*/voidGenerateBattleH

45、ero(stringid,stringheroName,intteam,intswopID)/*獲取出生點*/Transformsp=GameObject.Find(Spawn).transform;TransformswopTrans;if(team!=1,43,6,實現(xiàn)戰(zhàn)場管理功能,6. 實例化玩家,if(swopID5)Debug.LogError(swopID的格式不正確);return;/查找出生點對象swopTrans=sp.GetChild(team-1).GetChild(swopID-1);if(swopTrans=null)Debug.LogError(GenerateBa

46、ttleHero出生點錯誤!);return;if(archerPre=null)Debug.LogError(GenerateBattleHero找不到預(yù)制體!);return,44,6,實現(xiàn)戰(zhàn)場管理功能,6. 實例化玩家,*實例化角色*/實例化模型GameObjectheroObj=(GameObject)Instantiate(archerPre);/名稱heroO=id;/*位置*/heroObj.transform.localPosition=Vector3.zero;heroObj.transform.position=swopTrans.position;heroObj.transform.rotation=swopTrans.rotation;/*添加組件*/如果這個是玩家自身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,實現(xiàn)戰(zhàn)場管理功能,6. 實

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論