? 亚洲AV无码专区亚洲AV伊甸园,国产精品无码在线观看
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

Photon與Unity核心技術(shù)之角色動作同步

來源: 納金網(wǎng) | 責(zé)任編輯:傳說的落葉 | 發(fā)布時間: 2018-03-16 11:06 | 瀏覽量:
文章標(biāo)題:Photon與Unity核心技術(shù)之角色動作同步
文章作者:海洋_(CSDN )


本篇介紹關(guān)于使用Photon實現(xiàn)角色同步,客戶端還是選擇Unity開發(fā),在實現(xiàn)動作之前,Unity為我們提供了我們俗稱為老動畫和新動畫狀態(tài)機,我們提供了我們俗稱為老動畫和新動畫狀態(tài)機,我們先介紹老動畫的實現(xiàn)方式,它是通過Animation組件把角色的動作拖進去的。


  • 老動畫網(wǎng)絡(luò)同步處理

老動畫使用在Unity以前的版本中常用,效果如下所示:

Photon與Unity核心技術(shù)之角色動作同步9

 

在Photon中也有關(guān)于老動畫同步的組件,如下圖所示:

Photon與Unity核心技術(shù)之角色動作同步8

 

也需要將Third Person Network組件拖到Observed Components組件上,這樣就完成了同步設(shè)置,Photon使用的同步方式是狀態(tài)同步,它同步包括:狀態(tài),位置,方向。我們看一下負責(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ù)負責(zé)接收和發(fā)送消息,它使用的是Photon自帶的回調(diào)函數(shù)


  • OnPhotonSerializeView  

游戲中其他玩家是通過插值的方式處理的,插值函數(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);  
  • }  

以為我們的插值是對于其他玩家使用的,所以做了一個if語句判斷,這樣就完成了同步處理,下面重點介紹新動畫狀態(tài)機的處理方式。


  • 新動畫狀態(tài)機同步

新動畫狀態(tài)機實現(xiàn)如下所示:

Photon與Unity核心技術(shù)之角色動作同步7

 

使用的是Animator組件,這些都是最基本的常識,如果讀者有不清楚的地方可以自己看一下Unity官方文檔或者在網(wǎng)上搜一下,相關(guān)資料很多的?;镜慕M件已經(jīng)完成,接下來看一下如何使用同步組件?先看下圖所示的效果圖:

Photon與Unity核心技術(shù)之角色動作同步6

 

相比老動畫狀態(tài)機,組件明顯不一樣,新增加了兩個組件,一個是Photon Animator View,該組件主要是針對新動畫狀態(tài)機的層設(shè)置,比如下圖所示:

Photon與Unity核心技術(shù)之角色動作同步5

 

上圖是我們設(shè)置的角色新動畫狀態(tài)機的Layer,另外我們還有一些Parameters參數(shù)設(shè)置,如下圖所示:

Photon與Unity核心技術(shù)之角色動作同步4

 

對應(yīng)的角色組件Photon Aniamtor View如下所示:

Photon與Unity核心技術(shù)之角色動作同步3

 

該組件在Photon NetWork都有,讀者可以自行查看,這里只是告訴讀者如何使用。

接下來再看同步的組件 Photon Transform View組件,它里面包括 同步位置,方向,縮放,這個與老動畫狀態(tài)機不同,效果如下所示:

Photon與Unity核心技術(shù)之角色動作同步2

 

在Synchronize Position中還有兩個選項要注意,一個是Interpolate Option,這個表示的是同步NPC的插值方式,一般采用的就是Lerp線性插值,插值速度默認是1,這個可以根據(jù)自身情況調(diào)整數(shù)值。這樣我們就完成了角色同步,然手使用接口:


  • PhotonNetwork.Instantiate  

實例化角色,可以看到同步的情況了,效果如下所示:

Photon與Unity核心技術(shù)之角色動作同步1

 

因為使用的是默認的Photon國外服務(wù)器,有點延遲,如果服務(wù)器在國內(nèi)或者自己搭建一個沒有任何問題。
unity資源下載:http://studio-ampersand.com/club/forum-51-1.html


相關(guān)文章
網(wǎng)友評論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊

關(guān)閉

全部評論:0條

推薦
熱門