このサイトを見ながらやっています。
PhotonNetWorkingを使ってチャット機能を作っています。
元からあった "InRoomChat"を改良して近くにいるキャラクターと全体に表示されるチャットに分けたいのです。
変更後のコード↓
c#
1using System.Collections.Generic; 2using UnityEngine; 3using System.Collections; 4[RequireComponent(typeof(PhotonView))] 5public class InRoomChat : Photon.MonoBehaviour 6{ 7 #region 変数宣言 8 //範囲チャット実装のためのオブジェクト、変数定義 9 GameObject[] players; //全てのプレイヤーキャラ取得用 10 GameObject sender; //送信キャラ取得用 11 GameObject myPlayer; //自分のキャラ取得用 12 GUIStyle ChatStyle = new GUIStyle(); //範囲チャットStyle 13 GUIStyleState ChatStyleState = new GUIStyleState(); 14 GUIStyle AllChatStyle = new GUIStyle(); //全体チャットStyle 15 GUIStyleState AllChatStyleState = new GUIStyleState(); 16 public Rect GuiRect = new Rect(0, 0, 300, 200); //チャットUIの大きさ設定用 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 private Vector2 scrollPos = Vector2.zero; //スクロールバー位置 23 #endregion 24 #region Start関数 Updata関数 25 public void Start() 26 { 27 //myPlayerオブジェクト取得(範囲チャット発言時にpositionとmyPM使う) 28 GetmyPlayer(); 29 //範囲チャットの場合は白文字にし、文字がUIからあふれた場合は折り返す設定 30 ChatStyleState.textColor = Color.white; 31 ChatStyle.normal = ChatStyleState; 32 ChatStyle.wordWrap = true; 33 //全体チャットの場合は赤文字にし、文字がUIからあふれた場合は折り返す設定 34 AllChatStyleState.textColor = Color.red; 35 AllChatStyle.normal = AllChatStyleState; 36 AllChatStyle.wordWrap = true; 37 } 38 public void Update() 39 { 40 //ChatUIの位置を調整 41 this.GuiRect.y = Screen.height - this.GuiRect.height; 42 //ChatUIの大きさ調整 43 GuiRect.width = Screen.width / 3; 44 GuiRect.height = Screen.height / 3; 45 } 46 #endregion 47 #region OnGUI関数 48 public void OnGUI() 49 { 50 if (!this.IsVisible || !PhotonNetwork.inRoom) //表示フラグがOFFまたはphotonにつながっていないとき 51 { 52 //UI非表示 53 return; 54 } 55 //ChatUIの作成開始 56 //チャットUI生成 Begin&EndAreaでチャットUIの位置と大きさを設定 57 GUILayout.Window(0, GuiRect, ChatUIWindow, ""); //チャットUIウインドウを作成 58 //Enterを押すと 59 if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return)) 60 { 61 //チャット入力待ち状態にする 62 GUI.FocusControl("ChatInput"); 63 } 64 } 65 #endregion 66 #region チャットUI生成 67 void ChatUIWindow(int windowID) 68 { 69 //FocusがチャットUIに乗ってるときにEnterを押すとチャット発言が実行される 70 if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return)) 71 { 72 if (!string.IsNullOrEmpty(this.inputLine)) //チャット入力欄がNullやEmptyでない場合 73 { 74 //範囲チャット送信関数実行 75 SendChat(false); 76 return; 77 } 78 } 79 //垂直のコントロールグループ開始 80 GUILayout.BeginVertical(); 81 //スクロールビュー開始位置 82 scrollPos = GUILayout.BeginScrollView(scrollPos); 83 //チャットログ表示用フレキシブルスペース生成 84 GUILayout.FlexibleSpace(); 85 //フレキシブルスペースにチャットログを表示 86 for (int i = 0; i <= messages.Count - 1; i++) 87 { 88 if (chatKind[i] != true) //範囲チャットであれば 89 { 90 GUILayout.Label(messages[i], ChatStyle); 91 } 92 else //全チャットであれば 93 { 94 GUILayout.Label(messages[i], AllChatStyle); 95 } 96 } 97 //スクロールビュー終了 98 GUILayout.EndScrollView(); 99 //水平のコントロールグループ開始 100 GUILayout.BeginHorizontal(); 101 //入力テキストフィールド生成、Focusが乗った状態をChatInputと命名 102 GUI.SetNextControlName("ChatInput"); 103 inputLine = GUILayout.TextField(inputLine, 200); 104 //「Send」ボタンを生成かつ押したときには範囲チャット送信 105 if (GUILayout.Button("Send", GUILayout.ExpandWidth(false))) 106 { 107 //範囲チャット送信関数実行 108 SendChat(false); 109 } 110 //Allボタンを生成かつ押したときには全体チャット送信 111 if (GUILayout.Button("All", GUILayout.ExpandWidth(false))) 112 { 113 //全体チャット送信関数実行 114 SendChat(true); 115 } 116 //水平のコントロールグループ終了 117 GUILayout.EndHorizontal(); 118 //垂直のコントロールグループ終了 119 GUILayout.EndVertical(); 120 } 121 #endregion 122 #region GetmyPlayer 自キャラのオブジェクトをmyPlayerに登録 123 void GetmyPlayer() 124 { 125 //自キャラのID取得 126 int myPlayerID = PhotonNetwork.player.ID; 127 //全てのプレイヤーオブジェクトを取得 128 players = GameObject.FindGameObjectsWithTag("Player"); 129 //全てのプレイヤーオブジェクトから自キャラをIDで検索し、取り出す 130 foreach (GameObject player in players) 131 { 132 int playerLoopId = player.GetComponent<PhotonView>().owner.ID; 133 if (playerLoopId == myPlayerID) 134 { 135 //自プレイヤーオブジェクトを取得 136 myPlayer = player; 137 } 138 } 139 return; 140 } 141 #endregion 142 #region チャット送信関数 143 void SendChat(bool isAll) 144 { 145 //chatRPC 146 this.photonView.RPC("Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll); 147 //送信後、入力欄を空にし、スクロール最下位置に移動 148 this.inputLine = ""; 149 scrollPos.y = Mathf.Infinity; 150 } 151 #endregion 152 #region ChatRPC RPC呼出側:送信者 RPC受信側:受信者 153 [PunRPC] 154 public void Chat(Vector3 senderposition, string newLine, bool isAll, PhotonMessageInfo mi) 155 { 156 if (messages.Count >= 100) //チャットログが多くなって来たらログを削除してから受信 157 { 158 messages.Clear(); //全てのチャットログを削除 159 chatKind.Clear(); //全てのチャットの種類情報削除 160 } 161 if (!isAll) //範囲チャとして受信 162 { 163 //myPlayerとsenderの距離から受信するか判断 164 if (Vector3.Distance(myPlayer.transform.position, senderposition) < 10) 165 { 166 //chat受信 167 ReceiveChat(newLine, isAll, mi); 168 } 169 } 170 else if (isAll) //全チャとして受信 171 { 172 //chat受信 173 ReceiveChat(newLine, isAll, mi); 174 } 175 //受信したときはスクロール最下位置 176 scrollPos.y = Mathf.Infinity; 177 } 178 #endregion 179 #region チャット受信関数 180 void ReceiveChat(string _newLine, bool isAll, PhotonMessageInfo _mi) 181 { 182 //送信者の名前用変数 183 string senderName = "anonymous"; 184 if (_mi.sender != null) 185 { 186 //送信者の名前があれば 187 if (!string.IsNullOrEmpty(_mi.sender.NickName)) 188 { 189 senderName = _mi.sender.NickName; 190 } 191 else 192 { 193 senderName = "player " + _mi.sender.ID; 194 } 195 } 196 //受信したチャットをログに追加 197 this.messages.Add(senderName + ": " + _newLine); 198 this.chatKind.Add(isAll); 199 return; 200 } 201 #endregion 202 public void AddLine(string newLine) 203 { 204 this.messages.Add(newLine); 205 } 206}
NullReferenceException: Object reference not set to an instance of an object
↑というエラーが出ます。
すいません教えてください。
https://docs.unity3d.com/ja/current/Manual/NullReferenceException.html
上記とエラーコードを参考に、どのオブジェクトがnullなのか調べてください。
ちなみにOnGUIはデバッグ以外の用途で使うべきではありません。uGUI等を使用した方がいいです。
あなたの回答
tips
プレビュー