Unityでタッチした方向に90度ずつ回転させたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
西田

Unityでタッチした方向に90度ずつ回転させたい

#1

投稿記事 by 西田 » 3年前

Unityを使って回転の勉強をしております。
スケール値が、X,Y,Z・・・1,1,30のような橋のオブジェクトをZ軸を軸として回転させたいです。
橋が回転していない場合、タッチでどっちに回転するかを決定して90度ずつ止まるように回転させていのですがうまく実装できませんでした。

近い処理になっているのですが、何回か回転させると回転しなくなったり、数回転してしまったりします。
クオータニオンの制御がうまくできていないのが原因なのですが、アドバイスなど頂くことは難しいでしょうか。

コード:

 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ground : MonoBehaviour {
    // 判定をとる差分の範囲
    const float DIFF_X = 5.0f;

    // タッチした座標
    Vector2 mousePos = Vector2.zero;

    bool rotStart = false;
    float speed = 0.5f;
    float rotAngle = 90f;
    float variation;
    float rot = 0.0f;
    float rotTarget = 0.0f;

    // Start is called before the first frame update
    void Start() {        
        variation = rotAngle / speed;
    }

    // Update is called once per frame
    void Update() {
        if (Input.GetMouseButtonDown(0)) {
            mousePos = Input.mousePosition; 
            //Debug.Log(Input.mousePosition.x);
        }

        if (Input.GetMouseButtonUp(0)) {
            Vector2 pos = Input.mousePosition;

            float diff = pos.x - mousePos.x;

            // 差分の絶対値から処理をするかを判定
            if(Mathf.Abs(diff) >= DIFF_X && !rotStart){
                
                rotStart = true;

                    //rotAngle = 90f;
                if(diff < 0){    
                    rotAngle = -90f;
                } else {
                    rotAngle = 90f;
                }
                
                rotTarget = transform.localEulerAngles.z + rotAngle;
                variation = rotAngle / speed;

            }
            Debug.Log("rotTarget " + rotTarget + " " + transform.localEulerAngles.z);
            mousePos = Vector2.zero;
        }

        if (rotStart) {
            transform.Rotate (0, 0, variation * Time.deltaTime);
            rot += variation * Time.deltaTime;
            //Debug.Log("rot " + rot);
            if(rotAngle > 0){
                if (rot >= rotTarget) {
                    rotStart = false;
                    transform.localRotation = Quaternion.Euler (0, 0, rotTarget);
                }
            } else {
                if (rot <= rotTarget) {
                    rotStart = false;
                    transform.localRotation = Quaternion.Euler (0, 0, rotTarget);
                }
            }
                //transform.localRotation = Quaternion.Euler (0, 0, 0);
            //}
        }
       
            /*
        if(rotationFlag) {
            transform.Rotate (0, 0, variation * Time.deltaTime);
            rot += variation * Time.deltaTime;
            if (rot >= rotAngle) {
                rotStart = false;
                handle.transform.localRotation = Quaternion.Euler (0, 0, 180);
            }
                 
            // x軸を軸にして毎秒2度、回転させるQuaternionを作成(変数をrotとする)
            Quaternion rot = Quaternion.AngleAxis(2, Vector3.forward);
            // 現在の自信の回転の情報を取得する。
            Quaternion q = this.transform.rotation;
            // 合成して、自身に設定
            this.transform.rotation = q * rot;

            transform.localRotation.z
        }
            */
            
    }
}


“C言語何でも質問掲示板” へ戻る