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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

776閲覧

【Unity】相手プレイヤーのスクリプト内の変数が正常に取得できません

araragi_dev

総合スコア60

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/01/16 15:23

編集2022/01/16 15:45

■概要
相手プレイヤーのスクリプト内の変数が正常に取得できません。
原因がわからないため、お力をおかしください。

■詳細
1対1のオンライン対戦ゲームです。プレイヤー名は、Player[1]とPlayer[2]です。
自分がゴールに触れると、自身のjudge変数に"win"が入ります。
相手のプレイヤーのjudge変数に"win"が入っていた場合、自身の負けとします。
勝敗状況を判断するため、相手のjudge変数をFindとGetComponentでリアルタイムで取得します。

しかし取得が正常に出来ておらず、相手がゴールし、相手のjudgeにwinが代入されても、
自分は相手のjudgeの状態が把握されません。(初期値の取得はできている様子で、永久に空の""のまま)
エラーは出ておりません。

■コード

省略 public GameObject enemy = null; //敵のオブジェクト UnityChan.UnityChanControlScriptWithRgidBody script_enemy = null; //敵のオブジェクトのスクリプト public string judge = ""; //自身の勝敗判定用 win or lose 省略 void Start () {  省略 } void FixedUpdate () {  省略     //★敵がいる場合、敵スクリプトの状態をリアルタイムで取得 if (players.Length == 2) { //自身のチーム名を元に敵プレイヤー名を判断し、enemyオブジェクトに敵のオブジェクトを入れる if (team == "red") { enemy = GameObject.Find("Player[" + 2 + "]"); } else { enemy = GameObject.Find("Player[" + 1 + "]"); } //スクリプトも取得 script_enemy = enemy.GetComponent<UnityChan.UnityChanControlScriptWithRgidBody>(); Debug.Log("script_enemy.judge:[" + script_enemy.judge + "] judge:[" + judge + "]");            //★相手のjudgeにwinが代入されても、何故か検知できない } //勝利時の処理 Goal Collisionでjudgeにwinを代入 if (judge == "win")      { //自身が勝者の場合 winorlose_object = GameObject.Find("WinOrLose"); Text winorlose_text = winorlose_object.GetComponent<Text>(); // テキストの表示を入れ替える winorlose_text.text = "おめでとう!勝利  10秒後にタイトルに戻ります"; } //★ここが作用しない。敵のjudgeが正常に取得できていない。      if(script_enemy.judge == "win")      { //敗北を入力 judge = "lose"; //自身が敗者の場合 winorlose_object = GameObject.Find("WinOrLose"); Text winorlose_text = winorlose_object.GetComponent<Text>(); // テキストの表示を入れ替える winorlose_text.text = "残念…あなたの負け 10秒後にタイトルに戻ります"; totitle_time_frag = 1; Debug.Log("敗北時の処理 敗北プレイヤーは" + team); } } //ゴール着地時の処理 ★接触判定は問題なし if (photonView.IsMine && collision.gameObject.name == "Goal_Floor") { Debug.Log("★触れた"); //ゲーム終了フラグが立っていない場合 if (totitle_time_frag == 0) {   //自身のjudge変数に値が入っていない場合、自身のjudge変数にwinを入れる。loseが入っている場合は処理をスルー。         //ここの判定は問題なし   if (judge == "")   {      judge = "win"; //★ここは自身確かに代入されている      Debug.Log("ゴールに触れた 勝利時の処理 judge:" + judge);   } //再度判定が入らないようにフラグ処理 totitle_time_frag = 1; Debug.Log("totitle_time_fragを1に"); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

PUN2を使用してマルチプレイを実装してると思うのですが、スクリプト内の変数を自動で同期してくれる機能はなかったと理解しています。(何かしらあったらすいません)
なので、他プレイヤーの情報(今回はjudge変数)を共有したい場合は、

  1. プレイヤーのゴール判定を取得(photonView.IsMineでローカルのみ判定)
  2. 他プレイヤーにゴールしたことを通知
  3. ゴールした側はそのまま勝利処理?2の通知を受け取った側は敗北処理?

みたいな流れでの実装方法があるかなと思います。

2の他プレイヤーへの通知は、PUN2のRPCを使用するのが1つの手かなと。(てか自分はそれしか知りません)
「PUN2 RPC」とかで検索すれば色々情報あると思うので、

※自分PUN2少ししか触った経験ないので、何か不備などありましたらすいません

投稿2022/01/17 01:06

kyooo_

総合スコア104

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

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

araragi_dev

2022/01/17 04:40

kyooo_さん お忙しい中ご回答ありがとうございます! スクリプト内の変数を同期する機能がそもそも無かったのですね!勉強不足でした 早速、ご教授頂いたRPCを使った他プレイヤーへの通知処理実装いたします。 本当にありがとうございました!
kyooo_

2022/01/17 07:02

RPCの実装で分からないことがあればまた!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問