質問編集履歴
4
解決後、修正済み記述を掲載。
title
CHANGED
File without changes
|
body
CHANGED
@@ -184,11 +184,7 @@
|
|
184
184
|
|
185
185
|
if (OnRotateTouchDown() == true)
|
186
186
|
{
|
187
|
-
if (t.phase == TouchPhase.Began)
|
188
|
-
{
|
189
|
-
Rostart = t.position; //同様の変更
|
190
|
-
}
|
191
|
-
//
|
187
|
+
//略
|
192
188
|
}
|
193
189
|
}
|
194
190
|
}
|
@@ -206,20 +202,7 @@
|
|
206
202
|
PointerEventData pointer = new PointerEventData(EventSystem.current);
|
207
203
|
//pointer.position = Input.mousePosition; //★ご指摘の箇所★
|
208
204
|
pointer.position = t.position; //上記述から変更
|
209
|
-
List<RaycastResult> result = new List<RaycastResult>();
|
210
|
-
EventSystem.current.RaycastAll(pointer, result);
|
211
|
-
|
212
|
-
foreach (RaycastResult raycastResult in result)
|
213
|
-
{
|
214
|
-
if (raycastResult.gameObject.tag == "MoveController")
|
215
|
-
{
|
216
|
-
|
205
|
+
//以下、略
|
217
|
-
}
|
218
|
-
}
|
219
|
-
}
|
220
|
-
}
|
221
|
-
}
|
222
|
-
return false;
|
223
206
|
}
|
224
207
|
|
225
208
|
bool OnRotateTouchDown()
|
@@ -251,10 +234,6 @@
|
|
251
234
|
Touch? r = OnRotateTouchDown();
|
252
235
|
if (r != null)
|
253
236
|
{
|
254
|
-
if (r.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
|
255
|
-
{
|
256
|
-
Rostart = r.position; //'position'同様
|
257
|
-
}
|
258
237
|
//中略
|
259
238
|
}
|
260
239
|
}
|
@@ -265,29 +244,77 @@
|
|
265
244
|
{
|
266
245
|
for (int i = 0; i < Input.touchCount; i++)
|
267
246
|
{
|
247
|
+
//中略
|
248
|
+
if (raycastResult.gameObject.tag == "MoveController")
|
249
|
+
{
|
250
|
+
return t;
|
251
|
+
}}}}}
|
252
|
+
return null;
|
253
|
+
}
|
254
|
+
|
255
|
+
Touch? OnRotateTouchDown()
|
256
|
+
{
|
257
|
+
//略
|
258
|
+
}
|
259
|
+
```
|
260
|
+
### 解決後の記述(一部、略)
|
261
|
+
```C#
|
262
|
+
//いろいろ略
|
263
|
+
using UnityEngine.EventSystems;
|
264
|
+
|
265
|
+
void Update()
|
266
|
+
{
|
267
|
+
if (Input.touchCount > 0)
|
268
|
+
{
|
269
|
+
for (int i = 0; i < Input.touchCount; i++)
|
270
|
+
{
|
268
271
|
Touch t = Input.GetTouch(i);
|
269
|
-
if (t
|
272
|
+
if (OnMoveTouchDown(t) == true) //チェック中のTouchを引数で渡す
|
270
273
|
{
|
271
|
-
PointerEventData pointer = new PointerEventData(EventSystem.current);
|
272
|
-
|
274
|
+
if (t.phase == TouchPhase.Began)
|
273
|
-
List<RaycastResult> result = new List<RaycastResult>();
|
274
|
-
EventSystem.current.RaycastAll(pointer, result);
|
275
|
-
|
276
|
-
foreach (RaycastResult raycastResult in result)
|
277
275
|
{
|
278
|
-
if (raycastResult.gameObject.tag == "MoveController")
|
279
|
-
{
|
280
|
-
|
276
|
+
Movestart = t.position;
|
281
|
-
}
|
282
277
|
}
|
278
|
+
if (t.phase == TouchPhase.Moved)
|
279
|
+
{
|
280
|
+
Move = t.position;
|
281
|
+
deltaX = (Move - Movestart).x;
|
282
|
+
deltaZ = (Move - Movestart).y;
|
283
|
+
}
|
284
|
+
//略
|
283
285
|
}
|
286
|
+
|
287
|
+
if (OnRotateTouchDown(t) == true) //チェック中のTouchを引数で渡す
|
288
|
+
{
|
289
|
+
//略
|
290
|
+
}
|
284
291
|
}
|
285
292
|
}
|
286
|
-
return null;
|
287
293
|
}
|
288
294
|
|
295
|
+
bool OnMoveTouchDown(Touch t)
|
296
|
+
{ //当初for文を入れていたが、Update内で済ませているので不要
|
297
|
+
if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
|
298
|
+
{
|
299
|
+
PointerEventData pointer = new PointerEventData(EventSystem.current);
|
300
|
+
pointer.position = t.position;
|
301
|
+
List<RaycastResult> result = new List<RaycastResult>();
|
302
|
+
EventSystem.current.RaycastAll(pointer, result);
|
303
|
+
|
304
|
+
foreach (RaycastResult raycastResult in result)
|
305
|
+
{
|
306
|
+
if (raycastResult.gameObject.tag == "MoveController")
|
307
|
+
{
|
308
|
+
return true;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
}
|
312
|
+
return false;
|
313
|
+
}
|
314
|
+
|
289
|
-
|
315
|
+
bool OnRotateTouchDown(Touch t)
|
290
316
|
{
|
291
|
-
|
317
|
+
//略
|
292
318
|
}
|
319
|
+
}
|
293
320
|
```
|
3
追試スクリプト記述(2):微修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -237,9 +237,10 @@
|
|
237
237
|
{
|
238
238
|
//“Move~”にタッチしているか
|
239
239
|
Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
|
240
|
-
if (t != null)
|
240
|
+
if (t != null) //Touch?のため、ここは通過
|
241
241
|
{
|
242
|
+
Debug.Log(t); //Touchログが出るが…
|
242
|
-
if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
|
243
|
+
if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない.エラー
|
243
244
|
{
|
244
245
|
Movestart = t.position; //'position'同様
|
245
246
|
}
|
2
回答に合わせて追試記述(1)+(2)
title
CHANGED
File without changes
|
body
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
### 問題のスクリプト
|
24
24
|
以下は、動作させるオブジェクトにアタッチしているスクリプトです。
|
25
25
|
問題があるのがどの部分か判断できず、全記述を掲載させていただきます。当たり前ですが、エラー警告は発生していません。
|
26
|
-
```
|
26
|
+
```C#
|
27
27
|
using System.Collections;
|
28
28
|
using System.Collections.Generic;
|
29
29
|
using UnityEngine;
|
@@ -156,4 +156,137 @@
|
|
156
156
|
### 追記
|
157
157
|
「根本的におめーの学習が足りてないだろ」というご指摘は避けられませんので、「ここを見ろ」「あれを読め」というだけのご回答でもありがたいです。
|
158
158
|
|
159
|
-
※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。
|
159
|
+
※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。
|
160
|
+
### 追試スクリプト記述(1)
|
161
|
+
この記述の場合、タッチの混同が発生しました。
|
162
|
+
事例:画面左(-x)のMoveコントローラーで移動動作中、画面右(+x)のRotateコントローラーにタッチする
|
163
|
+
→対象Objが左(-x)に大きく吹っ飛ぶ+新規のデバックログMovestartを確認
|
164
|
+
→条件が一致しないはずの、後発のRotateタッチが、MoveタッチBeganとして判定されている。
|
165
|
+
```C#
|
166
|
+
//前略
|
167
|
+
|
168
|
+
void Update () {
|
169
|
+
if (Input.touchCount > 0)
|
170
|
+
{
|
171
|
+
for (int i = 0; i < Input.touchCount; i++)
|
172
|
+
{
|
173
|
+
Touch t = Input.GetTouch(i);
|
174
|
+
if (OnMoveTouchDown() == true)
|
175
|
+
{
|
176
|
+
if (t.phase == TouchPhase.Began)
|
177
|
+
{
|
178
|
+
//Movestart = myTouches[i].position; //御回答の指摘と直接関係しないが下に変更
|
179
|
+
Movestart = t.position;
|
180
|
+
Debug.Log("Movestart" + Movestart); //タッチ混同を確認
|
181
|
+
}
|
182
|
+
//中略
|
183
|
+
}
|
184
|
+
|
185
|
+
if (OnRotateTouchDown() == true)
|
186
|
+
{
|
187
|
+
if (t.phase == TouchPhase.Began)
|
188
|
+
{
|
189
|
+
Rostart = t.position; //同様の変更
|
190
|
+
}
|
191
|
+
//中略
|
192
|
+
}
|
193
|
+
}
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
bool OnMoveTouchDown()
|
198
|
+
{
|
199
|
+
if (0 < Input.touchCount)
|
200
|
+
{
|
201
|
+
for (int i = 0; i < Input.touchCount; i++)
|
202
|
+
{
|
203
|
+
Touch t = Input.GetTouch(i);
|
204
|
+
if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
|
205
|
+
{
|
206
|
+
PointerEventData pointer = new PointerEventData(EventSystem.current);
|
207
|
+
//pointer.position = Input.mousePosition; //★ご指摘の箇所★
|
208
|
+
pointer.position = t.position; //上記述から変更
|
209
|
+
List<RaycastResult> result = new List<RaycastResult>();
|
210
|
+
EventSystem.current.RaycastAll(pointer, result);
|
211
|
+
|
212
|
+
foreach (RaycastResult raycastResult in result)
|
213
|
+
{
|
214
|
+
if (raycastResult.gameObject.tag == "MoveController")
|
215
|
+
{
|
216
|
+
return true;
|
217
|
+
}
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
}
|
222
|
+
return false;
|
223
|
+
}
|
224
|
+
|
225
|
+
bool OnRotateTouchDown()
|
226
|
+
{
|
227
|
+
//OnMoveTouchDown()と同様の変更のため、略
|
228
|
+
}
|
229
|
+
}
|
230
|
+
```
|
231
|
+
### 追試スクリプト記述(2)
|
232
|
+
タッチ判定の条件付けに原因があると思え、別の方式を試行。
|
233
|
+
nullがちゃんと扱えず、エラー。
|
234
|
+
```C#
|
235
|
+
//前略
|
236
|
+
void Update()
|
237
|
+
{
|
238
|
+
//“Move~”にタッチしているか
|
239
|
+
Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
|
240
|
+
if (t != null)
|
241
|
+
{
|
242
|
+
if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
|
243
|
+
{
|
244
|
+
Movestart = t.position; //'position'同様
|
245
|
+
}
|
246
|
+
//中略
|
247
|
+
}
|
248
|
+
|
249
|
+
//“Rotate~”にタッチしているか
|
250
|
+
Touch? r = OnRotateTouchDown();
|
251
|
+
if (r != null)
|
252
|
+
{
|
253
|
+
if (r.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
|
254
|
+
{
|
255
|
+
Rostart = r.position; //'position'同様
|
256
|
+
}
|
257
|
+
//中略
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
Touch? OnMoveTouchDown()
|
262
|
+
{
|
263
|
+
if (0 < Input.touchCount)
|
264
|
+
{
|
265
|
+
for (int i = 0; i < Input.touchCount; i++)
|
266
|
+
{
|
267
|
+
Touch t = Input.GetTouch(i);
|
268
|
+
if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
|
269
|
+
{
|
270
|
+
PointerEventData pointer = new PointerEventData(EventSystem.current);
|
271
|
+
pointer.position = t.position;
|
272
|
+
List<RaycastResult> result = new List<RaycastResult>();
|
273
|
+
EventSystem.current.RaycastAll(pointer, result);
|
274
|
+
|
275
|
+
foreach (RaycastResult raycastResult in result)
|
276
|
+
{
|
277
|
+
if (raycastResult.gameObject.tag == "MoveController")
|
278
|
+
{
|
279
|
+
return t;
|
280
|
+
}
|
281
|
+
}
|
282
|
+
}
|
283
|
+
}
|
284
|
+
}
|
285
|
+
return null;
|
286
|
+
}
|
287
|
+
|
288
|
+
Touch? OnRotateTouchDown()
|
289
|
+
{
|
290
|
+
//上記OnMoveTouchDown()とほぼ同様のため、略
|
291
|
+
}
|
292
|
+
```
|
1
同一質問の二重投稿について説明。
title
CHANGED
File without changes
|
body
CHANGED
@@ -154,4 +154,6 @@
|
|
154
154
|
タッチBeganとEndedでONOFFするboolを管理すれば、「後発のタッチで先発の動作が停止」することはないだろうと試しました。動作の停止はなくなりましたが、結局は条件内でタッチが混同して、移動と回転がぶっ飛ぶことになりました。
|
155
155
|
今後もタッチによる他動作が加わる余地を考えると、タッチの判別ができる記述と知識が必要だろうと思い、質問を投稿した次第です。
|
156
156
|
### 追記
|
157
|
-
「根本的におめーの学習が足りてないだろ」というご指摘は避けられませんので、「ここを見ろ」「あれを読め」というだけのご回答でもありがたいです。
|
157
|
+
「根本的におめーの学習が足りてないだろ」というご指摘は避けられませんので、「ここを見ろ」「あれを読め」というだけのご回答でもありがたいです。
|
158
|
+
|
159
|
+
※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。
|