找回密碼
 注冊帳號

掃一掃,訪問微社區

網絡視圖

2015-1-6 18:56| 發布者: 楊炎| 查看: 1652| 評論: 0|原作者: 蠻牛|來自: unity3d腳本manual

摘要: 網絡視圖網絡視圖 (network view)是 unity 中制作網絡多人游戲的網關。網絡視圖使用起來很簡單,但功能卻非常強大。由于這個原因,我們建議在您開始使用網絡視圖 (network view) 功能之前先了解網絡的基本概念。您可 ...

網絡視圖

網絡視圖 (network view)是 unity 中制作網絡多人游戲的網關。網絡視圖使用起來很簡單,但功能卻非常強大。由于這個原因,我們建議在您開始使用網絡視圖 (network view) 功能之前先了解網絡的基本概念。您可以在狀態同步類型。

關閉 (off)

“狀態同步”(state synchronization) 功能未使用。如果您只想發送rpcs,那這是最佳選擇

可靠的差值壓縮 (reliable delta compressed)

會發送前一個狀態和當前狀態之間的差值。如果沒有任何更改,則不發送任何東西。這種模式是有序的。如果數據包丟失,會自動重新發送該數據包

不可靠 (unreliable)

將發送完整狀態。這會使用更多的帶寬,但數據包丟失造成的影響降到了最低

觀察數據 (observed)

將在網絡上發送的組件 (component)數據

視圖 id (view id)

該“網絡視圖”(network view) 的唯一識別符。這些值在“檢視器”(inspector) 中是只讀的

場景 id (scene id)

網絡視圖”(network view)在該特定場景中的數字 id

類型 (type)

保存場景 (scene)或或在運行時分配 (allocated)

詳細信息

當將“網絡視圖”(network view) 添加到“游戲對象”(gameobject) 時,您必須確定兩樣東西

需要“網絡視圖”(network view) 發送什么樣的數據

需要如何發送該數據

選擇要發送的數據

“網絡視圖”(network view) 的觀察數據 (observed)屬性可以包含單個組件 (component)。變換組件 (transform)動畫 (animation)剛體 (rigidbody)或者腳本。無論觀察數據 (observed)組件是什么,其相關數據都將通過網絡發送。您可以從下拉菜單中選擇一個組件 (component),或直接將任一組件 (component) 頁眉拖到變量。如果不直接發送數據,只是使用 rpc 調用,那么可以關掉同步功能(沒有直接發送的數據),并且不需要設置為“觀察數據”(observed) 屬性。rpc 調用只需有單獨的網絡視圖,因此,如果已經有了一個視圖,則不需要專門為 rpc 添加視圖。

如何發送數據

發送觀察數據 (observed)組件的數據有兩種方式:狀態同步 (state synchronization)遠程過程調用 (remote procedure calls)

要使用“狀態同步”(state synchronization)功能,請將“網絡視圖”(network view) 的狀態同步 (state synchronization) 設置為可靠的差值壓縮 (reliable delta compressed)不可靠 (unreliable)觀察數據 (observed)組件的數據將立即通過網絡自動發送。

可靠的差值壓縮 (reliable delta compressed)是有序的。數據包總是按其發送順序接收。如果某個數據包丟失,則會重新發送該數據包。在前一個數據包收到之前,該數據包之后的所有數據包都會排隊等待發送。只發送前一傳輸值和當前值的差值。如果沒有差值,則不發送任何數據。

如果是在觀察腳本 (script),則必須在該腳本內明確序列化 (serialize) 數據。在onserializenetworkview()函數中進行此項操作。

function onserializenetworkview (stream : bitstream, info : networkmessageinfo) {

var horizontalinput : float = input.getaxis ("horizontal");

stream.serialize (horizontalinput);

}

當收到更新時,以上函數總是(將流的更新)寫入水平輸入 (horizontalinput),否則從寫入流的變量讀取。如果在接收或發送更新時想嘗試不同的方式,可使用 bitstream 類別中的iswriting屬性。

function onserializenetworkview (stream : bitstream, info : networkmessageinfo) {

var horizontalinput : float = 0.0;

if (stream.iswriting) {

// 正在發送

horizontalinput = input.getaxis ("horizontal");

stream.serialize (horizontalinput);

} else {

// 正在接收

stream.serialize (horizontalinput);

// ... 用接收到的變量做有意義的事

}

}

onserializenetworkview是根據網絡管理器項目設置中指定的sendrate調用的。在默認情況下每秒調用 15 次。

如果想在腳本中使用“遠程過程調用”(remote procedure calls),只需附加有腳本的同一個“游戲對象”(gameobject) 中有網絡視圖 (networkview) 組件。“網絡視圖”(networkview) 也可用于其他地方,如果只用于發送 rpc,則沒有腳本觀察,并且“狀態同步”(state synchronization) 功能關閉。這個可以從網絡調用的函數必須具有@rpc屬性。現在,您可從附加到同一個“游戲對象”(gameobject) 的任何腳本調用networkview.rpc()來執行“遠程過程調用”(remote procedure call)。

var playerbullet : gameobject;

function update () {

if (input.getbuttondown ("fire1")) {

networkview.rpc ("playerfire", rpcmode.all);

}

}

@rpc

function playerfire () {

instantiate (playerbullet, playerbullet.transform.position, playerbullet.transform.rotation);

}

rpc 得到了可靠傳輸并有序排列。有關 rpc 的更多詳細信息,請參閱rpc 詳細信息頁面。

提示

如果您仍然不清楚如何使用“網絡視圖”(network views),請通讀網絡參考指南。

使用“遠程過程調用”(remote procedure calls) 時不需要禁用“狀態同步”(state synchronization)。

如果您有一個以上的“網絡視圖”(network view),并想調用某個特定網絡視圖上的 rpc,請使用getcomponents(networkview)[i].rpc()函數。

相關閱讀

文章點評
相關文章
女校游泳队彩金