回答編集履歴

2

CameraControllerがRollと同一のオブジェクトにアタッチされているとは限らないことを考慮し、インスペクター上での参照セットに変更

2021/07/03 08:59

投稿

Bongo
Bongo

スコア10811

test CHANGED
@@ -168,7 +168,7 @@
168
168
 
169
169
 
170
170
 
171
- そして`Roll`は下記のようにしてみました。これでどうでしょうか?
171
+ そして`Roll`は下記のようにしてみました。なお、マウスによるカメラ回転スクリプトは`CameraController`という名前だと仮定しています。これでどうでしょうか?
172
172
 
173
173
 
174
174
 
@@ -184,21 +184,9 @@
184
184
 
185
185
  {
186
186
 
187
- // CameraControllerを保持するためのフィールドを追加し...
187
+ // CameraControllerを保持するためのフィールドを追加し、インスペクター上でオブジェクトをセットしておく
188
-
188
+
189
- private CameraController cameraController;
189
+ [SerializeField] private CameraController cameraController;
190
-
191
-
192
-
193
- // Awakeタイミングで参照を取得しておく
194
-
195
- private void Awake()
196
-
197
- {
198
-
199
- cameraController = GetComponent<CameraController>();
200
-
201
- }
202
190
 
203
191
 
204
192
 

1

他スクリプト干渉の防止案を追記

2021/07/03 08:59

投稿

Bongo
Bongo

スコア10811

test CHANGED
@@ -59,3 +59,181 @@
59
59
  }
60
60
 
61
61
  ```
62
+
63
+
64
+
65
+ ## マウスによるカメラ回転スクリプトの干渉を排除することについて
66
+
67
+
68
+
69
+ まず、マウスによるカメラ回転スクリプトの`Update`周辺を下記のように変更しました。
70
+
71
+
72
+
73
+ ```lang-csharp
74
+
75
+ // マウス操作を許可するかどうかを表すプロパティを追加する
76
+
77
+ public bool MouseControlIsEnabled { get; set; } = true;
78
+
79
+
80
+
81
+ // rotXを外部から変更できるようにしておく
82
+
83
+ public float RotX
84
+
85
+ {
86
+
87
+ get => rotX;
88
+
89
+ set => rotX = value;
90
+
91
+ }
92
+
93
+
94
+
95
+ void Update()
96
+
97
+ {
98
+
99
+ // UIオブジェクト上にマウスポインタがある場合、またはマウス操作が許可されていない場合、処理は行わない
100
+
101
+ if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject() || !MouseControlIsEnabled)
102
+
103
+ {
104
+
105
+ return;
106
+
107
+ }
108
+
109
+
110
+
111
+ // 以下、Updateの主要部分は変更なし
112
+
113
+
114
+
115
+ if (Input.GetMouseButton(0))
116
+
117
+ {
118
+
119
+ rotX -= Input.GetAxis("Mouse X") * mouseSensitivity;
120
+
121
+ rotY -= Input.GetAxis("Mouse Y") * mouseSensitivity;
122
+
123
+ rotX = ClampAngle(rotX, minX, maxX);
124
+
125
+ rotY = ClampAngle(rotY, minY, maxY);
126
+
127
+
128
+
129
+
130
+
131
+ Quaternion xQuaternion = Quaternion.AngleAxis(rotX, Vector3.up);
132
+
133
+
134
+
135
+ Quaternion yQuaternion = Quaternion.AngleAxis(rotY, Vector3.left);
136
+
137
+
138
+
139
+ Camera.main.transform.localRotation = originalRot * xQuaternion * yQuaternion;
140
+
141
+ }
142
+
143
+
144
+
145
+ scroll = Input.GetAxis("Mouse ScrollWheel");
146
+
147
+ Camera.main.fieldOfView -= scroll * scrollSpeed;
148
+
149
+ if (Camera.main.fieldOfView < minFov)
150
+
151
+ {
152
+
153
+ Camera.main.fieldOfView = minFov;
154
+
155
+ }
156
+
157
+ else if (Camera.main.fieldOfView > maxFov)
158
+
159
+ {
160
+
161
+ Camera.main.fieldOfView = maxFov;
162
+
163
+ }
164
+
165
+ }
166
+
167
+ ```
168
+
169
+
170
+
171
+ そして`Roll`は下記のようにしてみました。これでどうでしょうか?
172
+
173
+
174
+
175
+ ```lang-csharp
176
+
177
+ using UnityEngine;
178
+
179
+ using DG.Tweening;
180
+
181
+
182
+
183
+ public class Roll : MonoBehaviour
184
+
185
+ {
186
+
187
+ // CameraControllerを保持するためのフィールドを追加し...
188
+
189
+ private CameraController cameraController;
190
+
191
+
192
+
193
+ // Awakeタイミングで参照を取得しておく
194
+
195
+ private void Awake()
196
+
197
+ {
198
+
199
+ cameraController = GetComponent<CameraController>();
200
+
201
+ }
202
+
203
+
204
+
205
+ public void OnClick()
206
+
207
+ {
208
+
209
+ // まずCameraControllerによる回転を禁止する
210
+
211
+ cameraController.MouseControlIsEnabled = false;
212
+
213
+
214
+
215
+ // 回転前の向きを覚えておき...
216
+
217
+ var preRotation = transform.localRotation;
218
+
219
+
220
+
221
+ // 回転後に姿勢の変位を調べてCameraControllerのRotXを更新したのち、マウス操作による回転を許可する
222
+
223
+ transform.DORotate(new Vector3(0f, 30f, 0f), 2f, RotateMode.WorldAxisAdd).SetEase(Ease.InOutQuart).OnComplete(
224
+
225
+ () =>
226
+
227
+ {
228
+
229
+ cameraController.RotX += (transform.localRotation * Quaternion.Inverse(preRotation)).eulerAngles.y;
230
+
231
+ cameraController.MouseControlIsEnabled = true;
232
+
233
+ });
234
+
235
+ }
236
+
237
+ }
238
+
239
+ ```