【Unity】マウスを円形に動かして値を増減させる

投稿者: | 2020-05-28

マウスカーソルを円形にくるくる動かして値を増減させてみます。

空のゲームオブジェクトにスクリプトを付けます。

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

public class WheelTestScript : MonoBehaviour
{
    [SerializeField] Text text;

    Vector2 mPos;
    Vector3 screenSizeHalf;
    float rad;
    float previousRad;
    float tan = 0f;

    // Start is called before the first frame update
    void Start()
    {
        // 画面の縦横の半分 
        screenSizeHalf.x = Screen.width / 2f;
        screenSizeHalf.y = Screen.height / 2f;
        screenSizeHalf.z = 0f;

        // マウスの初期位置
        mPos = Input.mousePosition - screenSizeHalf;
        previousRad = Mathf.Atan2(mPos.x, mPos.y);
    }

    // Update is called once per frame
    void Update()
    {
        // 真ん中が(0,0,0)になるようにマウスの位置を取得
        mPos = Input.mousePosition - screenSizeHalf;

        float rad = Mathf.Atan2(mPos.x, mPos.y); // 上向きとマウス位置のなす角
        float dRad = rad - previousRad; // 前のフレームの角度との差

        tan += Mathf.Tan(dRad); //タンジェント // * mPos.magnitude;
        text.text = tan + "";

        previousRad = rad; // 今のフレームの角度を保存
    }
}

Input.mousePositionで画面上のマウスカーソルの座標を取得すると、左下が(0,0,0)になるので、画面の縦横の幅の半分の値を引いて、画面の真ん中が(0,0,0)になるようにします。

// 画面の縦横の半分 
screenSizeHalf.x = Screen.width / 2f;
screenSizeHalf.y = Screen.height / 2f;
screenSizeHalf.z = 0f;

mPos = Input.mousePosition - screenSizeHalf;

そのxとyの値をMathf.Atan2に入れて、上方向と中心からカーソルへのベクトルのなす角を求めます。

float rad = Mathf.Atan2(mPos.x, mPos.y);

これをUpdate()の最後に別の変数に保存しておくことで、前のフレームで求めた角度との差を計算できます。一番はじめのフレームでは、Start()で求めた角度を前のフレームの値として使っています。

float dRad = rad - previousRad;

// ---
previousRad = rad;

すると、今のフレームのマウスカーソルが前のフレームと比べて時計回りに回っていたらプラスの角度、反時計回りならマイナスの角度になります。

さらにその角度のタンジェントの値を求めて積み重ねていけば、時計回りにくるくる回すと増加して、反時計回りだと減少していく値が得られました。

tan += Mathf.Tan(dRad);

タンジェントにせずに角度のまま使うと、値が積み重なっていきません。

r += dRad;
text.text = r + "";

これは、Atan2で求める角度θが、-180度 < θ <= 180度 の範囲に制限されているからだと思います。

今と前のカーソル位置がこの段差によって別れたときは、角度の差の絶対値が大きな値になります。

今の角度が -3 で前の角度が 3 のとき、今と前の差は -6 になります。これは、θ1ではなく、θ1 – 360度です。

今の角度をθ2、前の角度をθ3とすると、普段は θ1 = θ2 – θ3 と計算できます。

しかし、上のように今のカーソル位置だけが段差をまたぐと、θ2が -(360度 – θ2)に変わります。ここからθ3を引くと θ2 – θ3 – 360度 となって、絶対値の大きいマイナスの値になってしまい、増加していた値が一気に小さい値に戻ります。

しかしタンジェントθの値はθに360度の整数倍を足しても変わらないので、tan(θ2 – θ3 – 360度) = tan(θ2 – θ3)となって普段どおりの値が出ます。

なので、タンジェントにすると値が増加/減少し続ける値が得られるのではないかと思います。

コメントを残す

メールアドレスが公開されることはありません。