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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

1回答

3218閲覧

UnityでRPCを使用して変数を受け渡したい

sakuramoti

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2020/02/09 14:30

編集2020/02/09 14:32

前提・実現したいこと

UnityでPhotonを使用して変数の受け渡しをしたいです。
流れとしては下記のように考えています。
・オブジェクトA,B(同一のUnityChanprefab)をネットワークインスタンスで生成。
・AがBに攻撃し、Bにヒットした際にAからRPCを用いてBに変数を受け渡し。
・Bが変数を受け取り、ダメージアニメーションを実行。

やってみたこと

1、UnityChanのprefab(両方とも同じもの)をネットワークインスタンス化し2つアプリを実行
2、ネットワークインスタンス化したUnityChanからRPCを用いて自分以外のターゲットで関数を実行

該当のソースコード(1の部分)

C#

1public class SimplePun : MonoBehaviourPunCallbacks 2{ 3 // Start is called before the first frame update 4 void Start() 5 { 6 PhotonNetwork.ConnectUsingSettings(); 7 } 8 void OnGUI() 9 { 10 GUILayout.Label(PhotonNetwork.NetworkClientState.ToString()); 11 } 12 13 public override void OnConnectedToMaster() 14 { 15 PhotonNetwork.JoinRoom("Room"); 16 } 17 18 public override void OnJoinedRoom() 19 { 20 GameObject unityChan = PhotonNetwork.Instantiate("unitychan", Vector3.zero, Quaternion.identity, 0); 21 //unityChan.GetComponent<UnityChanController>().enabled = true; 22 //unityChan.GetComponent<Animator>().enabled = true; 23 24 } 25 public override void OnJoinRoomFailed(short returnCode, string message) 26 { 27 PhotonNetwork.CreateRoom("Room"); 28 } 29}

該当のソースコード(2の部分)

C#

1 2private bool damageAnimFlag; 3void Start () { 4 damageAnimFlag = false; 5 } 6void Update() 7 { 8 if (photonView.IsMine) 9 { 10 Debug.Log(damageAnimFlag);//RPCのSetDamageAnimationが実行されてもずっとfalseのままになってしまう。 11 if (damageAnimFlag == true)//damageAnimFlagにtrueが入ったら(RPCで値を渡したい) 12 { 13 playDamageAnimation();//ダメージを受けるアニメーションを実行 14 damageAnimFlag = false; 15 } 16 } 17 18void OnTriggerEnter(Collider other) 19 { 20 if (photonView.IsMine) 21 { 22 if (animator.GetBool("isAttack") == true && other.CompareTag("Player"))//プレイヤーの攻撃が他のプレイヤーにあったった時にDamageアニメーションを実行させるために値を送信。 23 { 24 photonView.RPC("SetDamageAnimation", RpcTarget.Others, true); 25 this.setCapsuleCollider(false); 26 } 27 } 28 } 29 30 [PunRPC] 31 void SetDamageAnimation(bool flag) 32 { 33 //Debug.Log("Execute RPC"); 34 this.damageAnimFlag = flag; 35 //Debug.Log(damageAnimFlag);ここにはtrueがはいっている 36 }

### 結果
他のインスタンスの変数に値がうまく入らない。
SetDamageAnimationが実行されてdamageAnimFlagにはtrueが入っているのだが、update関数内のdamageAnimFlagにはtrueが入らず
falseのままダメージアニメーションが実行されない。

どなたか原因を教えていただけないでしょうか。
また、RPCを用いて他オブジェクトに変数を渡したい場合はどのようにすれば良いのでしょうか。

今回RPCを使用してダメージアニメーションを実行させようとしておりますが、
通常はどのように実装するのが良いかよければ教えていただけないでしょうか。
(足りない情報、必要な情報がございましたら補足いたしますのでよろしくお願いいたします。)

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

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

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

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

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

guest

回答1

0

ベストアンサー

Photonやってたのは大分前なので細かい部分がうろ覚えです

このソースを見ると、受信側のphotonView.IsMine==trueということは、
送信側がphotonView.IsMine==falseのオブジェクトから送っていることになります

Photonって基本的にphotonView.IsMine==trueとなるクライアントが操作するべきなので、
このような送信方法はおかしいように思います

多分ですけど、SetDamageAnimationが実行されたインスタンスと
Updateで見ているインスタンスが異なっているせいに見えます

投稿2020/02/10 01:41

izmktr

総合スコア2856

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

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

sakuramoti

2020/02/11 03:02 編集

izmktr様  ご回答ありがとうございます。頂いた回答より自分の中で下記のように勘違いに気づきました。 おそらくあっていると思うのですが間違いなどございましたらご指摘いただけないでしょうか。 質問前の勘違いの状況 ・端末AでDogというキャラクタをネットワークインスタンス化 ・端末BでCatというキャラクタをネットワークインスタンス化 ↓ ・端末AにはDogとCatが表示されている状態(DogがIsMine,Catが!IsMine) ・端末BにはCatとDogが表示されている状態(CatがIsMine,Dogが!IsMine)  端末AでDogがCatに攻撃した際にRPCを用いて端末A内のCatの情報を更新できると思っていた。  (RpcTarget.Othersが同端末のDog以外(Cat)と勘違いしていた。そのためDog(IsMine)がCatに攻撃した際にRpcで端末BのCatのdamageFlagをtrueセットしようとしていた。) 実際は。。。。 IsMineの中で実行しているため端末AのDogのdamageFlagがセットされるだけ。さらにその情報をRpctarget.Othersで渡しているので同期されるのはDogの情報だけ。 今回質問の際には端末BのCatの情報をIsMineでUpdateをかけていたのでdamageFlagが更新されなかったということであっているでしょうか。 質問後(勘違いに気づいた後): ・Rpctarget.ohtersは自分の端末以外で実行することに気づいた。 よってソースコートを 端末AのDogがCatに攻撃した際に,!IsMineであるCatのdamageFlagをtrueにする。 その情報をRpcを用いて端末Bにて同期させる。というようにコードを書き換えました。 わかったこと: Rpcは端末内のインスタンスごとではなく、クライアント(端末)単位で情報をやりとりするという理解でよろしいでしょうか。 Photonまだ全然理解ができておらず変な勘違いを起こしてしまいました。 それにも関わらず、おかしな部分に気づいてくださり感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問