マルチプレイヤーゲームでのClient側からのみギミックが動かない

実現したいこと

マルチプレイヤーゲームで重力の反転をClient側からも行えるようにしたい。

前提

NetCode For GameObject を使って2Dパズルゲームを作っています。
その中のギミックの一つに重力を反転させるという機能を搭載しようと思い、それを実際に搭載してみたところOwner側からは問題なく動きましたが、Client側からはうまく作動しませんでした。
NetworkVariableで重力の状態をBool値で格納して、それを直接切り替えることで重力を変えています。

発生している問題・エラーメッセージ

InvalidOperationException: Client is not allowed to write to this NetworkVariable
Unity.Netcode.NetworkVariable`1[T].set_Value (T value) (at Library/PackageCache/com.unity.netcode.gameobjects@1.1.0/Runtime/NetworkVariable/NetworkVariable.cs:64)
GameManager.ChangeG () (at Assets/GameManager.cs:22)
GravityChanger.OnTriggerEnter2D (UnityEngine.Collider2D collision) (at Assets/Script/GravityChanger.cs:12)

該当のソースコード

当たったら重力を反転させる機能

C#

1using UnityEngine;2public class GravityChanger : MonoBehaviour 3{4 public GameManager gameManager;5 private void OnTriggerEnter2D(Collider2D collision)6 {7 collision.GetComponent<Rigidbody2D>().velocity = Vector2.zero;8 gameManager.ChangeG();9 }10}

重力を実際に反転させているスクリプト。

C#

1using Unity.Netcode;2using UnityEngine;3 4public class GameManager : NetworkBehaviour 5{6 public NetworkVariable<bool> GravityN = new NetworkVariable<bool>(true, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);7 private void Update()8 {9 if (GravityN.Value)10 {11 NormalGravity();12 }13 else14 {15 OppGravity();16 }17 }18 public void ChangeG()19 {20 GravityN.Value = !GravityN.Value;21 }22 private void NormalGravity()23 {24 Physics2D.gravity = new Vector2(0, -9.8f);25 }26 private void OppGravity()27 {28 Physics2D.gravity = new Vector2(0, 9.8f);29 }30}

試したこと

元々このように1つ目のコード内で全て済ませようとしていたが動かなかったので、今の次第になりました。

C#

1using System.Collections;2using System.Collections.Generic;3using Unity.Netcode;4using UnityEngine;5 6public class GravityChanger : NetworkBehaviour 7{8 private NetworkVariable<bool> GravityN = new NetworkVariable<bool>(true);9 private void OnTriggerEnter2D(Collider2D collision)10 {11 GravityN.Value = !GravityN.Value;12 }13 private void Update()14 {15 16 if (GravityN.Value)17 {18 OppGravity();19 }20 else21 {22 NormalGravity();23 }24 }25 private void NormalGravity()26 {27 Physics2D.gravity = new Vector2(0, -9.8f);28 29 }30 private void OppGravity()31 {32 Physics2D.gravity = new Vector2(0, 9.8f);33 }34}

RPCを使うという情報が調べたら出てきましたが、RPCは関数を呼び起こすもので共通のBool値を使うことはできなそうだったのでRPCでの解決方法もいまいちわからず何時間も画面と睨めっこをすることになってしまいました。

補足情報(FW/ツールのバージョンなど)

全て2023/2/10最新バージョンを使用しています
初めてマルチプレイヤーゲームを作っているのでいまいち仕組みを理解できていません。

コメントを投稿

0 コメント