This document is about: FUSION 1
SWITCH TO

This page is a work in progress and could be pending updates.

4 - Network Properties

概述

這個章節展示了如何使用Networked Properties以透過網路來同步玩家的位置之外的額外的資訊。

網路屬性

Fusion同步NetworkObjects的轉換,在您新增NetworkTransform元件到它們的時候。其他狀態,比如在您的指令碼中的變數,不會透過網路被同步。為了讓狀態透過網路被同步,需要一個[Networked]屬性。已連網屬性從StateAuthority同步它們的狀態到所有其他客戶端。

如果一個客戶端更改一個它沒有StateAuthority的物件上的已連網屬性,則該更改不會透過網路同步,而是作為一個本機預測,並且可以在未來被來自StateAuthority的更改所覆寫。請小心地只更新在StateAuthority上的已連網屬性,如果您希望它在每個客戶端上更新的話。

針對網路屬性的一個簡單的示例是一個玩家的顏色。首先建立一個新的指令碼並且命名它為PlayerColor。新增一個已連網屬性以及一個公共欄位,以參照物件的MeshRender到它。

C#

using Fusion;
using UnityEngine;

public class PlayerColor : NetworkBehaviour
{
    public MeshRenderer MeshRenderer;

    [Networked]
    public Color NetworkedColor { get; set; }
}

請注意,已連網屬性必須是屬性({get; set;}),不支援常規欄位。

更新的下一步是新增程式碼,其允許StateAuthority來更改顏色:

C#

void Update()
{
    if (Input.GetKeyDown(KeyCode.E))
    {
        // Changing the material color here directly does not work since this code is only executed on the client pressing the button and not on every client.
        NetworkedColor = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
    }
}

當按下按鈕時,MeshRender的顏色不會立即改變。取而代之地,更新已連網屬性。這樣做的話,顏色的更改將被複製到所有客戶端上。針對各個客戶端的剩下的事情是檢查對於已連網屬性的更改,並且相應地調整網格顏色。

在Fusion中,這是透過OnChanged回調來完成。首先建立一個將在已連網屬性改變時被調用的函數:

C#

private static void NetworkColorChanged(Changed<PlayerColor> changed)
{
    changed.Behaviour.MeshRenderer.material.color = changed.Behaviour.NetworkedColor;
}

需要被改變的參數,其提供您存取到NetworkBehaviour執行個體,這是被更改到取得/設定屬性的執行個體。請注意,該類型是Changed<PlayerColor>,其為NetworkBehaviour的類型,並且不僅僅是已連網顏色已連網屬性的類型。

最後,為了將回調掛鉤到屬性,請以以下內容替換[Networked]屬性:

C#

[Networked(OnChanged = nameof(NetworkColorChanged))]
public Color NetworkedColor { get; set; }

新增PlayerColor元件到玩家物件,並且從內插補點目標來鏈接MeshRender。輸入遊玩模式並且按下E。您可以在編輯檢視中檢查到,玩家正在更改顏色。在這個時候,您也可以建立一個組件,來驗證顏色在網路上被正確地同步。

下一章是共享模式基礎5 - 遠端程序調用

Back to top