Photon與Unity核心技術(shù)之角色動(dòng)作同步
文章作者:海洋_(CSDN )
本篇介紹關(guān)于使用Photon實(shí)現(xiàn)角色同步,客戶端還是選擇Unity開(kāi)發(fā),在實(shí)現(xiàn)動(dòng)作之前,Unity為我們提供了我們俗稱為老動(dòng)畫和新動(dòng)畫狀態(tài)機(jī),我們提供了我們俗稱為老動(dòng)畫和新動(dòng)畫狀態(tài)機(jī),我們先介紹老動(dòng)畫的實(shí)現(xiàn)方式,它是通過(guò)Animation組件把角色的動(dòng)作拖進(jìn)去的。
- 老動(dòng)畫網(wǎng)絡(luò)同步處理
老動(dòng)畫使用在Unity以前的版本中常用,效果如下所示:
在Photon中也有關(guān)于老動(dòng)畫同步的組件,如下圖所示:
也需要將Third Person Network組件拖到Observed Components組件上,這樣就完成了同步設(shè)置,Photon使用的同步方式是狀態(tài)同步,它同步包括:狀態(tài),位置,方向。我們看一下負(fù)責(zé)發(fā)送和接收消息的Third Person Network腳本代碼,如下所示:
- void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
- {
- if (stream.isWriting)
- {
- //We own this player: send the others our data
- stream.SendNext((int)controllerScript._characterState);
- stream.SendNext(transform.position);
- stream.SendNext(transform.rotation);
- }
- else
- {
- //Network player, receive data
- controllerScript._characterState = (CharacterState)(int)stream.ReceiveNext();
- correctPlayerPos = (Vector3)stream.ReceiveNext();
- correctPlayerRot = (Quaternion)stream.ReceiveNext();
- nbsp; // avoids lerping the character from "center" to the "current" position when this client joins
- if (firstTake)
- {
- firstTake = false;
- this.transform.position = correctPlayerPos;
- transform.rotation = correctPlayerRot;
- }
- }
- }
上述函數(shù)負(fù)責(zé)接收和發(fā)送消息,它使用的是Photon自帶的回調(diào)函數(shù)
- OnPhotonSerializeView
游戲中其他玩家是通過(guò)插值的方式處理的,插值函數(shù)如下所示:
- if (!photonView.isMine)
- {
- //Update remote player (smooth this, this looks good, at the cost of some accuracy)
- transform.position = Vector3.Lerp(transform.position, correctPlayerPos, Time.deltaTime * 10);
- transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 10);
- }
以為我們的插值是對(duì)于其他玩家使用的,所以做了一個(gè)if語(yǔ)句判斷,這樣就完成了同步處理,下面重點(diǎn)介紹新動(dòng)畫狀態(tài)機(jī)的處理方式。
- 新動(dòng)畫狀態(tài)機(jī)同步
新動(dòng)畫狀態(tài)機(jī)實(shí)現(xiàn)如下所示:
使用的是Animator組件,這些都是最基本的常識(shí),如果讀者有不清楚的地方可以自己看一下Unity官方文檔或者在網(wǎng)上搜一下,相關(guān)資料很多的。基本的組件已經(jīng)完成,接下來(lái)看一下如何使用同步組件?先看下圖所示的效果圖:
相比老動(dòng)畫狀態(tài)機(jī),組件明顯不一樣,新增加了兩個(gè)組件,一個(gè)是Photon Animator View,該組件主要是針對(duì)新動(dòng)畫狀態(tài)機(jī)的層設(shè)置,比如下圖所示:
上圖是我們?cè)O(shè)置的角色新動(dòng)畫狀態(tài)機(jī)的Layer,另外我們還有一些Parameters參數(shù)設(shè)置,如下圖所示:
對(duì)應(yīng)的角色組件Photon Aniamtor View如下所示:
該組件在Photon NetWork都有,讀者可以自行查看,這里只是告訴讀者如何使用。
接下來(lái)再看同步的組件 Photon Transform View組件,它里面包括 同步位置,方向,縮放,這個(gè)與老動(dòng)畫狀態(tài)機(jī)不同,效果如下所示:
在Synchronize Position中還有兩個(gè)選項(xiàng)要注意,一個(gè)是Interpolate Option,這個(gè)表示的是同步NPC的插值方式,一般采用的就是Lerp線性插值,插值速度默認(rèn)是1,這個(gè)可以根據(jù)自身情況調(diào)整數(shù)值。這樣我們就完成了角色同步,然手使用接口:
- PhotonNetwork.Instantiate
實(shí)例化角色,可以看到同步的情況了,效果如下所示:
因?yàn)槭褂玫氖悄J(rèn)的Photon國(guó)外服務(wù)器,有點(diǎn)延遲,如果服務(wù)器在國(guó)內(nèi)或者自己搭建一個(gè)沒(méi)有任何問(wèn)題。
unity資源下載:http://m.594ljc.cn/club/forum-51-1.html
-
分享到:
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
- 用戶名:
- 密 碼:
- 驗(yàn)證碼: 看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條