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

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

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

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

Q&A

0回答

1065閲覧

回転に連動させてオブジェクトを移動させる方法が知りたい

shimazu

総合スコア38

Unity

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

0グッド

0クリップ

投稿2021/09/21 07:02

【やりたいこと】
針を回転させたときに、連動してオブジェクトを動かしたい。
イメージは、時計の針を動かして、時間が進んでいく感じ。逆回転すると時間が戻っていく感じをやりたい
(特定の位置から回転させた時の、回転量がわかるとできる)

下の画像でいうと、針を
・時計回りにしたときに黄色のオブジェクトが右に動く
・反時計回りにしたときに黄色のオブジェクトが左に動く
ようにしたい。

【現状】
針をDragで動かすことはできた。
特定のオブジェクトに連動させることができない。

【なぜできないのか?】
Unityの仕様で、角度系のツールは0〜360, -180〜180に収まるようになっている。
特定の位置からの回転量を出そうとしても、360度回転するとまた0に戻ってしまって困る。

【参考にしたサイト】
針の回転:http://kerotan-factory.xblog.jp/article/474532919.html

【環境】
Unity2020.3.17f

イメージ説明

csharp

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Handle : MonoBehaviour 6{ 7 [SerializeField] GameObject obj; // こいつを移動させたい 8 9 Vector2 pos; // 最初にクリックしたときの位置 10 Quaternion rotation; // 最初にクリックしたときのBoxの角度 11 12 Vector2 vecA; // Boxの中心からposへのベクトル 13 Vector2 vecB; // Boxの中心から現在のマウス位置へのベクトル 14 15 [SerializeField] float angle; // vecAとvecBが成す角度 16 Vector3 AxB; // vecAとvecBの外積 17 18 bool Drag;//ドラッグ中のフラグ 19 20 21 public void SetPos() 22 { 23 24 if (Input.GetKeyDown(KeyCode.Mouse0)) 25 { 26 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // マウス位置をワールド座標で取得 27 rotation = this.transform.rotation; // ターゲットの現在の角度を取得 28 Drag = true; 29 } 30 } 31 32 // ハンドルをドラッグしている間に呼び出す 33 public void Rotate() 34 { 35 36 if (Input.GetKeyUp(KeyCode.Mouse0)) 37 { 38 Drag = false; 39 return; 40 } 41 42 // ここから針の回転 43 Vector2 pre = transform.position; 44 45 vecA = pos - (Vector2)this.transform.position; //ある地点からのベクトルを求めるときはこう書くんだった 46 vecB = Camera.main.ScreenToWorldPoint(Input.mousePosition) - this.transform.position; // 上に同じく 47 48 angle = Vector2.Angle(vecA, vecB); // vecAとvecBが成す角度を求める 49 AxB = Vector3.Cross(vecA, vecB); // vecAとvecBの外積を求める 50 51 // 外積の z 成分の正負で回転方向を決める 52 //ここを時計まわりと、反時計回りと思っていました。 => 違った 53 if (AxB.z > 0) 54 { 55 this.transform.localRotation = rotation * Quaternion.Euler(0, 0, angle); // 初期値との掛け算で相対的に回転させる 56 } 57 else 58 { 59 this.transform.localRotation = rotation * Quaternion.Euler(0, 0, -angle); // 初期値との掛け算で相対的に回転させる 60 } 61 62 63 64 float xx = 0; // この値を針の回転と連動させたい; 65 obj.transform.position = new Vector3(xx, -1, 0); 66 } 67 68 void Update() 69 { 70 if (Drag) 71 { 72 Rotate(); 73 } 74 else 75 { 76 SetPos(); 77 } 78 } 79} 80

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問