質問編集履歴

6

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

2020/10/25 09:33

投稿

kosho206
kosho206

スコア41

title CHANGED
File without changes
body CHANGED
@@ -28,6 +28,8 @@
28
28
  原因がわかる方教えてください。
29
29
 
30
30
  ### 該当のソースコード
31
+
32
+ ```ここに言語を入力
31
33
  using System.Collections;
32
34
  using System.Collections.Generic;
33
35
  using UnityEngine;
@@ -117,6 +119,7 @@
117
119
  }
118
120
  }
119
121
  ```
122
+
120
123
  ↑これは、スタート画面の「Playボタン」を押したときにマッチングを開始するコードです。
121
124
 
122
125
  ```ここに言語を入力

5

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

2020/10/25 09:33

投稿

kosho206
kosho206

スコア41

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

4

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

2020/10/24 09:23

投稿

kosho206
kosho206

スコア41

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,124 @@
1
1
  ### 前提・実現したいこと
2
2
  Photonを使ったオンラインマルチプレイのTPS系ゲームを作っています。
3
- カメラとプレイヤーキャラのオブジェクトどちらもネットワークオブジェクトにして、カメラをプレイヤーに追従させたいのですが、カメラ追従するプレイヤーを取得する処理がうまくいきません。
3
+ カメラをプレイヤーに追従させたいのですが、カメラ追従対象のプレイヤーObjectを取得する処理がうまくいきません。
4
+ カメラとプレイヤーはどちらもネットワークオブジェクトです。
4
5
 
6
+ 下記が、ゲーム開始から追従対象取得までの処理の流れです。
7
+
8
+ 1.今作っているゲームは、「スタート画面のScene」と「バトル画面のシーンに分かれています。
9
+ まずはスタート画面から始まって、スタート画面にある「Play」ボタンを押すとマッチングが開始されます。
10
+
11
+ 2.マッチングをして、自分のRoomのプレイヤー人数が定員数になったらバトル画面のシーンに遷移します。
12
+
13
+ 3.バトル画面のシーンに遷移したら、ネットワークオブジェクトを生成します(プレイヤーObjectとカメラ)。
14
+
15
+ 4.カメラとプレイヤーObjectのActorNumberを取得します。
16
+  カメラのコードで、カメラのActorNumberとプレイヤーObjectのActorNumberを比べて、カメラのActorNumberと同じActorNumberのプレイヤーObjectを取得します。
17
+ ここで取得したプレイヤーObjectがカメラの追従対象となります。
18
+
19
+
20
+
21
+ ### 発生している問題・エラーメッセージ
22
+ このコードを使うと、プレイヤーが一人だけの場合は上手く追従してくれるのですが、プレイヤーが複数いる場合は全てのプレイヤーでカメラが追従しなくなってしまいます。
23
+ 画像のコードの一番下のDebug.Logで、target変数の中身を確認したのですが、プレイヤーが複数いてカメラが追従しなくなった場合も、target変数にはプレイヤーのオブジェクトが代入されていました。
24
+
25
+
26
+
27
+ なぜこのコードで上記のような挙動になってしまうのかが分かりません。
28
+ 原因がわかる方教えてください。
29
+
30
+ ### 該当のソースコード
31
+ using System.Collections;
32
+ using System.Collections.Generic;
33
+ using UnityEngine;
34
+ using UnityEngine.UI;
35
+ using UnityEngine.SceneManagement;
36
+ using Photon.Realtime;
37
+ using Photon.Pun;
38
+
39
+ public class StartButton : MonoBehaviourPunCallbacks
40
+ {
41
+ public static int RoomPlayerCapacity { get; private set; }
42
+
43
+ [SerializeField, Range(1, 15)]
44
+ int capa;
45
+
46
+ float ButtonClicdedInterval;
47
+
48
+ void Start()
49
+ {
50
+ Cursor.visible = true;
51
+ Cursor.lockState = CursorLockMode.None;
52
+ RoomPlayerCapacity = capa;
53
+ }
54
+
55
+
56
+
57
+ //Playボタンを押したらマスターサーバーへ接続する
58
+ //サーバーへ接続してすぐにルームに参加しようとすると処理が間に合わず、エラーになるので2秒遅延させる
59
+ public void ButtonClicded()
60
+ {
61
+ if (PhotonNetwork.IsConnectedAndReady == false) PhotonNetwork.ConnectUsingSettings();
62
+ StartCoroutine(JoinRandomRoom(2f));
63
+ }
64
+ private IEnumerator JoinRandomRoom(float i_time)
65
+ {
66
+ yield return new WaitForSeconds(i_time);
67
+
68
+ PhotonNetwork.JoinRandomRoom();
69
+ }
70
+
71
+ // マッチングが成功した時に呼ばれるコールバック
72
+ public override void OnJoinedRoom()
73
+ {
74
+ Debug.Log("ルームに参加しました");
75
+ }
76
+
77
+ // 通常のマッチングが失敗した時に呼ばれるコールバック
78
+ public override void OnJoinRoomFailed(short returnCode, string message)
79
+ {
80
+ Debug.Log($"ルーム参加に失敗しました: {message}");
81
+ }
82
+
83
+ // ランダムマッチングが失敗した時に呼ばれるコールバック
84
+ public override void OnJoinRandomFailed(short returnCode, string message)
85
+ {
86
+ // ランダムに参加できるルームが存在しないなら、新しいルームを作成する
87
+ PhotonNetwork.CreateRoom(null);
88
+ Debug.Log("ルーム作成");
89
+ }
90
+
91
+ //ルームの設定
92
+ public void CreateRoomWity()
93
+ {
94
+ PhotonNetwork.CreateRoom(
95
+ null,
96
+ new RoomOptions()
97
+ {
98
+ MaxPlayers = 15
99
+ }
100
+ ) ;
101
+ }
102
+
103
+ private void Update()
104
+ {
105
+ //実行してから1秒間はルーム参加の処理を行わないための変数
106
+ //ゲーム実行後すぐにサーバーに接続しようとすると処理が間に合わずエラーになる
107
+ ButtonClicdedInterval += Time.deltaTime;
108
+
109
+ Debug.Log(PhotonNetwork.CurrentRoom);
110
+ if (PhotonNetwork.CurrentRoom == null) return;
111
+
112
+ if (ButtonClicdedInterval > 1 && PhotonNetwork.CurrentRoom.PlayerCount == RoomPlayerCapacity)
113
+ {
114
+ SceneManager.LoadScene("UunkoBattle");
115
+ ButtonClicdedInterval = 0f;
116
+ }
117
+ }
118
+ }
119
+ ```
120
+ ↑これは、スタート画面の「Playボタン」を押したときにマッチングを開始するコードです。
121
+
5
122
  ```ここに言語を入力
6
123
  using System.Collections;
7
124
  using System.Collections.Generic;
@@ -64,7 +181,7 @@
64
181
  ```
65
182
  ↑これは、シーン開始時にネットワークオブジェクトを生成するコードです。
66
183
  このスクリプトは、シーンの空オブジェクトにアタッチしています。
67
- ったらぐにネットワークオブジェクト生成されるようにしています。
184
+ StartCotoutineで0秒遅延させるという無駄なコありますが、こはこの処理を遅延させたら今回の問題が解決すかなと思って試したものです。結果、問題は解決できなかったので今はとりあえず0にしています。
68
185
 
69
186
 
70
187
  ```ここに言語を入力
@@ -165,29 +282,12 @@
165
282
  }
166
283
  ```
167
284
  ↑これは、カメラにアタッチしているコードです。
168
- Awake関数内で追従タゲットプレイヤObj取得しています。
285
+ Awake関数内のコドが今回質問に関係があるコドで、これより下のコードはカメラマウスで動かためのコードなのであまり関係ありません
169
286
  配列で、Playerタグのついた全てのオブジェクトを参照しています。
170
- ActorNumberを使うことでカメラとプレイヤーObjのネットワークオブジェクトなのか判別しています。
287
+ ActorNumberを使うことでカメラとプレイヤーObjectプレイヤーのネットワークオブジェクトなのか判別しています。
171
- そして参照したオブジェクトのAcotrNumberと、自身のActorNumber(カメラのActorNumber)が同じだった場合のみ、target変数にそのオブジェクトを代入しています。
288
+ そして参照したプレイヤーObjectのAcotrNumberと、自身のActorNumber(カメラのActorNumber)が同じだった場合のみ、target変数にそのオブジェクトを代入しています。
172
289
 
173
290
 
174
- ### 発生している問題・エラーメッセージ
175
-
176
-
177
-
178
- このコードを使うと、プレイヤーが一人だけの場合は上手く追従してくれるのですが、プレイヤーが複数いる場合は全てのプレイヤーでカメラが追従しなくなってしまいます。
179
- 画像のコードの一番下のDebug.Logで、target変数の中身を確認したのですが、プレイヤーが複数いてカメラが追従しなくなった場合も、target変数にはプレイヤーのオブジェクトが代入されていました。
180
-
181
-
182
- なぜこのコードで上記のような挙動になってしまうのかが分かりません。
183
- 原因がわかる方教えてください。
184
-
185
- ### 該当のソースコード
186
-
187
- ```ここに言語名を入力
188
- ソースコード
189
- ```
190
-
191
291
  ### 試したこと
192
292
 
193
293
  ここに問題に対して試したことを記載してください。

3

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

2020/10/24 09:18

投稿

kosho206
kosho206

スコア41

title CHANGED
File without changes
body CHANGED
@@ -1,18 +1,173 @@
1
1
  ### 前提・実現したいこと
2
- Photonを使ったオンラインマルチプレイのTPS系ゲームで、カメラプレイヤーに追従させたす。
2
+ Photonを使ったオンラインマルチプレイのTPS系ゲームを作ってす。
3
- カメラとプレイヤーどちらもネットワークオブジェクトン開始時インスタンス化にしていま
3
+ カメラとプレイヤーキャラのオブジェクトをどちらもネットワークオブジェクトにしてカメラをプレイヤーに追従せたいのですが、カメラが追従すプレイヤーを取得する処理がまくせん
4
4
 
5
- 本来なら問題が発生したコードのコピペを貼るべきですが、今、メインで使っていたPCを修理出している状態で、どうしてもコードのコピペが用意できません。
5
+ ```ここ言語を入力
6
- 画像なら見つけることができたので画像でお許しください。
6
+ using System.Collections;
7
+ using System.Collections.Generic;
8
+ using Photon.Pun;
9
+ using Photon.Realtime;
10
+ using UnityEngine;
11
+ using UnityEngine.SceneManagement;
7
12
 
13
+ // MonoBehaviourではなくMonoBehaviourPunCallbacksを継承して、Photonのコールバックを受け取れるようにする
14
+ public class SampleScene : MonoBehaviourPunCallbacks
15
+ {
8
- ![イメージ説明](9d9901052cb7c1a92f9293f9d53adfcf.jpeg)
16
+ public GameObject unkoman { get; private set; }
9
- これは、シーン開始時にネットワークオブジェクトを生成するコードです。
10
- PhotonNetwork.Instantiateを使って生成しています。
17
+ object[] unkomanInitData = new object[1];
11
- 画像が途切れてしまっていて、PhotonNetwork.Instantiateがどの関数内に書かれているのかわからなくなってしまっていますが、これは、Awake関数内に書かれています。
18
+ object[] cameraInitData = new object[1];
12
19
 
20
+ private void Awake()
21
+ {
22
+ SceneManager.sceneUnloaded += OnSceneUnloaded;
23
+ Debug.Log(PhotonNetwork.CurrentRoom);
24
+
25
+ StartCoroutine(InstantiateObj(0));//この数字は開発の途中で1にしたり2にしたりしていましたが、今は0にしています。
26
+ }
13
- ![イメージ説明](6034fb03c0b5610c06ebf6513fa1b226.jpeg)
27
+ private IEnumerator InstantiateObj(float i_time)
28
+ {
29
+ yield return new WaitForSeconds(i_time);
30
+
31
+ // シーン遷移後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
32
+ var StartPos = new Vector3(Random.Range(-10f, 10f), 4f, Random.Range(-10f, 10f));
33
+ unkomanInitData = GetUnkomanInitData();
34
+ cameraInitData = GetCameraInitData();
35
+
36
+ unkoman = PhotonNetwork.Instantiate("UnkomanEmpty", StartPos, Quaternion.identity, 0, unkomanInitData);
37
+ PhotonNetwork.Instantiate("UnkomanCamera", unkoman.transform.position, Quaternion.identity, 0, cameraInitData);
38
+ }
39
+
40
+ object[] GetUnkomanInitData()
41
+ {
42
+ unkomanInitData[0] = PhotonNetwork.LocalPlayer.ActorNumber;
43
+ return unkomanInitData;
44
+ }
45
+ object[] GetCameraInitData()
46
+ {
47
+ cameraInitData[0] = PhotonNetwork.LocalPlayer.ActorNumber;
48
+ return cameraInitData;
49
+ }
50
+
51
+ private void Update()
52
+ {
53
+ if (Input.GetKey(KeyCode.Return)) SceneManager.LoadScene("UunkoStart");
54
+ }
55
+
56
+ void OnSceneUnloaded(Scene UunkoBattle)
57
+ {
58
+ PhotonNetwork.LeaveRoom();
59
+ Debug.Log(PhotonNetwork.CurrentRoom);
60
+ Debug.Log("Battleシーン終了");
61
+ SceneManager.sceneUnloaded -= OnSceneUnloaded;
62
+ }
63
+ }
64
+ ```
65
+ ↑これは、シーン開始時にネットワークオブジェクトを生成するコードです。
66
+ このスクリプトは、シーンの空オブジェクトにアタッチしています。
67
+ シーンが始まったらすぐにネットワークオブジェクトが生成されるようにしています。
68
+
69
+
70
+ ```ここに言語を入力
71
+ using System.Collections;
72
+ using System.Collections.Generic;
73
+ using UnityEngine;
74
+ using Photon.Pun;
75
+ using Photon.Realtime;
76
+
77
+ namespace CSharpScript
78
+ {
79
+ // [ExecuteInEditMode, DisallowMultipleComponent]
80
+ public class UnkomanCameraControl : MonoBehaviourPunCallbacks
81
+ {
82
+ private GameObject target;
83
+ public Vector3 offset;
84
+
85
+ [SerializeField] private float distance = 4.0f;
86
+ [SerializeField] private float polarAngle = 87.0f;
87
+ [SerializeField] private float azimuthalAngle = 270f;
88
+
89
+ [SerializeField] private float minPolarAngle = 2.0f;
90
+ [SerializeField] private float maxPolarAngle = 130.0f;
91
+ [SerializeField] private float mouseXSensitivity = 5.0f;
92
+ [SerializeField] private float mouseYSensitivity = 5.0f;
93
+
94
+ void Awake()
95
+ {
96
+ if (!photonView.IsMine) return;
97
+
98
+ Debug.Log("UnkomanCameraControl:Awake");
99
+ foreach (GameObject Unkoman in GameObject.FindGameObjectsWithTag("Player"))
100
+ {
101
+ int CameraActorNumber = (int)photonView.InstantiationData[0];
102
+ int UnkomanActorNumber = Unkoman.GetComponent<UnkomanControl>().unkomanActorNumber;
103
+
104
+ Debug.Log(CameraActorNumber);
105
+ Debug.Log(UnkomanActorNumber);
106
+
107
+ if (CameraActorNumber == UnkomanActorNumber)
108
+ {
109
+ Debug.Log("めい怖くないもん!!");
110
+ target = Unkoman;
111
+ }
112
+ }
113
+ Debug.Log(target);
114
+ }
115
+
116
+ void LateUpdate()
117
+ {
118
+ if (!photonView.IsMine || target == null) return;
119
+
120
+ updateAngle(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
121
+ var lookAtPos = target.transform.position + offset;
122
+ updatePosition(lookAtPos);
123
+ transform.LookAt(lookAtPos);
124
+
125
+ /*
126
+ //カーソル表示・非表示&ロック・アンロック
127
+ if (Input.GetKeyUp(KeyCode.Escape))
128
+ {
129
+ Cursor.visible = true;
130
+ Cursor.lockState = CursorLockMode.None;
131
+ }
132
+ if(Input.GetMouseButtonDown(0))
133
+ {
134
+ Cursor.visible = false;
135
+ Cursor.lockState = CursorLockMode.Locked;
136
+ }
137
+ */
138
+ }
139
+
140
+ void updateAngle(float x, float y)
141
+ {
142
+ if (!photonView.IsMine || target == null) return;
143
+ x = azimuthalAngle - x * mouseXSensitivity;
144
+ azimuthalAngle = Mathf.Repeat(x, 360);
145
+
146
+ y = polarAngle + y * mouseYSensitivity;
147
+ polarAngle = Mathf.Clamp(y, minPolarAngle, maxPolarAngle);
148
+ }
149
+
150
+
151
+ void updatePosition(Vector3 lookAtPos)
152
+ {
153
+ if (!photonView.IsMine || target == null) return;
154
+ var da = azimuthalAngle * Mathf.Deg2Rad;
155
+ var dp = polarAngle * Mathf.Deg2Rad;
156
+ transform.position = new Vector3
157
+ (
158
+ lookAtPos.x + distance * Mathf.Sin(dp) * Mathf.Cos(da),
159
+ lookAtPos.y + distance * Mathf.Cos(dp),
160
+ lookAtPos.z + distance * Mathf.Sin(dp) * Mathf.Sin(da)
161
+ );
162
+
163
+ }
164
+ }
165
+ }
166
+ ```
14
- これは、カメラにアタッチしているコードです。
167
+ これは、カメラにアタッチしているコードです。
168
+ Awake関数内で追従ターゲットのプレイヤーObjを取得しています。
15
169
  配列で、Playerタグのついた全てのオブジェクトを参照しています。
170
+ ActorNumberを使うことでカメラとプレイヤーObjが誰のネットワークオブジェクトなのか判別しています。
16
171
  そして参照したオブジェクトのAcotrNumberと、自身のActorNumber(カメラのActorNumber)が同じだった場合のみ、target変数にそのオブジェクトを代入しています。
17
172
 
18
173
 
@@ -27,9 +182,6 @@
27
182
  なぜこのコードで上記のような挙動になってしまうのかが分かりません。
28
183
  原因がわかる方教えてください。
29
184
 
30
- 最初に書いた通り、メインで使っているPCは修理に出している状態のため、回答をいただいてもすぐにコードを書き換えて実行することはできません。
31
- ですが、PCが修理から帰ってくるのをただ待っているとその間開発が全く進まなくなってしまい、それが嫌なのでこのように質問させていただきました。
32
-
33
185
  ### 該当のソースコード
34
186
 
35
187
  ```ここに言語名を入力

2

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

2020/10/07 08:40

投稿

kosho206
kosho206

スコア41

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

1

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

2020/09/08 10:53

投稿

kosho206
kosho206

スコア41

title CHANGED
File without changes
body CHANGED
@@ -27,6 +27,8 @@
27
27
  なぜこのコードで上記のような挙動になってしまうのかが分かりません。
28
28
  原因がわかる方教えてください。
29
29
 
30
+ 最初に書いた通り、メインで使っているPCは修理に出している状態のため、回答をいただいてもすぐにコードを書き換えて実行することはできません。
31
+ ですが、PCが修理から帰ってくるのをただ待っているとその間開発が全く進まなくなってしまい、それが嫌なのでこのように質問させていただきました。
30
32
 
31
33
  ### 該当のソースコード
32
34