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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

1172閲覧

[Unity]Photonを使ったゴール時の勝敗判定がうまくいきません。

araragi_dev

総合スコア60

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/01/17 08:17

編集2022/01/17 08:21

■概要
UnityとPhotonでオンライン対戦ゲームを作っております。
ゴール時の勝敗判定がうまく行かず、悩んでおります。

■詳細
Player[1]がゴールすると、PunRPCのRpcGoalメソッドを各プレイヤーで実行します。
その際に、ゴールしたプレイヤー名を引数で渡し、勝者を全員に知らせます。
メソッド内で、winner_name変数に勝者のプレイヤー名(Player[1])を代入します。
if文で勝者が誰かを判断し、勝敗表示をしますが、何故かPlayer[2]にも勝利判定がついてしまいます。
ログを確認してもwinner_nameもthis.gameObject.nameも共にPlayer[1]になっていますが、Player[2]も反応してしまいます。
原因がわからず、ご教授いただけますと幸いです。

■スクリーンショット
イメージ説明

■ソースコード
※補足
キャラそれぞれに下記のソースコードがついております。

C#

1※省略※ 2 3 private string winner_name = ""; 4 5 void OnCollisionEnter(Collision collision) 6 { 7 //ゴール着地時の処理 ※ここはゴールしたプレイヤーのみ働いてそう 8 if (photonView.IsMine && collision.gameObject.name == "Goal_Floor") 9 { 10 //ゲーム終了フラグが立っていない場合 11 if (totitle_time_frag == 0) 12 { 13 if (winner_name == "") 14 { 15 Debug.Log("ゴールに触れた"); 16 photonView.RPC(nameof(RpcGoal),RpcTarget.All, gameObject.name);//勝利したプレイヤー名を全体に投げる 17 } 18 //再度判定が入らないようにフラグ処理 19 totitle_time_frag = 1; 20 Debug.Log("totitle_time_fragを1に"); 21 } 22 23※省略※ 24 25 [PunRPC] 26 private void RpcGoal(string player) 27 { 28 winner_name = player;//勝者の名前を入れる 29 Debug.Log("勝者は:" + winner_name + " 自身は" + this.gameObject.name); 30 31 //★何故かこれが両者で反応してしまっている。photonView.IsMineをどこかで使う必要がある?不明 32 if (winner_name == this.gameObject.name) 33 { 34 //自身が勝者の場合 35 winorlose_object = GameObject.Find("WinOrLose"); 36 Text winorlose_text = winorlose_object.GetComponent<Text>(); 37 38 // テキストの表示を入れ替える 39 winorlose_text.text = "おめでとう!勝利  10秒後にタイトルに戻ります"; 40 41 } 42 else 43 { 44 //自身が敗者の場合 ここが反応しない 45 winorlose_object = GameObject.Find("WinOrLose"); 46 Text winorlose_text = winorlose_object.GetComponent<Text>(); 47 48 // テキストの表示を入れ替える 49 winorlose_text.text = "残念…あなたの負け 10秒後にタイトルに戻ります"; 50 totitle_time_frag = 1; 51 Debug.Log("敗北時の処理 敗北プレイヤーは" + gameObject.name); 52 } 53 } 54※省略※ 55

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

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

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

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

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

kyooo_

2022/01/18 04:36

試しに、 [PunRPC] private void RpcGoal(string player) { if ( ! photonView.IsMine ) return; で、ローカルプレイヤー以外は抜けるようにしてもダメですかね?
araragi_dev

2022/01/18 12:07

kyooo_さん いつもありがとうございます! 早速試してみます!
araragi_dev

2022/01/21 03:36

Kyooo_さん RpcGoalを呼んだ勝者のプレイヤー2でのみ実行され、敗者のプレイヤー1では実行されませんでした… (elseの処理も実行されなかったので、プレイヤー1は、if ( ! photonView.IsMine ) return;で弾かれた…?) RpcTarget.Allにしていますが、プレイヤー1側でメソッドが呼び出されていない可能性がありそうです。 もし他にアドバイス等ございましたら、よろしくおねがいします。
guest

回答2

0

ゴールしたプレイヤー側で送信したRPCのメッセージが、受信側(敗北)のシーンにも存在するゴールプレイヤーにアタッチされているスクリプトのRpcGoal(string player)メソッドと結びついているのかもです。

※質問者様の回答をふまえると、シーンに存在する2つのプレイヤーオブジェクト両方に結びついているかも?

この場合、
if (winner_name == this.gameObject.name)
が双方でture判定になっちゃうのは納得

なので、GameManager的な名前の空オブジェクトを作成し、そこにゴール判定の送信、受信用処理を含んだスクリプトをアタッチする感じで解決できそうかもです。

投稿2022/01/21 06:00

編集2022/01/21 06:04
kyooo_

総合スコア104

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

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

araragi_dev

2022/01/22 05:30

Kyooo_さん ご回答ありがとうございました!被ってしまいましたね!笑 「ゴールしたプレイヤー側で送信したRPCのメッセージが、受信側(敗北)のシーンにも存在するゴールプレイヤーにアタッチされているスクリプトのRpcGoal(string player)メソッドと結びついているのかもです。」 こちらなるほどと思いました。なので両者で反応してしまっていたのですね。 今回はIsMineなど、条件を明確に記述することで問題の回避につながりました。 色々とアドバイスありがとうございました。 今後ともよろしくおねがいします。
guest

0

自己解決

解決いたしました。(完全に把握しきれていないところがありますが…)
あらゆるところにthisをつけて、各種privateにして、RpcGoalのif文にphotonView.IsMineを追記したところ、正常に勝敗判定が出来ました。
どこが根本的な原因となっていたか、または上記すべてが原因だったのか、分かりませんが一旦解決いたしました。

イメージ説明

※Kyooo_さん アドバイスありがとうございました!いつも大変助かります。

投稿2022/01/21 05:30

araragi_dev

総合スコア60

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

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

kyooo_

2022/01/21 06:01

この投稿気付かずに回答してました笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問