This document is about: FUSION 2
SWITCH TO

4 - Network Properties

概述

本章節介紹如何使用Networked Properties來透過網路同步玩家位置之外的其他資料。

網路屬性

當您向NetworkObjects的轉換新增一個NetworkTransform元件時,Fusion會同步該轉換。您的指令碼中的變數等其他狀態不會透過網路同步。若要透過網路同步狀態,需要[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 (HasStateAuthority && 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中,這是透過ChangeDetection完成的。在共享模式中,最簡單的方法是使用OnChangedRender屬性。首先新增一個函數,該函數將在NetworkedColor更改時執行。

C#

void ColorChanged()
{
    MeshRenderer.material.color = NetworkedColor;
}

然後使用OnChangedRender屬性調整已連網屬性:

C#

[Networked, OnChangedRender(nameof(ColorChanged))]
public Color NetworkedColor { get; set; }

在各個轉譯幀(Unity更新)期間檢測到屬性發生更改時,這個屬性都會調用ColorChanged函數。

PlayerColor元件新增到PlayerCharacter預製件中,並連結玩家上的MeshRender。進入遊玩模式,然後按E。您可以在編輯檢視中檢查玩家是否正在更改顏色。此時,您還可以建立一個組建,以驗證顏色是否在網路上正確同步。

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

Back to top