質問編集履歴

6

書き方にミスがありソースコードをコードを入力する欄ではなく、通常の文字を入力する欄に書いてしまっていたので修正しました。

2020/10/25 09:33

投稿

kosho206
kosho206

スコア41

test CHANGED
File without changes
test CHANGED
@@ -58,6 +58,10 @@
58
58
 
59
59
  ### 該当のソースコード
60
60
 
61
+
62
+
63
+ ```ここに言語を入力
64
+
61
65
  using System.Collections;
62
66
 
63
67
  using System.Collections.Generic;
@@ -236,6 +240,8 @@
236
240
 
237
241
  ```
238
242
 
243
+
244
+
239
245
  ↑これは、スタート画面の「Playボタン」を押したときにマッチングを開始するコードです。
240
246
 
241
247
 

5

タイトルを少しだけ変更しました。

2020/10/25 09:33

投稿

kosho206
kosho206

スコア41

test CHANGED
@@ -1 +1 @@
1
- 【Unity】Photonで、カメラをプレイヤーに追従させたいのですが、プレイヤーが複数いると追従してくれせん。
1
+ 【Unity】Photonで、カメラをプレイヤーに追従させたいのですが、プレイヤーが複数いると追従しなくなっいます
test CHANGED
File without changes

4

ゲームの流れの詳細を記述し、マッチングの処理をするコードを記述しました。

2020/10/24 09:23

投稿

kosho206
kosho206

スコア41

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,241 @@
2
2
 
3
3
  Photonを使ったオンラインマルチプレイのTPS系ゲームを作っています。
4
4
 
5
- カメラとプレイヤーキャラのオブジェクトどちらもネットワークオブジェクトにして、カメラをプレイヤーに追従させたいのですが、カメラ追従するプレイヤーを取得する処理がうまくいきません。
5
+ カメラをプレイヤーに追従させたいのですが、カメラ追従対象のプレイヤーObjectを取得する処理がうまくいきません。
6
+
7
+ カメラとプレイヤーはどちらもネットワークオブジェクトです。
8
+
9
+
10
+
11
+ 下記が、ゲーム開始から追従対象取得までの処理の流れです。
12
+
13
+
14
+
15
+ 1.今作っているゲームは、「スタート画面のScene」と「バトル画面のシーンに分かれています。
16
+
17
+ まずはスタート画面から始まって、スタート画面にある「Play」ボタンを押すとマッチングが開始されます。
18
+
19
+
20
+
21
+ 2.マッチングをして、自分のRoomのプレイヤー人数が定員数になったらバトル画面のシーンに遷移します。
22
+
23
+
24
+
25
+ 3.バトル画面のシーンに遷移したら、ネットワークオブジェクトを生成します(プレイヤーObjectとカメラ)。
26
+
27
+
28
+
29
+ 4.カメラとプレイヤーObjectのActorNumberを取得します。
30
+
31
+  カメラのコードで、カメラのActorNumberとプレイヤーObjectのActorNumberを比べて、カメラのActorNumberと同じActorNumberのプレイヤーObjectを取得します。
32
+
33
+ ここで取得したプレイヤーObjectがカメラの追従対象となります。
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+ ### 発生している問題・エラーメッセージ
42
+
43
+ このコードを使うと、プレイヤーが一人だけの場合は上手く追従してくれるのですが、プレイヤーが複数いる場合は全てのプレイヤーでカメラが追従しなくなってしまいます。
44
+
45
+ 画像のコードの一番下のDebug.Logで、target変数の中身を確認したのですが、プレイヤーが複数いてカメラが追従しなくなった場合も、target変数にはプレイヤーのオブジェクトが代入されていました。
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+ なぜこのコードで上記のような挙動になってしまうのかが分かりません。
54
+
55
+ 原因がわかる方教えてください。
56
+
57
+
58
+
59
+ ### 該当のソースコード
60
+
61
+ using System.Collections;
62
+
63
+ using System.Collections.Generic;
64
+
65
+ using UnityEngine;
66
+
67
+ using UnityEngine.UI;
68
+
69
+ using UnityEngine.SceneManagement;
70
+
71
+ using Photon.Realtime;
72
+
73
+ using Photon.Pun;
74
+
75
+
76
+
77
+ public class StartButton : MonoBehaviourPunCallbacks
78
+
79
+ {
80
+
81
+ public static int RoomPlayerCapacity { get; private set; }
82
+
83
+
84
+
85
+ [SerializeField, Range(1, 15)]
86
+
87
+ int capa;
88
+
89
+
90
+
91
+ float ButtonClicdedInterval;
92
+
93
+
94
+
95
+ void Start()
96
+
97
+ {
98
+
99
+ Cursor.visible = true;
100
+
101
+ Cursor.lockState = CursorLockMode.None;
102
+
103
+ RoomPlayerCapacity = capa;
104
+
105
+ }
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+ //Playボタンを押したらマスターサーバーへ接続する
114
+
115
+ //サーバーへ接続してすぐにルームに参加しようとすると処理が間に合わず、エラーになるので2秒遅延させる
116
+
117
+ public void ButtonClicded()
118
+
119
+ {
120
+
121
+ if (PhotonNetwork.IsConnectedAndReady == false) PhotonNetwork.ConnectUsingSettings();
122
+
123
+ StartCoroutine(JoinRandomRoom(2f));
124
+
125
+ }
126
+
127
+ private IEnumerator JoinRandomRoom(float i_time)
128
+
129
+ {
130
+
131
+ yield return new WaitForSeconds(i_time);
132
+
133
+
134
+
135
+ PhotonNetwork.JoinRandomRoom();
136
+
137
+ }
138
+
139
+
140
+
141
+ // マッチングが成功した時に呼ばれるコールバック
142
+
143
+ public override void OnJoinedRoom()
144
+
145
+ {
146
+
147
+ Debug.Log("ルームに参加しました");
148
+
149
+ }
150
+
151
+
152
+
153
+ // 通常のマッチングが失敗した時に呼ばれるコールバック
154
+
155
+ public override void OnJoinRoomFailed(short returnCode, string message)
156
+
157
+ {
158
+
159
+ Debug.Log($"ルーム参加に失敗しました: {message}");
160
+
161
+ }
162
+
163
+
164
+
165
+ // ランダムマッチングが失敗した時に呼ばれるコールバック
166
+
167
+ public override void OnJoinRandomFailed(short returnCode, string message)
168
+
169
+ {
170
+
171
+ // ランダムに参加できるルームが存在しないなら、新しいルームを作成する
172
+
173
+ PhotonNetwork.CreateRoom(null);
174
+
175
+ Debug.Log("ルーム作成");
176
+
177
+ }
178
+
179
+
180
+
181
+ //ルームの設定
182
+
183
+ public void CreateRoomWity()
184
+
185
+ {
186
+
187
+ PhotonNetwork.CreateRoom(
188
+
189
+ null,
190
+
191
+ new RoomOptions()
192
+
193
+ {
194
+
195
+ MaxPlayers = 15
196
+
197
+ }
198
+
199
+ ) ;
200
+
201
+ }
202
+
203
+
204
+
205
+ private void Update()
206
+
207
+ {
208
+
209
+ //実行してから1秒間はルーム参加の処理を行わないための変数
210
+
211
+ //ゲーム実行後すぐにサーバーに接続しようとすると処理が間に合わずエラーになる
212
+
213
+ ButtonClicdedInterval += Time.deltaTime;
214
+
215
+
216
+
217
+ Debug.Log(PhotonNetwork.CurrentRoom);
218
+
219
+ if (PhotonNetwork.CurrentRoom == null) return;
220
+
221
+
222
+
223
+ if (ButtonClicdedInterval > 1 && PhotonNetwork.CurrentRoom.PlayerCount == RoomPlayerCapacity)
224
+
225
+ {
226
+
227
+ SceneManager.LoadScene("UunkoBattle");
228
+
229
+ ButtonClicdedInterval = 0f;
230
+
231
+ }
232
+
233
+ }
234
+
235
+ }
236
+
237
+ ```
238
+
239
+ ↑これは、スタート画面の「Playボタン」を押したときにマッチングを開始するコードです。
6
240
 
7
241
 
8
242
 
@@ -130,7 +364,7 @@
130
364
 
131
365
  このスクリプトは、シーンの空オブジェクトにアタッチしています。
132
366
 
133
- たらすぐにネットワークオブジェクトが生成されようにしています。
367
+ StartCotoutineで0秒遅延させるという無駄なコありすが、これはこの処理を遅延させたら今回の問題が解決するかなと思って試したものです。結果、問題は解決できなかったので今はとりあえず0にしています。
134
368
 
135
369
 
136
370
 
@@ -332,49 +566,15 @@
332
566
 
333
567
  ↑これは、カメラにアタッチしているコードです。
334
568
 
335
- Awake関数内で追従タゲットプレイヤObjを取得してい
569
+ Awake関数内のコードが今回の質問に関係があるコード、これより下のコドはカメラをマウスで動かすためドなのであり関係ありません
336
570
 
337
571
  配列で、Playerタグのついた全てのオブジェクトを参照しています。
338
572
 
339
- ActorNumberを使うことでカメラとプレイヤーObjがのネットワークオブジェクトなのか判別しています。
573
+ ActorNumberを使うことでカメラとプレイヤーObjectプレイヤーのネットワークオブジェクトなのか判別しています。
340
-
574
+
341
- そして参照したオブジェクトのAcotrNumberと、自身のActorNumber(カメラのActorNumber)が同じだった場合のみ、target変数にそのオブジェクトを代入しています。
575
+ そして参照したプレイヤーObjectのAcotrNumberと、自身のActorNumber(カメラのActorNumber)が同じだった場合のみ、target変数にそのオブジェクトを代入しています。
342
-
343
-
344
-
345
-
346
-
347
- ### 発生している問題・エラーメッセージ
576
+
348
-
349
-
350
-
351
-
352
-
353
-
354
-
355
- このコードを使うと、プレイヤーが一人だけの場合は上手く追従してくれるのですが、プレイヤーが複数いる場合は全てのプレイヤーでカメラが追従しなくなってしまいます。
577
+
356
-
357
- 画像のコードの一番下のDebug.Logで、target変数の中身を確認したのですが、プレイヤーが複数いてカメラが追従しなくなった場合も、target変数にはプレイヤーのオブジェクトが代入されていました。
358
-
359
-
360
-
361
-
362
-
363
- なぜこのコードで上記のような挙動になってしまうのかが分かりません。
364
-
365
- 原因がわかる方教えてください。
366
-
367
-
368
-
369
- ### 該当のソースコード
370
-
371
-
372
-
373
- ```ここに言語名を入力
374
-
375
- ソースコード
376
-
377
- ```
378
578
 
379
579
 
380
580
 

3

今までは問題が発生している部分のみのコードを切り抜いて記載していましたが、コード全文を記載するようにしました。

2020/10/24 09:18

投稿

kosho206
kosho206

スコア41

test CHANGED
File without changes
test CHANGED
@@ -1,33 +1,343 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- Photonを使ったオンラインマルチプレイのTPS系ゲームで、カメラプレイヤーに追従させたす。
4
-
5
- カメラとプレイヤーどちらもネットワークオブジェクトン開始時インスタンス化にしていま
6
-
7
-
8
-
9
- 本来なら問題が発生したコードのコピペ貼るべきですが、今、メインで使っていたPCを修理に出している状態で、どうしてもコードのコピペが用意できません。
10
-
11
- 画像なら見つけることができたので画像でお許しください。
12
-
13
-
14
-
15
- ![イメージ説明](9d9901052cb7c1a92f9293f9d53adfcf.jpeg)
16
-
17
- これは、シーン開始時にネットワークオブジェクトを生成するコードです。
18
-
19
- PhotonNetwork.Instantiateを使って生成しています。
20
-
21
- 画像が途切れてしまっていて、PhotonNetwork.Instantiateがどの関数内に書かれているのかわからなくなってしまっていますが、これは、Awake関数内に書かれています。
22
-
23
-
24
-
25
- ![イメージ説明](6034fb03c0b5610c06ebf6513fa1b226.jpeg)
26
-
27
- これは、カメラにアタッチしているコードです。
3
+ Photonを使ったオンラインマルチプレイのTPS系ゲームを作ってす。
4
+
5
+ カメラとプレイヤーキャラのオブジェクトをどちらもネットワークオブジェクトにしてカメラをプレイヤーに追従せたいのですが、カメラが追従すプレイヤーを取得する処理がまくせん
6
+
7
+
8
+
9
+ ```ここに言語入力
10
+
11
+ using System.Collections;
12
+
13
+ using System.Collections.Generic;
14
+
15
+ using Photon.Pun;
16
+
17
+ using Photon.Realtime;
18
+
19
+ using UnityEngine;
20
+
21
+ using UnityEngine.SceneManagement;
22
+
23
+
24
+
25
+ // MonoBehaviourではなくMonoBehaviourPunCallbacksを継承して、Photonのコールバックを受け取れるようにする
26
+
27
+ public class SampleScene : MonoBehaviourPunCallbacks
28
+
29
+ {
30
+
31
+ public GameObject unkoman { get; private set; }
32
+
33
+ object[] unkomanInitData = new object[1];
34
+
35
+ object[] cameraInitData = new object[1];
36
+
37
+
38
+
39
+ private void Awake()
40
+
41
+ {
42
+
43
+ SceneManager.sceneUnloaded += OnSceneUnloaded;
44
+
45
+ Debug.Log(PhotonNetwork.CurrentRoom);
46
+
47
+
48
+
49
+ StartCoroutine(InstantiateObj(0));//この数字は開発の途中で1にしたり2にしたりしていましたが、今は0にしています。
50
+
51
+ }
52
+
53
+ private IEnumerator InstantiateObj(float i_time)
54
+
55
+ {
56
+
57
+ yield return new WaitForSeconds(i_time);
58
+
59
+
60
+
61
+ // シーン遷移後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
62
+
63
+ var StartPos = new Vector3(Random.Range(-10f, 10f), 4f, Random.Range(-10f, 10f));
64
+
65
+ unkomanInitData = GetUnkomanInitData();
66
+
67
+ cameraInitData = GetCameraInitData();
68
+
69
+
70
+
71
+ unkoman = PhotonNetwork.Instantiate("UnkomanEmpty", StartPos, Quaternion.identity, 0, unkomanInitData);
72
+
73
+ PhotonNetwork.Instantiate("UnkomanCamera", unkoman.transform.position, Quaternion.identity, 0, cameraInitData);
74
+
75
+ }
76
+
77
+
78
+
79
+ object[] GetUnkomanInitData()
80
+
81
+ {
82
+
83
+ unkomanInitData[0] = PhotonNetwork.LocalPlayer.ActorNumber;
84
+
85
+ return unkomanInitData;
86
+
87
+ }
88
+
89
+ object[] GetCameraInitData()
90
+
91
+ {
92
+
93
+ cameraInitData[0] = PhotonNetwork.LocalPlayer.ActorNumber;
94
+
95
+ return cameraInitData;
96
+
97
+ }
98
+
99
+
100
+
101
+ private void Update()
102
+
103
+ {
104
+
105
+ if (Input.GetKey(KeyCode.Return)) SceneManager.LoadScene("UunkoStart");
106
+
107
+ }
108
+
109
+
110
+
111
+ void OnSceneUnloaded(Scene UunkoBattle)
112
+
113
+ {
114
+
115
+ PhotonNetwork.LeaveRoom();
116
+
117
+ Debug.Log(PhotonNetwork.CurrentRoom);
118
+
119
+ Debug.Log("Battleシーン終了");
120
+
121
+ SceneManager.sceneUnloaded -= OnSceneUnloaded;
122
+
123
+ }
124
+
125
+ }
126
+
127
+ ```
128
+
129
+ ↑これは、シーン開始時にネットワークオブジェクトを生成するコードです。
130
+
131
+ このスクリプトは、シーンの空オブジェクトにアタッチしています。
132
+
133
+ シーンが始まったらすぐにネットワークオブジェクトが生成されるようにしています。
134
+
135
+
136
+
137
+
138
+
139
+ ```ここに言語を入力
140
+
141
+ using System.Collections;
142
+
143
+ using System.Collections.Generic;
144
+
145
+ using UnityEngine;
146
+
147
+ using Photon.Pun;
148
+
149
+ using Photon.Realtime;
150
+
151
+
152
+
153
+ namespace CSharpScript
154
+
155
+ {
156
+
157
+ // [ExecuteInEditMode, DisallowMultipleComponent]
158
+
159
+ public class UnkomanCameraControl : MonoBehaviourPunCallbacks
160
+
161
+ {
162
+
163
+ private GameObject target;
164
+
165
+ public Vector3 offset;
166
+
167
+
168
+
169
+ [SerializeField] private float distance = 4.0f;
170
+
171
+ [SerializeField] private float polarAngle = 87.0f;
172
+
173
+ [SerializeField] private float azimuthalAngle = 270f;
174
+
175
+
176
+
177
+ [SerializeField] private float minPolarAngle = 2.0f;
178
+
179
+ [SerializeField] private float maxPolarAngle = 130.0f;
180
+
181
+ [SerializeField] private float mouseXSensitivity = 5.0f;
182
+
183
+ [SerializeField] private float mouseYSensitivity = 5.0f;
184
+
185
+
186
+
187
+ void Awake()
188
+
189
+ {
190
+
191
+ if (!photonView.IsMine) return;
192
+
193
+
194
+
195
+ Debug.Log("UnkomanCameraControl:Awake");
196
+
197
+ foreach (GameObject Unkoman in GameObject.FindGameObjectsWithTag("Player"))
198
+
199
+ {
200
+
201
+ int CameraActorNumber = (int)photonView.InstantiationData[0];
202
+
203
+ int UnkomanActorNumber = Unkoman.GetComponent<UnkomanControl>().unkomanActorNumber;
204
+
205
+
206
+
207
+ Debug.Log(CameraActorNumber);
208
+
209
+ Debug.Log(UnkomanActorNumber);
210
+
211
+
212
+
213
+ if (CameraActorNumber == UnkomanActorNumber)
214
+
215
+ {
216
+
217
+ Debug.Log("めい怖くないもん!!");
218
+
219
+ target = Unkoman;
220
+
221
+ }
222
+
223
+ }
224
+
225
+ Debug.Log(target);
226
+
227
+ }
228
+
229
+
230
+
231
+ void LateUpdate()
232
+
233
+ {
234
+
235
+ if (!photonView.IsMine || target == null) return;
236
+
237
+
238
+
239
+ updateAngle(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
240
+
241
+ var lookAtPos = target.transform.position + offset;
242
+
243
+ updatePosition(lookAtPos);
244
+
245
+ transform.LookAt(lookAtPos);
246
+
247
+
248
+
249
+ /*
250
+
251
+ //カーソル表示・非表示&ロック・アンロック
252
+
253
+ if (Input.GetKeyUp(KeyCode.Escape))
254
+
255
+ {
256
+
257
+ Cursor.visible = true;
258
+
259
+ Cursor.lockState = CursorLockMode.None;
260
+
261
+ }
262
+
263
+ if(Input.GetMouseButtonDown(0))
264
+
265
+ {
266
+
267
+ Cursor.visible = false;
268
+
269
+ Cursor.lockState = CursorLockMode.Locked;
270
+
271
+ }
272
+
273
+ */
274
+
275
+ }
276
+
277
+
278
+
279
+ void updateAngle(float x, float y)
280
+
281
+ {
282
+
283
+ if (!photonView.IsMine || target == null) return;
284
+
285
+ x = azimuthalAngle - x * mouseXSensitivity;
286
+
287
+ azimuthalAngle = Mathf.Repeat(x, 360);
288
+
289
+
290
+
291
+ y = polarAngle + y * mouseYSensitivity;
292
+
293
+ polarAngle = Mathf.Clamp(y, minPolarAngle, maxPolarAngle);
294
+
295
+ }
296
+
297
+
298
+
299
+
300
+
301
+ void updatePosition(Vector3 lookAtPos)
302
+
303
+ {
304
+
305
+ if (!photonView.IsMine || target == null) return;
306
+
307
+ var da = azimuthalAngle * Mathf.Deg2Rad;
308
+
309
+ var dp = polarAngle * Mathf.Deg2Rad;
310
+
311
+ transform.position = new Vector3
312
+
313
+ (
314
+
315
+ lookAtPos.x + distance * Mathf.Sin(dp) * Mathf.Cos(da),
316
+
317
+ lookAtPos.y + distance * Mathf.Cos(dp),
318
+
319
+ lookAtPos.z + distance * Mathf.Sin(dp) * Mathf.Sin(da)
320
+
321
+ );
322
+
323
+
324
+
325
+ }
326
+
327
+ }
328
+
329
+ }
330
+
331
+ ```
332
+
333
+ ↑これは、カメラにアタッチしているコードです。
334
+
335
+ Awake関数内で追従ターゲットのプレイヤーObjを取得しています。
28
336
 
29
337
  配列で、Playerタグのついた全てのオブジェクトを参照しています。
30
338
 
339
+ ActorNumberを使うことでカメラとプレイヤーObjが誰のネットワークオブジェクトなのか判別しています。
340
+
31
341
  そして参照したオブジェクトのAcotrNumberと、自身のActorNumber(カメラのActorNumber)が同じだった場合のみ、target変数にそのオブジェクトを代入しています。
32
342
 
33
343
 
@@ -56,12 +366,6 @@
56
366
 
57
367
 
58
368
 
59
- 最初に書いた通り、メインで使っているPCは修理に出している状態のため、回答をいただいてもすぐにコードを書き換えて実行することはできません。
60
-
61
- ですが、PCが修理から帰ってくるのをただ待っているとその間開発が全く進まなくなってしまい、それが嫌なのでこのように質問させていただきました。
62
-
63
-
64
-
65
369
  ### 該当のソースコード
66
370
 
67
371
 

2

タイトルに誤字があったので修正しました

2020/10/07 08:40

投稿

kosho206
kosho206

スコア41

test CHANGED
@@ -1 +1 @@
1
- 【Unity】Photonで、カメラプレイヤー追従させたいのですが、プレイヤーが複数いると追従してくれません。
1
+ 【Unity】Photonで、カメラプレイヤー追従させたいのですが、プレイヤーが複数いると追従してくれません。
test CHANGED
File without changes

1

メインのPCを修理に出していて開発作業ができない状態なのに関わらず、質問投稿をした理由を追記しました。

2020/09/08 10:53

投稿

kosho206
kosho206

スコア41

test CHANGED
File without changes
test CHANGED
@@ -56,6 +56,10 @@
56
56
 
57
57
 
58
58
 
59
+ 最初に書いた通り、メインで使っているPCは修理に出している状態のため、回答をいただいてもすぐにコードを書き換えて実行することはできません。
60
+
61
+ ですが、PCが修理から帰ってくるのをただ待っているとその間開発が全く進まなくなってしまい、それが嫌なのでこのように質問させていただきました。
62
+
59
63
 
60
64
 
61
65
  ### 該当のソースコード