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

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

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

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

Q&A

解決済

2回答

1166閲覧

Unity 2D C# オブジェクトをタップした方向に時計の針のように回転させたい。

pokerCC131

総合スコア17

Unity

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

0グッド

0クリップ

投稿2017/06/27 07:29

・スティック状の画像
・空のオブジェクト

現状空のオブジェクトをスティック画像の左端に配置し
スティック画像の回転ができている状態です。

スティック画像をタッチ、スワイプされた方向に回転して向かせるためにはどうすればよいでしょうか。
よろしくお願いいたします。

C#

1public class RotateAround : MonoBehaviour { 2 3 // 回転の中心になるオブジェクト 4 public Transform target; 5 // 回転速度 6 public float speed = 10.0f; 7 8 void Update () 9 { 10 Vector3 axis = transform.TransformDirection (Vector3.back); 11 transform.RotateAround (target.position, axis, speed * Time.deltaTime); 12 } 13 14 15 16} 17

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

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

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

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

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

guest

回答2

0

補足ですが、ベクトルを算出したあとの挙動に関しては、ベクトル間の角度を求める Vector3.Angle() と 2つのベクトルに対して垂直なベクトルを求める Vector3.Cross() を用いると良いかもしれません。

以下は単純にタッチした方向に target を回転中心として speed(degree/s) でスティックの先端を向けるコードの例です。

csharp

1public class RotateAround : MonoBehaviour { 2 3 public Transform target; 4 public float speed = 10.0f; 5 6 float angle = 0.0f; 7 int clockWise = 1; 8 9 void Update() 10 { 11 // タッチしたとき 12 if (Input.GetMouseButtonDown(0)) 13 { 14 // タッチした座標を取得 15 Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0.0f, 0.0f, 10.0f)); 16 17 // ターゲットからタッチした座標への正規化ベクトルを取得 18 Vector3 toTouchPosition = Vector3.Scale(touchPosition - target.position, new Vector3(1.0f, 1.0f, 0.0f)).normalized; 19 20 // ターゲットからスティックへの正規化ベクトルを取得 21 Vector3 toStick = Vector3.Scale(transform.position - target.position, new Vector3(1.0f, 1.0f, 0.0f)).normalized; 22 23 // 回転角度を取得 24 angle = Vector3.Angle(toStick, toTouchPosition); 25 26 // 外積より、角度の正負を求める(回転軸が Vector3.back のとき、時計回り:正、反時計回り:負) 27 Vector3 cross = Vector3.Cross(toStick, toTouchPosition); 28 clockWise = cross.z > 0.0f ? -1 : 1; 29 } 30 31 // 回転角度が設定されているとき、回転処理を行う 32 if (angle > 0.0f) 33 { 34 float deltaAngle = speed * Time.deltaTime; 35 36 // 回転がはみ出さないように 37 deltaAngle = Mathf.Min(deltaAngle, angle); 38 39 // 回転処理 40 transform.RotateAround(target.position, Vector3.back, deltaAngle * clockWise); 41 42 // 回転した分だけ減らす 43 angle -= deltaAngle; 44 } 45 } 46}

投稿2017/06/28 15:50

編集2017/07/10 14:32
sushipachi

総合スコア23

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

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

pokerCC131

2017/07/14 09:29

確認遅くなりました。コードまで貼っていただきありがとうございます。 勉強になりました。
guest

0

ベストアンサー

・Drag&Drop処理を実装
・Drag開始時のマウス位置であるScreen座標を変数に取ります(Vector2のxとします)
・Drop時のマウス位置であるScreen座標を変数に取ります(Vector2のyとします)
・xとyのポイントからベクトルを算出させます。
・算出したベクトルの値に従って動かしたいObjectの挙動を決めます

これで行けると思います

投稿2017/06/27 18:52

seri

総合スコア422

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問