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

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

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

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

Q&A

解決済

2回答

2037閲覧

オブジェクトを中心に180度回したい

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2020/07/13 18:50

実現したい事

2Dゲームで矢印マークをオブジェクト中心に回して90度になったら反対に−90度になったら反対方向に回したい
イメージ説明
緑・・・動き
赤・・・中心
青・・・限界角度

現状

ずっと右回転して反対にならない

該当コード

public float angle; //回転の中心左表 private GameObject target; bool right; void Start() { target = GameObject.Find("Player"); right = true; } void Update() { float z = transform.localEulerAngles.z; if (right == true) { Vector3 targetPos = target.transform.position; transform.RotateAround(targetPos, Vector3.back, angle * Time.deltaTime); } else if (right == false) { Vector3 targetPos = target.transform.position; transform.RotateAround(targetPos, Vector3.forward, angle * Time.deltaTime); } else if(z >= -90) { right = true; } else if (z <= 270) { right = false; } Debug.Log(z); }

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

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

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

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

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

sakura_hana

2020/07/14 00:26

「right == false」の方、「angle * Time.deltaTime」に「-1.0f」を掛け算してみてください。 また限界角度の設定が怪しい気がしますが、やりたいことがよくわからないので適宜確認してください。
guest

回答2

0

RotateAround は obsolete だそうだけど、代わりに使うように指定されている Transform.Rotate で簡単に RotateAround と同じことができそうにないためそのまま RotateAround でやってみました。

csharp

1using UnityEngine; 2 3public class Rotation : MonoBehaviour 4{ 5 [SerializeField] Transform m_pivot; 6 [SerializeField] float m_rotateAngle = 1f; 7 [SerializeField] float m_targetAngle = 90f; 8 float m_currentAngle = 0; 9 int m_spinDirection = 1; 10 11 void Update() 12 { 13 Turn(); 14 } 15 16 void Turn() 17 { 18 if (m_spinDirection * m_targetAngle > m_spinDirection * m_currentAngle) 19 { 20 m_currentAngle += m_spinDirection * m_rotateAngle; 21 transform.RotateAround(m_pivot.position, Vector3.back, m_spinDirection * m_rotateAngle); 22 } 23 else 24 { 25 m_spinDirection *= -1; 26 m_targetAngle *= -1; 27 } 28 } 29} 30

(※)以下のコードは最初に示したものですが、回転の中心が自分自身であるため、質問の主旨(中心は別オブジェクト)とは違うものでした。

Unity本来の機能であるアニメーションで簡単に済ませたいけど、説明が大変なのでその次に楽そうなDoTweenを使ったやり方のコードを貼っておきます。

csharp

1using UnityEngine; 2using DG.Tweening; 3 4public class HalfCirclePingPong : MonoBehaviour 5{ 6 [SerializeField] float m_sec = 1f; 7 Sequence m_seq; 8 9 void Start() 10 { 11 m_seq = DOTween.Sequence(); 12 BuildSequence(); 13 //BuildSequence2(); // 本当はこっちでシンプルに済ませたい 14 m_seq.Play(); 15 } 16 17 void BuildSequence() 18 { 19 m_seq.Append(transform.DORotate(90 * Vector3.back, m_sec).SetEase(Ease.Linear)); 20 m_seq.Append(transform.DORotate(Vector3.zero, m_sec).SetEase(Ease.Linear)); 21 m_seq.Append(transform.DORotate(90 * Vector3.forward, m_sec).SetEase(Ease.Linear)); 22 m_seq.Append(transform.DORotate(Vector3.zero, m_sec).SetEase(Ease.Linear)); 23 m_seq.SetLoops(-1); 24 } 25 26 void BuildSequence2() 27 { 28 transform.Rotate(Vector3.forward, 90f); 29 m_seq.Append(transform.DORotate(90 * Vector3.back, m_sec).SetEase(Ease.Linear)); 30 m_seq.SetLoops(-1, LoopType.Yoyo); 31 } 32}

投稿2020/07/14 02:20

編集2020/07/14 03:19
bboydaisuke

総合スコア5308

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

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

bboydaisuke

2020/07/14 03:15 編集

自分が中心じゃなくて、中心は別オブジェクトとのことであり先に示したコードは使えないため直しました。
guest

0

ベストアンサー

現状のコードに複数点問題があります

  1. rightがtrueになった後falseにならない

角度チェックを行ってright変数にfalseを入れている箇所が、if (right == true) に対応する else if 内で行っている為現状絶対にrightがfalseになることはありません

  1. 角度の判定に負の値を使用している

UnityのEulerAngles系で角度を取得すると0~360と正の数値で帰ってくるため-90になることがありません。
180度を超えている場合負の値に変換する処理を加える必要があります

上記を踏まえてコードを修正すると下記のようになります(これは一例です)

public float angle; public GameObject target; bool right; void Start() { right = true; } void Update() { float z = transform.localEulerAngles.z; // 180度を越えていた場合 -180~0 に変換 z = (z > 180) ? z - 360 : z; // 右回転処理 if (right == true) { Vector3 targetPos = target.transform.position; transform.RotateAround(targetPos, Vector3.back, angle * Time.deltaTime); // -90度を下回っていれば左回転開始 if (z <= -90) { right = false; } } // 左回転処理 else if (right == false) { Vector3 targetPos = target.transform.position; transform.RotateAround(targetPos, Vector3.forward, angle * Time.deltaTime); // 90度を越えていたら右回転開始 if (z >= 90) { right = true; } } Debug.Log(z); }

投稿2020/07/14 02:15

MMashiro

総合スコア2380

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

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

退会済みユーザー

退会済みユーザー

2020/07/14 04:51

思っている通りに動きました! ありがとうございます z = (z > 180) ? z - 360 : z; ?をよく見るんですが?を使わずにifとかで代用するのは難しいんでしょうか それとも?を使った方がいいのか教えていただけると嬉しいです
MMashiro

2020/07/17 22:47

そちらの ? は三項演算子、条件演算子と言い、使用するかどうかは意見が分かれるところです。 条件演算子で処理できる内容はif文で代用可能なので個人でプログラミングをする範囲内であれば使用してもしなくても良いと思います。(私は短くかけるので使用しています) ただ業務でプログラミングを行う場合はまず現場でのルールを確認することをお勧めいたします
退会済みユーザー

退会済みユーザー

2020/07/18 20:45

参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問