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

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

ただいまの
回答率

88.92%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 245
退会済みユーザー

退会済みユーザー

実現したい事

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);
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2020/07/14 09:26

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

  2. 角度の判定に負の値を使用している
    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 13:51

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

    キャンセル

  • 2020/07/18 07:47

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

    キャンセル

  • 2020/07/19 05:45

    参考になりました!

    キャンセル

+1

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

using UnityEngine;

public class Rotation : MonoBehaviour
{
    [SerializeField] Transform m_pivot;
    [SerializeField] float m_rotateAngle = 1f;
    [SerializeField] float m_targetAngle = 90f;
    float m_currentAngle = 0;
    int m_spinDirection = 1;

    void Update()
    {
        Turn();
    }

    void Turn()
    {
        if (m_spinDirection * m_targetAngle > m_spinDirection * m_currentAngle)
        {
            m_currentAngle += m_spinDirection * m_rotateAngle;
            transform.RotateAround(m_pivot.position, Vector3.back, m_spinDirection * m_rotateAngle);
        }
        else
        {
            m_spinDirection *= -1;
            m_targetAngle *= -1;
        }
    }
}

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

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

using UnityEngine;
using DG.Tweening;

public class HalfCirclePingPong : MonoBehaviour
{
    [SerializeField] float m_sec = 1f;
    Sequence m_seq;

    void Start()
    {
        m_seq = DOTween.Sequence();
        BuildSequence();
        //BuildSequence2();   // 本当はこっちでシンプルに済ませたい
        m_seq.Play();
    }

    void BuildSequence()
    {
        m_seq.Append(transform.DORotate(90 * Vector3.back, m_sec).SetEase(Ease.Linear));
        m_seq.Append(transform.DORotate(Vector3.zero, m_sec).SetEase(Ease.Linear));
        m_seq.Append(transform.DORotate(90 * Vector3.forward, m_sec).SetEase(Ease.Linear));
        m_seq.Append(transform.DORotate(Vector3.zero, m_sec).SetEase(Ease.Linear));
        m_seq.SetLoops(-1);
    }

    void BuildSequence2()
    {
        transform.Rotate(Vector3.forward, 90f);
        m_seq.Append(transform.DORotate(90 * Vector3.back, m_sec).SetEase(Ease.Linear));
        m_seq.SetLoops(-1, LoopType.Yoyo);
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 11:28 編集

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

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る