質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

196閲覧

UnityのPUN2でRPCを使用した同期ができません。

water

総合スコア6

Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/10/11 06:17

RPCを使用して下記のコードのFireBullet関数を同期したいです。

Unity EditorとAndroid Studioのエミュレータを使用し2人のプレイヤーで実行してみるとFireBullet関数内にあるDebug.LogはUnity Editor側のものしか呼ばれていません。これはRPCで同期が出来ていない事を示しているという事ですよね?
このスクリプトがアタッチされているゲームオブジェクトには、PhotonViewコンポーネントもアタッチされています。
RPCを呼び出しているのは97行目、RPCで同期したい関数は100行目です
このコードでRPCでの同期がされない原因を教えてください。

該当のソースコード

C#

1 1 using System.Collections; 2 2 using System.Collections.Generic; 3 3 using UnityEngine; 4 4 using Photon.Realtime; 5 5 using Photon.Pun; 6 6 7 7 8 8 public class UnkoBon : MonoBehaviourPunCallbacks 9 9 { 10 10 [SerializeField] private GameObject Unkoman; 11 11 12 12 13 13 // 弾を生成する位置情報 14 14 15 15 private Vector3 instantiatePosition; 16 16 17 17 // 弾の生成座標(読み取り専用) 18 18 19 19 public Vector3 InstantiatePosition 20 20 { 21 21 get { return instantiatePosition; } 22 22 private set { instantiatePosition = value; } 23 23 } 24 24 25 25 [SerializeField, Range(10f, 150f), Tooltip("弾の射出する速さ")] 26 26 private float speed = 1.0F; 27 27 28 28 // 弾の初速度 29 29 private Vector3 shootVelocity; 30 30 31 31 // 弾の初速度(読み取り専用) 32 32 public Vector3 ShootVelocity 33 33 { 34 34 get { return shootVelocity; } 35 35 private set { shootVelocity = value; } 36 36 } 37 37 38 38 Camera MainCamera; 39 39 Vector3 CameraAngle; 40 40 Vector3 UnkoManAngle; 41 41 Vector3 UnkoBonAngle; 42 42 Animator Anim; 43 43 [SerializeField] 44 44 GameObject Unko; 45 45 public GameObject unko 46 46 { 47 47 get { return Unko; } 48 48 private set { Unko = value; } 49 49 } 50 50 Rigidbody Unkorid; 51 51 Rigidbody Goldrid; 52 52 [SerializeField] 53 53 GameObject GoldUnko; 54 54 UnkomanAnim UnkomanAnim; 55 55 56 56 bool UntiburiFlag; 57 57 bool BulletFire; 58 58 [SerializeField] 59 59 GameObject Explosion; 60 60 61 61 InputControl InputControl; 62 62 63 63 64 64 65 65 66 66 void Start() 67 67 { 68 68 MainCamera = Camera.main; 69 69 UnkomanAnim = Unkoman.GetComponent<UnkomanAnim>(); 70 70 Anim = Unkoman.GetComponent<Animator>(); 71 71 InputControl = GameObject.Find("SampleScene").GetComponent<InputControl>(); 72 72 73 73 Unko.SetActive(false); 74 74 GoldUnko.SetActive(false); 75 75 Unkorid = Unko.GetComponent<Rigidbody>(); 76 76 Goldrid = GoldUnko.GetComponent<Rigidbody>(); 77 77 78 78 } 79 79 80 80 void Update() 81 81 { 82 82 if (photonView.IsMine == false) return; 83 83 84 84 CameraAngle = MainCamera.transform.eulerAngles; 85 85 UnkoManAngle = Unkoman.transform.eulerAngles; 86 86 87 87 // 弾の生成座標を更新 88 88 instantiatePosition = this.transform.position; 89 89 this.transform.rotation = Quaternion.Euler(CameraAngle.x - 15f, UnkoManAngle.y, 0f); 90 90 91 91 UnkoBonAngle = this.transform.forward; 92 92 93 93 // 弾の初速度を更新 94 94 shootVelocity = UnkoBonAngle * speed; 95 95 96 96 97 97 photonView.RPC(nameof(FireBullet), RpcTarget.All); 98 98 } 99 99 [PunRPC] 100100 void FireBullet(){ 101101 Debug.Log($"RPC{PhotonNetwork.LocalPlayer.ActorNumber}"); 102102 switch (UnkomanAnim.UntiburiAnim) 103103 { 104104 //NormalUnkoを生成/射出する処理 105105 case 1: 106106 { 107107 //Untiburiが再生されたという情報を記憶する 108108 if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Untiburi") == true) UntiburiFlag = true; 109109 110110 //Untiburiの再生が終わったタイミングでのみこのコードが実行される 111111 //Untiburiを再生した後に1回だけうんこを撃てるようにする 112112 if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Untiburi") == false && UntiburiFlag == true) 113113 { 114114 BulletFire = true; 115115 UntiburiFlag = false; 116116 } 117117 118118 //うんこをアクティブにして飛ばす 119119 if (InputControl.UntiburiInputUp == true && BulletFire == true) 120120 { 121121 Unko.transform.position = instantiatePosition; 122122 Unko.SetActive(true); 123123 Unkorid.AddForce(shootVelocity, ForceMode.Impulse); 124124 125125 BulletFire = false; 126126 } 127127 } 128128 break; 129129 //GoldUnkoを生成/射出する処理 130130 case 2: 131131 { 132132 // '' 133133 if (Anim.GetCurrentAnimatorStateInfo(0).IsName("GoldUntiburi") == true) UntiburiFlag = true; 134134 // '' 135135 if (Anim.GetCurrentAnimatorStateInfo(0).IsName("GoldUntiburi") == false && UntiburiFlag == true) 136136 { 137137 BulletFire = true; 138138 UntiburiFlag = false; 139139 } 140140 141141 142142 // '' 143143 if (InputControl.UntiburiInputUp == true && BulletFire == true) 144144 { 145145 //うんこが爆発中に次のうんこを発射すると自分の所に爆発状態のうんこが生成される 146146 //なのでここで爆発をオフにする。 147147 //Explosion.SetActive(false); 148148 Explosion.transform.GetChild(1).GetComponent<Collider>().enabled = false; 149149 150150 151151 152152 GoldUnko.transform.position = instantiatePosition; 153153 GoldUnko.SetActive(true); 154154 Goldrid.AddForce(shootVelocity * 1.1f, ForceMode.Impulse); 155155 156156 BulletFire = false; 157157 } 158158 } 159159 break; 160160 } 161161 } 162162 }

試したこと

zenn.dev/のpun2チュートリアルを参照しながら作業しており、他にもwebで検索をしたのですが解決できませんでした、、

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

Unity 2020.3.4f LTS

RPC同期が行われていない直接の原因とはあまり関係ないかもしれませんが

”NullReferenceException: Object reference not set to an instance of an object UnkoBon.FireBullet () (at Assets/C# Script/PlayerScript/UnkoBon.cs:103)”

というエラーも出ています。
恐らくこのエラーが原因でRPC同期自体は成功したとしても弾の発射は同期されないと予想できますが、まずはRPCの同期を成功させたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

チュートリアルを見る限り、私のコード自体にはRPC同期ができない原因になる問題は特に無いように見えます。
実際、特にコードを改変していないにも関わらず現在はDebug.Logで他プレイヤーのActorNumberを取得できるようになりました。実行時、取得できる時とやはり自分のRPCしか取得できない時とがあり安定していないのですが、こちらのコード自体にはにRPC同期がされない要因は無かったという事で、一旦質問を閉じさせて頂きます。

投稿2023/10/12 04:44

water

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問