スケール値が、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
}
*/
}
}