質問編集履歴

1

文法の修正

2020/05/11 14:31

投稿

uiuiko
uiuiko

スコア9

test CHANGED
File without changes
test CHANGED
@@ -4,9 +4,11 @@
4
4
 
5
5
  元からあった "InRoomChat"を改良して近くにいるキャラクターと全体に表示されるチャットに分けたいのです。
6
6
 
7
+
8
+
7
- のコードやじr
9
+ 変更後のコード
8
-
10
+
9
- ```c#
11
+ ```c#
10
12
 
11
13
  using System.Collections.Generic;
12
14
 
@@ -14,77 +16,377 @@
14
16
 
15
17
  using System.Collections;
16
18
 
17
-
18
-
19
19
  [RequireComponent(typeof(PhotonView))]
20
20
 
21
21
  public class InRoomChat : Photon.MonoBehaviour
22
22
 
23
23
  {
24
24
 
25
+ #region 変数宣言
26
+
27
+ //範囲チャット実装のためのオブジェクト、変数定義
28
+
29
+ GameObject[] players; //全てのプレイヤーキャラ取得用
30
+
31
+ GameObject sender; //送信キャラ取得用
32
+
33
+ GameObject myPlayer; //自分のキャラ取得用
34
+
35
+ GUIStyle ChatStyle = new GUIStyle(); //範囲チャットStyle
36
+
37
+ GUIStyleState ChatStyleState = new GUIStyleState();
38
+
39
+ GUIStyle AllChatStyle = new GUIStyle(); //全体チャットStyle
40
+
41
+ GUIStyleState AllChatStyleState = new GUIStyleState();
42
+
25
- public Rect GuiRect = new Rect(0,0, 250,300);
43
+ public Rect GuiRect = new Rect(0, 0, 300, 200); //チャットUIの大きさ設定用
26
-
44
+
27
- public bool IsVisible = true;
45
+ public bool IsVisible = true; //チャットUI表示非表示フラグ
28
-
46
+
29
- public bool AlignBottom = false;
47
+ public bool AlignBottom = true;
30
-
48
+
31
- public List<string> messages = new List<string>();
49
+ public List<string> messages = new List<string>(); //チャットログ格納用List
50
+
32
-
51
+ public List<bool> chatKind = new List<bool>(); //チャットログの種類格納用(範囲チャor全チャ)
52
+
33
- private string inputLine = "";
53
+ public string inputLine = "";//入力文章格納用String
34
-
54
+
35
- private Vector2 scrollPos = Vector2.zero;
55
+ private Vector2 scrollPos = Vector2.zero; //スクロールバー位置
56
+
36
-
57
+ #endregion
37
-
38
-
58
+
39
- public static readonly string ChatRPC = "Chat";
59
+ #region Start関数 Updata関数
40
-
41
-
42
60
 
43
61
  public void Start()
44
62
 
45
63
  {
46
64
 
65
+ //myPlayerオブジェクト取得(範囲チャット発言時にpositionとmyPM使う)
66
+
67
+ GetmyPlayer();
68
+
69
+ //範囲チャットの場合は白文字にし、文字がUIからあふれた場合は折り返す設定
70
+
71
+ ChatStyleState.textColor = Color.white;
72
+
73
+ ChatStyle.normal = ChatStyleState;
74
+
75
+ ChatStyle.wordWrap = true;
76
+
77
+ //全体チャットの場合は赤文字にし、文字がUIからあふれた場合は折り返す設定
78
+
79
+ AllChatStyleState.textColor = Color.red;
80
+
81
+ AllChatStyle.normal = AllChatStyleState;
82
+
83
+ AllChatStyle.wordWrap = true;
84
+
85
+ }
86
+
47
- if (this.AlignBottom)
87
+ public void Update()
48
-
88
+
49
- {
89
+ {
90
+
50
-
91
+ //ChatUIの位置を調整
92
+
51
- this.GuiRect.y = Screen.height - this.GuiRect.height;
93
+ this.GuiRect.y = Screen.height - this.GuiRect.height;
94
+
52
-
95
+ //ChatUIの大きさ調整
96
+
97
+ GuiRect.width = Screen.width / 3;
98
+
99
+ GuiRect.height = Screen.height / 3;
100
+
53
- }
101
+ }
54
-
102
+
55
- }
103
+ #endregion
104
+
56
-
105
+ #region OnGUI関数
57
-
58
106
 
59
107
  public void OnGUI()
60
108
 
61
109
  {
62
110
 
63
- if (!this.IsVisible || !PhotonNetwork.inRoom)
111
+ if (!this.IsVisible || !PhotonNetwork.inRoom) //表示フラグがOFFまたはphotonにつながっていないとき
64
-
112
+
65
- {
113
+ {
114
+
115
+ //UI非表示
66
116
 
67
117
  return;
68
118
 
69
119
  }
70
120
 
71
-
121
+ //ChatUIの作成開始
122
+
123
+ //チャットUI生成 Begin&EndAreaでチャットUIの位置と大きさを設定
124
+
125
+ GUILayout.Window(0, GuiRect, ChatUIWindow, ""); //チャットUIウインドウを作成
126
+
127
+ //Enterを押すと
72
128
 
73
129
  if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))
74
130
 
75
131
  {
76
132
 
77
- if (!string.IsNullOrEmpty(this.inputLine))
78
-
79
- {
80
-
81
- this.photonView.RPC("Chat", PhotonTargets.All, this.inputLine);
82
-
83
- this.inputLine = "";
84
-
85
- GUI.FocusControl("");
86
-
87
- return; // printing the now modified list would result in an error. to avoid this, we just skip this single frame
133
+ //チャット入力待ち状態にする
134
+
135
+ GUI.FocusControl("ChatInput");
136
+
137
+ }
138
+
139
+ }
140
+
141
+ #endregion
142
+
143
+ #region チャットUI生成
144
+
145
+ void ChatUIWindow(int windowID)
146
+
147
+ {
148
+
149
+ //FocusがチャットUIに乗ってるときにEnterを押すとチャット発言が実行される
150
+
151
+ if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))
152
+
153
+ {
154
+
155
+ if (!string.IsNullOrEmpty(this.inputLine)) //チャット入力欄がNullやEmptyでない場合
156
+
157
+ {
158
+
159
+ //範囲チャット送信関数実行
160
+
161
+ SendChat(false);
162
+
163
+ return;
164
+
165
+ }
166
+
167
+ }
168
+
169
+ //垂直のコントロールグループ開始
170
+
171
+ GUILayout.BeginVertical();
172
+
173
+ //スクロールビュー開始位置
174
+
175
+ scrollPos = GUILayout.BeginScrollView(scrollPos);
176
+
177
+ //チャットログ表示用フレキシブルスペース生成
178
+
179
+ GUILayout.FlexibleSpace();
180
+
181
+ //フレキシブルスペースにチャットログを表示
182
+
183
+ for (int i = 0; i <= messages.Count - 1; i++)
184
+
185
+ {
186
+
187
+ if (chatKind[i] != true) //範囲チャットであれば
188
+
189
+ {
190
+
191
+ GUILayout.Label(messages[i], ChatStyle);
192
+
193
+ }
194
+
195
+ else //全チャットであれば
196
+
197
+ {
198
+
199
+ GUILayout.Label(messages[i], AllChatStyle);
200
+
201
+ }
202
+
203
+ }
204
+
205
+ //スクロールビュー終了
206
+
207
+ GUILayout.EndScrollView();
208
+
209
+ //水平のコントロールグループ開始
210
+
211
+ GUILayout.BeginHorizontal();
212
+
213
+ //入力テキストフィールド生成、Focusが乗った状態をChatInputと命名
214
+
215
+ GUI.SetNextControlName("ChatInput");
216
+
217
+ inputLine = GUILayout.TextField(inputLine, 200);
218
+
219
+ //「Send」ボタンを生成かつ押したときには範囲チャット送信
220
+
221
+ if (GUILayout.Button("Send", GUILayout.ExpandWidth(false)))
222
+
223
+ {
224
+
225
+ //範囲チャット送信関数実行
226
+
227
+ SendChat(false);
228
+
229
+ }
230
+
231
+ //Allボタンを生成かつ押したときには全体チャット送信
232
+
233
+ if (GUILayout.Button("All", GUILayout.ExpandWidth(false)))
234
+
235
+ {
236
+
237
+ //全体チャット送信関数実行
238
+
239
+ SendChat(true);
240
+
241
+ }
242
+
243
+ //水平のコントロールグループ終了
244
+
245
+ GUILayout.EndHorizontal();
246
+
247
+ //垂直のコントロールグループ終了
248
+
249
+ GUILayout.EndVertical();
250
+
251
+ }
252
+
253
+ #endregion
254
+
255
+ #region GetmyPlayer 自キャラのオブジェクトをmyPlayerに登録
256
+
257
+ void GetmyPlayer()
258
+
259
+ {
260
+
261
+ //自キャラのID取得
262
+
263
+ int myPlayerID = PhotonNetwork.player.ID;
264
+
265
+ //全てのプレイヤーオブジェクトを取得
266
+
267
+ players = GameObject.FindGameObjectsWithTag("Player");
268
+
269
+ //全てのプレイヤーオブジェクトから自キャラをIDで検索し、取り出す
270
+
271
+ foreach (GameObject player in players)
272
+
273
+ {
274
+
275
+ int playerLoopId = player.GetComponent<PhotonView>().owner.ID;
276
+
277
+ if (playerLoopId == myPlayerID)
278
+
279
+ {
280
+
281
+ //自プレイヤーオブジェクトを取得
282
+
283
+ myPlayer = player;
284
+
285
+ }
286
+
287
+ }
288
+
289
+ return;
290
+
291
+ }
292
+
293
+ #endregion
294
+
295
+ #region チャット送信関数
296
+
297
+ void SendChat(bool isAll)
298
+
299
+ {
300
+
301
+ //chatRPC
302
+
303
+ this.photonView.RPC("Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);
304
+
305
+ //送信後、入力欄を空にし、スクロール最下位置に移動
306
+
307
+ this.inputLine = "";
308
+
309
+ scrollPos.y = Mathf.Infinity;
310
+
311
+ }
312
+
313
+ #endregion
314
+
315
+ #region ChatRPC RPC呼出側:送信者 RPC受信側:受信者
316
+
317
+ [PunRPC]
318
+
319
+ public void Chat(Vector3 senderposition, string newLine, bool isAll, PhotonMessageInfo mi)
320
+
321
+ {
322
+
323
+ if (messages.Count >= 100) //チャットログが多くなって来たらログを削除してから受信
324
+
325
+ {
326
+
327
+ messages.Clear(); //全てのチャットログを削除
328
+
329
+ chatKind.Clear(); //全てのチャットの種類情報削除
330
+
331
+ }
332
+
333
+ if (!isAll) //範囲チャとして受信
334
+
335
+ {
336
+
337
+ //myPlayerとsenderの距離から受信するか判断
338
+
339
+ if (Vector3.Distance(myPlayer.transform.position, senderposition) < 10)
340
+
341
+ {
342
+
343
+ //chat受信
344
+
345
+ ReceiveChat(newLine, isAll, mi);
346
+
347
+ }
348
+
349
+ }
350
+
351
+ else if (isAll) //全チャとして受信
352
+
353
+ {
354
+
355
+ //chat受信
356
+
357
+ ReceiveChat(newLine, isAll, mi);
358
+
359
+ }
360
+
361
+ //受信したときはスクロール最下位置
362
+
363
+ scrollPos.y = Mathf.Infinity;
364
+
365
+ }
366
+
367
+ #endregion
368
+
369
+ #region チャット受信関数
370
+
371
+ void ReceiveChat(string _newLine, bool isAll, PhotonMessageInfo _mi)
372
+
373
+ {
374
+
375
+ //送信者の名前用変数
376
+
377
+ string senderName = "anonymous";
378
+
379
+ if (_mi.sender != null)
380
+
381
+ {
382
+
383
+ //送信者の名前があれば
384
+
385
+ if (!string.IsNullOrEmpty(_mi.sender.NickName))
386
+
387
+ {
388
+
389
+ senderName = _mi.sender.NickName;
88
390
 
89
391
  }
90
392
 
@@ -92,101 +394,23 @@
92
394
 
93
395
  {
94
396
 
95
- GUI.FocusControl("ChatInput");
397
+ senderName = "player " + _mi.sender.ID;
96
-
398
+
97
- }
399
+ }
98
-
400
+
99
- }
401
+ }
402
+
100
-
403
+ //受信したチャットをログに追加
101
-
102
-
404
+
103
- GUI.SetNextControlName("");
405
+ this.messages.Add(senderName + ": " + _newLine);
104
-
105
- GUILayout.BeginArea(this.GuiRect);
406
+
106
-
107
-
108
-
109
- scrollPos = GUILayout.BeginScrollView(scrollPos);
110
-
111
- GUILayout.FlexibleSpace();
407
+ this.chatKind.Add(isAll);
112
-
113
- for (int i = messages.Count - 1; i >= 0; i--)
408
+
114
-
115
- {
116
-
117
- GUILayout.Label(messages[i]);
409
+ return;
118
-
410
+
119
- }
411
+ }
120
-
121
- GUILayout.EndScrollView();
412
+
122
-
123
-
124
-
125
- GUILayout.BeginHorizontal();
126
-
127
- GUI.SetNextControlName("ChatInput");
128
-
129
- inputLine = GUILayout.TextField(inputLine);
130
-
131
- if (GUILayout.Button("Send", GUILayout.ExpandWidth(false)))
132
-
133
- {
134
-
135
- this.photonView.RPC("Chat", PhotonTargets.All, this.inputLine);
136
-
137
- this.inputLine = "";
138
-
139
- GUI.FocusControl("");
140
-
141
- }
142
-
143
- GUILayout.EndHorizontal();
144
-
145
- GUILayout.EndArea();
146
-
147
- }
148
-
149
-
150
-
151
- [PunRPC]
152
-
153
- public void Chat(string newLine, PhotonMessageInfo mi)
154
-
155
- {
156
-
157
- string senderName = "anonymous";
158
-
159
-
160
-
161
- if (mi.sender != null)
413
+ #endregion
162
-
163
- {
164
-
165
- if (!string.IsNullOrEmpty(mi.sender.NickName))
166
-
167
- {
168
-
169
- senderName = mi.sender.NickName;
170
-
171
- }
172
-
173
- else
174
-
175
- {
176
-
177
- senderName = "player " + mi.sender.ID;
178
-
179
- }
180
-
181
- }
182
-
183
-
184
-
185
- this.messages.Add(senderName +": " + newLine);
186
-
187
- }
188
-
189
-
190
414
 
191
415
  public void AddLine(string newLine)
192
416
 
@@ -199,3 +423,17 @@
199
423
  }
200
424
 
201
425
  ```
426
+
427
+ ![こちらです](8e50776f16258b30d476ec79f10fd7eb.png)
428
+
429
+ inspecterはこうなっています。
430
+
431
+
432
+
433
+ NullReferenceException: Object reference not set to an instance of an object
434
+
435
+
436
+
437
+ ↑というエラーが出ます。
438
+
439
+ すいません教えてください。