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

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

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

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

C#

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

Unity3D

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

Unity

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

Q&A

解決済

3回答

4878閲覧

自分と相手の名前を画面に表示したい UnityPUN2

Jejeje

総合スコア38

Photon Cloud

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

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/12/07 14:33

編集2020/12/10 08:14

対戦開始前や後に自分と相手の名前を画面に表示させたいです。

名前はInputFieldに入力した名前をPhotonNetwork.NickNameに格納しています。

ちなみに精査記しているゲームは3Dオンライン対戦ゲームで、戦車を操作して弾を発射して戦うゲームです

いろいろと試しましたがどうしても相手の名前を取得できなかったので質問させていただきました。

試したこと

CNameInputField.csでPhotonNetwork.NickNameを設定

PlayerID.csでキャラクターをルームにInstantiateし、そのInstantiateしたキャラクターに自分のPhotonNetwork.NickNameを入れる(PhotonNetwork.NickNameはキャラクターにアタッチしているNickName.csに格納する)

ゲーム終了後にSyouhai.csでシーン上に残っているキャラクターをFindGameObjectWithTagで検索し、GetComponent<NickName>();でプレイヤーのNickNameをパネルに表示

という流れで試してみましたが相手が勝利者の場合相手の名前が表示されませんでした。

※流れを分かりやすく

CNameInputField.csでプレイヤーの名前(PhotonNetwork.NickName)を設定

PlayerID.csでキャラクターを生成、そのキャラクターのNickName.csに名前(PhotonNetwork.NickName)を入れる

対戦終了後Syouhai.csが作動し、シーンに残っているキャラクターの名前をTextに入れる
そのTextを全員に表示する

CNameInputField.cs

C#

1using UnityEngine; 2using UnityEngine.UI; 3using System.Collections; 4using Photon.Pun; 5using Photon.Realtime; 6public class CNameInputField : MonoBehaviourPunCallbacks 7{ 8 #region Private変数定義 9 static string playerNamePrefKey = "PlayerName"; 10 11 InputField _inputField; 12 #endregion 13 #region MonoBehaviourコールバック 14 void Start() 15 { 16 string defaultName = ""; 17 _inputField = this.GetComponent<InputField>(); 18 //前回プレイ開始時に入力した名前をロードして表示 19 if (_inputField != null) 20 { 21 if (PlayerPrefs.HasKey(playerNamePrefKey)) 22 { 23 defaultName = PlayerPrefs.GetString(playerNamePrefKey); 24 _inputField.text = defaultName; 25 } 26 } 27 } 28 #endregion 29 #region Public Method 30 public void SetPlayerName() 31 { 32 PhotonNetwork.NickName = _inputField.text + " ";//今回ゲームで利用するプレイヤーの名前を設定 33 PlayerPrefs.SetString(playerNamePrefKey, _inputField.text);//今回の名前をセーブ 34 35 Debug.Log(PhotonNetwork.NickName); 36 } 37 #endregion 38}

PlayerID.cs

C#

1using System; 2using System.Collections; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using Photon.Pun; 6using Photon.Realtime; 7 8public class PlayerID : MonoBehaviourPunCallbacks 9{ 10 public FixedJoystick joystick; 11 12 public GameObject gameplayer1; 13 public GameObject gameplayer2; 14 15 int id; 16 NickName script; 17 18 void Awake() 19 { 20 21 22 //PhotonNetwork.IsMessageQueueRunning = true; 23 24 PhotonNetwork.AutomaticallySyncScene = false; 25 26 id = PhotonNetwork.LocalPlayer.ActorNumber; 27 var v = new Vector3(-5.5f, 0.5f, -3.5f); 28 var v2 = new Vector3(5.5f, 0.5f, 3.5f); 29 //var v3 = new Vector3(-5.5f, 0.5f, 3.5f); 30 //var v4 = new Vector3(5.5f, 0.5f, -3.5f); 31 if (!PhotonNetwork.IsConnected) //Phootnに接続されていなければ 32 { 33 SceneManager.LoadScene("MultiMode"); //ログイン画面に戻る 34 return; 35 } 36 if (id == 1) 37 { 38 Debug.Log("ID = " + id); 39 40 GameObject Player1 = PhotonNetwork.Instantiate(this.gameplayer1.name, v, Quaternion.identity); 41 42 script = Player1.GetComponent<NickName>(); 43 script.PhotonName = PhotonNetwork.NickName; 44 45 46 47 Debug.Log("script.PhotonName" + script.PhotonName); 48 49 } 50 else if (id == 2) 51 { 52 Debug.Log("ID = " + id); 53 54 GameObject Player2 = PhotonNetwork.Instantiate(this.gameplayer2.name, v2, Quaternion.identity); 55 56 script = Player2.GetComponent<NickName>(); 57 script.PhotonName = PhotonNetwork.NickName; 58 Debug.Log("script.PhotonName" + script.PhotonName); 59 60 } 61 62 } 63 64 65 66 67}

Syouhai.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Photon.Pun; 5using UnityEngine.UI; 6using Photon.Realtime; 7 8public class Syouhai : MonoBehaviourPunCallbacks 9{ 10 public GameObject winPanel; 11 public Text winText; 12 13 GameObject wintank; 14 public string winname; 15 NickName script; 16 17 void Start() 18 { 19 winPanel.SetActive(false); 20 } 21 22 public void ActivePanel() 23 { 24 wintank = GameObject.FindGameObjectWithTag("tank"); 25 Debug.Log("wintank = " + wintank); 26 27 script = wintank.GetComponent<NickName>(); 28 Debug.Log("script =" + script); 29 30 winname = script.PhotonName; 31 32 Debug.Log(winname + "のかち"); 33 34 winText.text = winname + "のかち"; 35 winPanel.SetActive(true); 36 37 } 38 39} 40

NickName.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Photon.Pun; 5using Photon.Realtime; 6 7public class NickName : MonoBehaviourPunCallbacks 8{ 9 public string PhotonName; 10} 11

発生している問題

勝利者が相手の場合、相手の名前が表示されない

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

Unity 2019 4.11f1

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

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

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

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

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

BluOxy

2020/12/10 05:01 編集

> いろいろと試しました 試したことを具体的に記述してください。 ・本当にその試し方が妥当かどうかが分かりません ・既に試して駄目だったことを私や他の方が回答してしまうかもしれません ・何かを試しているのか伝わらないので、調べごとを丸投げしているように見えてしまいます
Jejeje

2020/12/10 08:15

修正依頼ありがとうございます 詳細を追記しました。分かりにくい点があればお申し付けください
guest

回答3

0

自己解決

photonView.Owner.NickNameを利用した

投稿2020/12/23 00:57

Jejeje

総合スコア38

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

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

0

photonView.Owner.NickNameを利用した。

投稿2020/12/23 00:56

Jejeje

総合スコア38

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

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

0

名前はInputFieldに入力した名前をPhotonNetwork.NickNameに格納しています。

その修正は恐らくJejejeさんの意図通りには動きません。 PhotonNetwork.NickName

プレイヤーのニックネームを、入室したRoom内の全員に同期します。これはPhotonPlayer.nameを設定します。
プレイヤー名には PhotonPlayer.name を使ってアクセスしてください。

PUN2のネットワークに接続するプレイヤーを使った処理を行いたい場合はPhotonPlayerオブジェクトを利用するのが適切ではないでしょうか。

投稿2020/12/10 10:52

編集2020/12/10 10:52
BluOxy

総合スコア2663

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

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

Jejeje

2020/12/10 17:25

回答ありがとうございます つまりPhotonPlayer.name = PhotonNetwork.NickName; などで値を入れればよいのでしょうか
BluOxy

2020/12/11 03:25 編集

古いバージョン(PUN)を参照していたため、混乱を招かないよう一度コメントを削除します。
BluOxy

2020/12/11 03:32 編集

同上
BluOxy

2020/12/11 03:31 編集

すみません。PhotonPlayerオブジェクトはよく確認するとPUN2には存在しないようです。(古いバージョンに存在していた) 改めて最新のドキュメントを探したら下記が見つかりました。(v2.26) https://doc-api.photonengine.com/en/pun/v2/annotated.html 自分自身のプレイヤー情報を取得するには、PhotonNetwork LocalPlayerが使えるかもしれません。 戻り値は上記で紹介したPhotonPlayerオブジェクトではなくPlayerオブジェクトです。 https://doc-api.photonengine.com/en/pun/v2/class_photon_1_1_pun_1_1_photon_network.html#a9eca32121ee792bbc3471d447d13e1d6 PlayerオブジェクトはNickNameプロパティを持っているので、これが各プレイヤー毎の名前に該当すると思います。 https://doc-api.photonengine.com/en/pun/v2/class_photon_1_1_realtime_1_1_player.html#a1024de23fed2d6df0a2850c11032b6cc PhotonNetwork.NickNameを使うのはやめて、PhotonNetwork.LocalPlayer.NickNameと書いてください。 - PhotonNetwork.LocalPlayer.NickName = _inputField.text + " "; - script.PhotonName = PhotonNetwork.LocalPlayer.NickName;
Jejeje

2020/12/12 15:38

ありがとうございます。 ですが試してみたところやはり名前は片方にしか表示されず、同じ結果となってしまいました。。。 戻り値をPlayerオブジェクトにするというのはどういうことなのでしょうか。 PlayerID.csは質問に記載したものをPhotonNetwork.NickNameをPhotonNetwork.LocalPlayer.NickNameに改めた以外は変えていません
BluOxy

2020/12/14 09:49

CNameInputField.csも同様の箇所があると思います。 PhotonNetwork.PlayerListから接続中のプレイヤー一覧が手に入ると思います。 なので、2人のプレイヤーが同じルームに所属しているときにそれぞれの情報がPhotonNetwork.PlayerListから見れることをデバッグ機能を使って確認してください。
BluOxy

2020/12/14 09:50

デバッグ機能を使って、各プレイヤー(Playerオブジェクト)が持つそれぞれのNickNameが意図した値であることを確認してください。
Jejeje

2020/12/14 17:31

PhotonNetwork.PlayerList[0] のようにしてデバッグするということでしょうか この通りデバッグログを出すとCNameInputField.csで設定したNickNameが出力されました またPhotonNetwork.PlayerList[0]側で、PhotonNetwork.PlayerList[1]、と表示してみるとPhotonNetwork.PlayerList[1](つまり相手の名前が表示されました)
BluOxy

2020/12/16 04:36 編集

であれば、最適かは分かりませんが、 PhotonNetwork.PlayerList[1].NickName を相手の名前として表示したら良いのではないでしょうか。 もしくは PhotonNetwork.PlayerList.SingleOrDefault(x => x != PhotonNetwork.LocalPlayer.NickName)
Jejeje

2020/12/16 16:55

対戦前にroomの全員の名前表示はなんとかなりそうです。 ですが対戦後の勝利者の名前表示だけがやはり上手くいきません。 PlayerとそのPlayerが操作するGameObjectを紐づけて、それで判定することはできないのでしょうか? (もしGameObject2がシーン上に残っていたらGameObject2をInstantiateして操作していたPlayer2の名前を表示する...など) ※そのGameObjectをInstantiateしたplayerの名前を表示したいということです。
Jejeje

2020/12/16 17:03

それかPlayer1側でPlayer2の名前をPlayer2の操作するGameObjectに値入れする方法はないでしょうか? それが分かれば現在のスクリプトでも擬似的に名前を共有できると思います PlayerID.csでゲームオブジェクトをInstantiateする際に自分の名前をそのゲームオブジェクトに格納していますが、その値入れを相手側にも同期したいということです。 PunRPCでは上手くいきませんでした。 値入れを相手側にも反映させるよい方法はないでしょうか?
BluOxy

2020/12/17 05:27

> 対戦後の勝利者の名前表示だけがやはり上手くいきません。 「自分と相手の名前を画面に表示したい」が解決したのでしたら、この質問はクローズするようお願いします。新たな質問があれば別途質問ページを作成してください。
Jejeje

2020/12/17 14:13

この質問はもともと「勝利者のプレイヤーの名前を表示したい」という目的のものでしたがもう一度作成した方がよろしいでしょうか?
BluOxy

2020/12/17 17:18

そのままでも構いませんが、誤解を招くので目的が明確に分かるように質問やタイトルを編集した方が良いと思います。 勝敗判定は各プレイヤーにSetCustomPropertiesメソッドを使えば互いのプレイヤーで値(カスタムプロパティ)を同期/参照できるのではないでしょうか。 https://doc-api.photonengine.com/en/pun/v2/class_photon_1_1_realtime_1_1_player.html#a73265fc7665581640574dc7e98526c77 自身を勝利させたいときは例えば下記のように書きます。 var hashtable = new Hashtable(); hashtable["Victory"] = "true"; PhotonNetwork.LocalPlayer.SetCustomProperties(hashtable); カスタムプロパティを参照したいときはCustomPropertiesプロパティを使用します。 プレイヤーの一覧から勝利したプレイヤーを取得するには下記のようなイメージです。 var victoryPlayer = PhotonNetwork.PlayerList.Single(x => x.CustomProperties["Victory"] == "true"); このようにして勝利者の名前を取得できませんか。
Jejeje

2020/12/21 19:06

photonView.Owner.NickNameを利用したら手っ取り早く実装できました。
BluOxy

2020/12/22 03:07

その方法で解決したのでしたら、他者がこの質問を参考にする場合もありますので、自身の質問に回答し、ベストアンサーを選択してください。 (自分の回答は書き損だったので、次回から回答は控えます)
Jejeje

2020/12/23 00:54

書き損なんかではありませんよ。初めは参考にさせていただきました。しかしそのすぐ後でその方法が見つかってしまったためOwnerの方を利用することにしました。
Jejeje

2020/12/23 00:56

ですのでもし次回以降も質問する機会があれば是非回答願いたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問