質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

989閲覧

【Unity3D】 フリックしてオブジェクトを90度回転させたい

Taku.

総合スコア16

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/08/11 11:34

やりたいこと

フリックして3Dのオブジェクトをフリック方向に合わせて90度回転させたいです。

課題

フリックしてオブジェクトが反転したときに動作が逆になってしまいます。
下にフリックしてオブジェクトが下を向いたときに、右にフリックすると右方向ではなく左方向を向いてしまったり、それらが重なると下にフリックしたのに右に回転したりしてしまいます。

現状のコード

C#

1using UnityEngine; 2using DG.Tweening; 3 4public class CubeMover : MonoBehaviour 5{ 6 GameObject Cube; 7 Vector2 _direction; 8 Vector3 _rotation; 9 string Direction; 10 bool _canmove = true; 11 bool _ismove = false; 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 Cube = GameObject.FindGameObjectWithTag("Cube"); 17 } 18 19 void Update() 20 { 21 if (Input.touchCount > 0) 22 { 23 Touch touch = Input.GetTouch(0); 24 25 if (Input.GetTouch(0).phase == TouchPhase.Began) 26 { 27 _direction = Vector2.zero; 28 _rotation = Cube.transform.localEulerAngles; 29 30 if(!_ismove){ 31 _canmove = true; 32 } 33 } 34 35 if (Input.GetTouch(0).phase == TouchPhase.Moved) 36 { 37 _direction = touch.deltaPosition; 38 if (_direction.magnitude < 30.0f){ 39 return; 40 }else{ 41 float x = _direction.x; 42 float y = _direction.y; 43 44 float abs_x = Mathf.Abs(_direction.x); 45 float abs_y = Mathf.Abs(_direction.y); 46 47 if(abs_x > abs_y) 48 { 49 if(x > 0) 50 { 51 Direction = "right"; 52 } 53 else 54 { 55 Direction = "left"; 56 } 57 } 58 else 59 { 60 if(y > 0) 61 { 62 Direction = "up"; 63 } 64 else 65 { 66 Direction = "down"; 67 } 68 } 69 70 if(_canmove) 71 { 72 _canmove = false; 73 _ismove = true; 74 Move(); 75 } 76 } 77 } 78 if (Input.GetTouch(0).phase == TouchPhase.Ended) 79 { 80 _direction = Vector2.zero; 81 } 82 } 83 } 84 85 void Move() 86 { 87 float duration = 0.2f; 88 Vector3 _left = new Vector3(0,0,90); 89 Vector3 _right = new Vector3(0,0,-90); 90 Vector3 _up = new Vector3(90,0,0); 91 Vector3 _down = new Vector3(-90,0,0); 92 93 switch (Direction){ 94 case "up": 95 Cube.transform.DORotate(_rotation + _up , duration) 96 .OnComplete(() => { 97 _ismove = false; 98 }); 99 break; 100 101 case "down": 102 Cube.transform.DORotate(_rotation + _down , duration) 103 .OnComplete(() => { 104 _ismove = false; 105 }); 106 break; 107 108 case "right": 109 Cube.transform.DORotate(_rotation + _right , duration) 110 .OnComplete(() => { 111 _ismove = false; 112 }); 113 break; 114 115 case "left": 116 Cube.transform.DORotate(_rotation + _left , duration) 117 .OnComplete(() => { 118 _ismove = false; 119 }); 120 break; 121 } 122 } 123 124} 125

ご教授頂ければ幸いです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

カメラの視点が常に一定なのでしたら、キューブの回転をワールド空間を基準に決定してみてはいかがでしょうか?
たとえば下記のようにしてみてはいかがでしょう。すみませんがDOTweenは使用経験が浅く、効果的な方法を見落としているかもしれませんので参考程度でお願いします。
こうしたらもっといいんじゃないか...といった点がありましたら、ぜひ改造を加えてしまってください。

C#

1using UnityEngine; 2using DG.Tweening; 3 4public class CubeMover : MonoBehaviour 5{ 6 GameObject Cube; 7 Vector2 _direction; 8 Quaternion _rotation; // Vector3をQuaternionに変更 9 string Direction; 10 bool _canmove = true; 11 bool _ismove = false; 12 13 void Start() 14 { 15 Cube = GameObject.FindGameObjectWithTag("Cube"); 16 } 17 18 void Update() 19 { 20 if (Input.touchCount > 0) 21 { 22 Touch touch = Input.GetTouch(0); 23 24 if (touch.phase == TouchPhase.Began) 25 { 26 _direction = Vector2.zero; 27 _rotation = Cube.transform.rotation; // ワールド空間における姿勢を覚えておく 28 29 if(!_ismove){ 30 _canmove = true; 31 } 32 } 33 34 if (touch.phase == TouchPhase.Moved) 35 { 36 _direction = touch.deltaPosition; 37 if (_direction.magnitude < 30.0f){ 38 return; 39 } 40 else 41 { 42 float x = _direction.x; 43 float y = _direction.y; 44 45 float abs_x = Mathf.Abs(_direction.x); 46 float abs_y = Mathf.Abs(_direction.y); 47 48 if(abs_x > abs_y) 49 { 50 if(x > 0) 51 { 52 Direction = "right"; 53 } 54 else 55 { 56 Direction = "left"; 57 } 58 } 59 else 60 { 61 if(y > 0) 62 { 63 Direction = "up"; 64 } 65 else 66 { 67 Direction = "down"; 68 } 69 } 70 71 if(_canmove) 72 { 73 _canmove = false; 74 _ismove = true; 75 Move(); 76 } 77 } 78 } 79 80 if (touch.phase == TouchPhase.Ended) 81 { 82 _direction = Vector2.zero; 83 } 84 } 85 } 86 87 void Move() 88 { 89 float duration = 0.2f; 90 Vector3 _left = new Vector3(0, 0, 90); 91 Vector3 _right = new Vector3(0, 0, -90); 92 Vector3 _up = new Vector3(90, 0, 0); 93 Vector3 _down = new Vector3(-90, 0, 0); 94 95 // 現在の姿勢に対して90°回転をワールド空間基準で合成し、DORotateQuaternionで回す 96 switch (Direction){ 97 case "up": 98 Cube.transform.DORotateQuaternion(Quaternion.Euler(_up) * _rotation, duration) 99 .OnComplete(() => { 100 _ismove = false; 101 }); 102 break; 103 104 case "down": 105 Cube.transform.DORotateQuaternion(Quaternion.Euler(_down) * _rotation, duration) 106 .OnComplete(() => { 107 _ismove = false; 108 }); 109 break; 110 111 case "right": 112 Cube.transform.DORotateQuaternion(Quaternion.Euler(_right) * _rotation, duration) 113 .OnComplete(() => { 114 _ismove = false; 115 }); 116 break; 117 118 case "left": 119 Cube.transform.DORotateQuaternion(Quaternion.Euler(_left) * _rotation, duration) 120 .OnComplete(() => { 121 _ismove = false; 122 }); 123 break; 124 } 125 } 126}

投稿2019/08/11 23:50

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taku.

2019/08/12 03:38

思った通りに機能させることができました! Quaternion.AngleAxisを使って試して駄目だったのですが、Quaternion.Eulerを用いるのがこの場合正しい方法なのですね! 大変助かりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問