This document is about: FUSION 2
SWITCH TO

5 - RPCs

概述

在上個章節中,新增了一個已連網屬性來將玩家的顏色同步到所有其他玩家。由於玩家對自己的已連網屬性擁有StateAuthority,他們可以直接更新自己的顏色值。

但是,這不適用於StateAuthority是另一個客戶端的NetworkObjects的已連網屬性。

本節包含攻擊玩家而需要修改另一個玩家的已連網屬性以降低其生命值的示例。

修改另一個玩家的已連網屬性

更改另一個客戶端具有State Authority的已連網屬性的方法,是向物件的StateAuthority發送RPC(遠端程序調用),並讓它們更改已連網屬性。

雖然可以透過程式碼更改已連網屬性的值。更改將僅在本機應用,而不會透過網路進行複製。

這方面的例子是用射線投射武器向玩家射擊。Fusion共享模式的一個簡單執行方式是讓玩家在本機執行射線投射,如果它擊中目標,則對目標施加傷害。請注意,在伺服器/主機端模式下使用射線投射武器的方法是不同的。請查看Fusion拋射物範例,了解伺服器/主機端模式示例。

建立一個新指令碼並將其命名為Health。新增已連網屬性和更改偵測函數,以記錄健康值的更改:

C#

using Fusion;
using UnityEngine;

public class Health : NetworkBehaviour
{
    [Networked, OnChangedRender(nameof(HealthChanged))]
    public float NetworkedHealth { get; set; } = 100;

    void HealthChanged()
    {
        Debug.Log($"Health changed to: {NetworkedHealth}");
    }
}

接下來新增一個RPC,射手可以調用該RPC對敵方玩家造成傷害:

C#

    [Rpc(RpcSources.All, RpcTargets.StateAuthority)]
    public void DealDamageRpc(float damage)
    {
        // The code inside here will run on the client which owns this object (has state and input authority).
        Debug.Log("Received DealDamageRpc on StateAuthority, modifying Networked variable");
        NetworkedHealth -= damage;
    }

RpcSources.All允許任何人調用RPC。預設下,只有InputAuthority(與共享模式中的StateAuthority相同)可以調用RPC。

RpcTargets.StateAuthority使得只有StateAuthority接收RPC。這樣做是因為StateAuthority隨後將更新Health已連網屬性。RPC函數內部的程式碼運行在RpcTarget客戶端上,因此在本例中運行在StateAuthority上,其可以更改自己的已連網屬性。

接下來建立一個新指令碼,並將其命名為RaycastAttack。向其中新增以下程式碼:

C#

using Fusion;
using UnityEngine;

public class RaycastAttack : NetworkBehaviour
{
    public float Damage = 10;

    public PlayerMovement PlayerMovement;

    void Update()
    {
        if (HasStateAuthority == false)
        {
            return;
        }

        Ray ray = PlayerMovement.Camera.ScreenPointToRay(Input.mousePosition);
        ray.origin += PlayerMovement.Camera.transform.forward;

        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            Debug.DrawRay(ray.origin, ray.direction, Color.red, 1f);
        }
    }
}

這個程式碼是射線投射的一個簡單的單一玩家執行方式。HasStateAuthority檢查僅用於在StateAuthority上執行此程式碼,因此當玩家按下發射按鈕時,只有他們自己的玩家角色發射射線投射。

現在要對目標應用損傷,剩下要做的就是調用它上面的RPC函數。Debug.DrawRay行之後新增以下內容:

C#

if (Runner.GetPhysicsScene().Raycast(ray.origin,ray.direction, out var hit))
{
    if (hit.transform.TryGetComponent<Health>(out var health))
    {
        health.DealDamageRpc(Damage);
    }
}

完成後,將HealthRaycastAttack元件新增到玩家預製件中,並建立一個組建。

其他RPC使用案例

要求狀態授權修改已連網屬性是最常見的RPC使用案例。

RPC的其他有效使用案例包括:

  1. 在玩家之間發送嘲諷訊息或其他情緒性的非遊戲遊玩互動。
  2. 啟動遊戲(在遊戲模式、地圖上投票,或者只是向主機端指出玩家已經準備好)。

在大多數案例下,狀態同步本身就足以保持玩家的一致性,向已連網屬性新增更改偵測器可以處理大多數過渡案例,在這些案例下,應用程式關心的是狀態的更改,而不僅僅是實際狀態本身。

遊玩遊戲

恭喜您!您已成功完成Fusion共享模式基礎教學。為了確保一切正常運行,現在是時候遊玩和測試遊戲了。

在Unity中啟動組建並進入遊玩模式,然後按Start Shared Client。以右鍵按一下另一個玩家,會在控制台中顯示訊息,顯示他們的健康值下降。

您也可以在Unity的階層檢查器中檢查已連網屬性的Health值。

下一章是 共享模式基礎6 - 下一步是什麼

Back to top