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

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

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

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

Q&A

解決済

1回答

2329閲覧

RPCを使ったチャットについて教えてください。

4063sk

総合スコア3

Unity

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

0グッド

0クリップ

投稿2018/05/20 08:15

編集2018/05/20 08:17

前提・実現したいこと

RPCを使ってチャットシステムを作っています。
GUILayoutを使って書いてあるデモの表示がバグる時があるので、
GUILayoutから半分コピペをしながら、UIに書き換えている時に以下の問題が発生しました。
コードが汚くて申し訳ないです。
初心者なのでわかりやすく教えていただけると嬉しいです。

発生している問題

[PunRPC] public void Chat(Vector3 senderposition, string newLine, bool isAll, PhotonMessageInfo mi) のところの`PhotonMessageInfo mi`がnullになってしまう。

ソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6[RequireComponent(typeof(PhotonView))] 7public class RoomChatScript : Photon.MonoBehaviour 8{ 9 10 GameObject[] players; //全てのプレイヤーキャラ取得用 11 //GameObject sender; //送信キャラ取得用 12 GameObject myPlayer; //自分のキャラ取得用 13 //GUIStyle ChatStyle = new GUIStyle(); //範囲チャットStyle 14 //GUIStyleState ChatStyleState = new GUIStyleState(); 15 //GUIStyle AllChatStyle = new GUIStyle(); //全体チャットStyle 16 //GUIStyleState AllChatStyleState = new GUIStyleState(); 17 public bool IsVisible = true; //チャットUI表示非表示フラグ 18 public bool AlignBottom = true; 19 public List<string> messages = new List<string>(); //チャットログ格納用List 20 public List<bool> chatKind = new List<bool>(); //チャットログの種類格納用(範囲チャor全チャ) 21 public string inputLine = "";//入力文章格納用String 22 public Scrollbar scrollPos; 23 public Text UItext; 24 public InputField mesetext; 25 public GameObject[] UI; 26 public Image RoomChatUI; 27 28 private Color RCUColor; 29 private bool all; 30 private bool send; 31 PhotonView photonViews; 32 33 // Use this for initialization 34 void Start () { 35 photonViews = GetComponent<PhotonView>(); 36 RCUColor = RoomChatUI.color; 37 //myPlayerオブジェクト取得(範囲チャット発言時にpositionとmyPM使う) 38 GetmyPlayer(); 39 Debug.Log(myPlayer); 40 //範囲チャットの場合は白文字にし、文字がUIからあふれた場合は折り返す設定 41 //ChatStyleState.textColor = Color.white; 42 //ChatStyle.normal = ChatStyleState; 43 //ChatStyle.wordWrap = true; 44 //全体チャットの場合は赤文字にし、文字がUIからあふれた場合は折り返す設定 45 //AllChatStyleState.textColor = Color.blue; 46 //AllChatStyle.normal = AllChatStyleState; 47 //AllChatStyle.wordWrap = true; 48 } 49 50 // Update is called once per frame 51 void Update() 52 { 53 inputLine = mesetext.text; 54 //FocusがチャットUIに乗ってるときにEnterを押すとチャット発言が実行される 55 if (Input.GetKeyDown(KeyCode.Return)) 56 { 57 if (!string.IsNullOrEmpty(this.inputLine)) //チャット入力欄がNullやEmptyでない場合 58 { 59 //範囲チャット送信関数実行 60 SendChat(false); 61 return; 62 } 63 else 64 { 65 this.GetComponent<RoomChatUIScript>().PanelClick = true; 66 } 67 } 68 69 UItext.text = ""; 70 71 for (int i = 0; i <= messages.Count - 1; i++) 72 { 73 if (chatKind[i] != true) //範囲チャットであれば 74 { 75 if (i != 0) UItext.text += System.Environment.NewLine; 76 UItext.text += string.Format("<color=white>{0}</color>", messages[i]); 77 78 //GUILayout.Label(messages[i], ChatStyle); 79 } 80 else //全チャットであれば 81 { 82 if (i != 0) UItext.text += System.Environment.NewLine; 83 UItext.text += string.Format("<color=green>{0}</color>", messages[i]); 84 //GUILayout.Label(messages[i], AllChatStyle); 85 } 86 } 87 88 //「Send」ボタンを生成かつ押したときには範囲チャット送信 89 /*if (GUILayout.Button("Send", GUILayout.ExpandWidth(false))) 90 { 91 //範囲チャット送信関数実行 92 SendChat(false); 93 } 94 //Allボタンを生成かつ押したときには全体チャット送信 95 if (GUILayout.Button("All", GUILayout.ExpandWidth(false))) 96 { 97 //全体チャット送信関数実行 98 SendChat(true); 99 }*/ 100 if (myPlayer != null) 101 { 102 if (send) 103 { 104 //範囲チャット送信関数実行 105 SendChat(false); 106 send = false; 107 } 108 if (all) 109 { 110 //全体チャット送信関数実行 111 SendChat(true); 112 all = false; 113 } 114 }else{ 115 GetmyPlayer(); 116 Debug.Log(myPlayer); 117 } 118 if(IsVisible || PhotonNetwork.inRoom){ 119 for(int i = 0; i <= UI.Length - 1; i++){ 120 UI[i].SetActive(true); 121 } 122 RoomChatUI.color = RCUColor; 123 }else{ 124 for (int i = 0; i <= UI.Length - 1; i++) 125 { 126 UI[i].SetActive(false); 127 } 128 RoomChatUI.color = new Color(0, 0, 0, 0); 129 } 130 } 131 132 void GetmyPlayer() 133 { 134 //自キャラのID取得 135 int myPlayerID = PhotonNetwork.player.ID; 136 //全てのプレイヤーオブジェクトを取得 137 players = GameObject.FindGameObjectsWithTag("Player"); 138 //全てのプレイヤーオブジェクトから自キャラをIDで検索し、取り出す 139 foreach (GameObject player in players) 140 { 141 int playerLoopId = player.GetComponent<PhotonView>().owner.ID; 142 if (playerLoopId == myPlayerID) 143 { 144 //自プレイヤーオブジェクトを取得 145 myPlayer = player; 146 } 147 } 148 return; 149 } 150 151 void SendChat(bool isAll) 152 { 153 //chatRPC 154 this.photonViews.RPC("Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll, null); 155 //送信後、入力欄を空にし、スクロール最下位置に移動 156 mesetext.text = ""; 157 scrollPos.value = 0; 158 return; 159 } 160 161 [PunRPC] 162 public void Chat(Vector3 senderposition, string newLine, bool isAll, PhotonMessageInfo mi) 163 { 164 Debug.Log("mi : " + mi); 165 if (messages.Count >= 100) //チャットログが多くなって来たらログを削除してから受信 166 { 167 messages.Clear(); //全てのチャットログを削除 168 chatKind.Clear(); //全てのチャットの種類情報削除 169 } 170 if (!isAll) //範囲チャとして受信 171 { 172 //myPlayerとsenderの距離から受信するか判断 173 if (Vector3.Distance(myPlayer.transform.position, senderposition) < 10) 174 { 175 //chat受信 176 ReceiveChat(newLine, isAll, mi); 177 } 178 } 179 else if (isAll) //全チャとして受信 180 { 181 //chat受信 182 ReceiveChat(newLine, isAll, mi); 183 } 184 //受信したときはスクロール最下位置 185 scrollPos.value = 0; 186 return; 187 } 188 189 void ReceiveChat(string _newLine, bool isAll, PhotonMessageInfo _mi) 190 { 191 Debug.Log("_mi : " + _mi); 192 //送信者の名前用変数 193 string senderName = "anonymous"; 194 if (_mi.sender != null) 195 { 196 //送信者の名前があれば 197 if (!string.IsNullOrEmpty(_mi.sender.NickName)) 198 { 199 senderName = _mi.sender.NickName; 200 } 201 else 202 { 203 senderName = "player " + _mi.sender.ID; 204 } 205 } 206 //受信したチャットをログに追加 207 this.messages.Add(senderName + " : " + _newLine); 208 this.chatKind.Add(isAll); 209 return; 210 } 211 212 public void AddLine(string newLine) 213 { 214 this.messages.Add(newLine); 215 } 216 217 public void aall(bool t){ 218 all = t; 219 } 220 public void asend(bool t) 221 { 222 send = t; 223 } 224} 225

試したこと

はじめはどこでエラーが出ているのかわからなくてDebug.Logを使って、いろいろ出力したところ原因はわかったのですが、ネットを使っても日本語での前例が見つからず、お手上げの状態です。

補足情報

Unity 2017.4.1f1
Photon
参考サイトhttp://uniblo.biz/unity/mmogame/chapter8_chat

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

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

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

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

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

guest

回答1

0

ベストアンサー

ざっくり見ただけなんで間違っているかもしれませんが、
void SendChat(bool isAll)の中で
this.photonViews.RPC("Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll, null);
これを呼んでいます。
これだと引数的にChat()のmiがnullになると思うのですが、原因ではないでしょうか?

投稿2018/05/21 02:41

sakura_hana

総合スコア11427

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

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

4063sk

2018/05/21 07:00

とてもわかりやすい回答ありがとうございました。 無事に動きました。 こんな単純なミスで申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問