【Unity】Mathf.Clampとは?特定の範囲内に値を制限する処理を行うメソッド

値を制限するMathf.Clampとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Mathf.Clampってどういうメソッド?」

「Mathf.Clampの使い方が知りたい!」

というお悩みの方に向けた内容となっています。

Unityでは、Mathf構造体で定義されているClampメソッドというものをよく使います。

このClampメソッドとは、数値の範囲を制限することができるメソッドで、最大値最小値を決めてその中で数値を返す処理を行います。

例えば、オブジェクトを回転させる際の回転角度の制限を決めたり、移動させる際の範囲の制限を決めたりすることができます。

そこで、このページでは、Unityで使えるClampメソッドについて、どんなメソッドなのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Mathf.Clampとは?

まずは、Clampメソッドがどういうものなのかを紹介していきます。

特定の範囲内に制限した値を返すメソッド

Clampメソッドとは、冒頭でも解説した通り、特定の範囲内で制限した数値をfloat型で返すという処理を行うメソッドです。

もう少し具体的に説明すると、Clampメソッドは処理を行う数値(変数)と、最大値・最小値をそれぞれ設定することで、その範囲の中で数値を返す処理を行います。

Clampメソッドで処理を行う数値が、

  • 最大値を上回っている場合 ⇒ 「最大値」が返ってくる
  • 最小値を下回っている場合 ⇒ 「最小値」が返ってくる
  • 最小値と最大値の間の場合 ⇒ 「処理を行う数値」がそのまま返ってくる

という処理が行われます。

例えば、カメラの角度をキー操作で回転できるようにした場合、Clampメソッドを使えば、角度の制限をかけることができ、どこまで回転させるかを指定することができます。

0と1の間に制限する場合はMathf.Clamp01が便利

Clampメソッドと同じように制限する処理として、Clamp01というメソッドがあります。

このClamp01は、最小値を0、最大値を1とした範囲で制限を行ってくれるメソッドで、指定した数値が、

  • 1よりも大きい場合 ⇒ 「1」が返ってくる
  • 0よりも小さい場合 ⇒ 「0」が返ってくる
  • 0~1の値の場合 ⇒ 「指定した値」がそのまま返ってくる

という処理が行われます。

0~1の範囲内で数値を返すことができるので、例えばステータスの割合による処理を行いたい場合などで活用することができます。

また、Clampメソッドのように、最大値と最小値を設定する必要が無いため、0と1の間に抑えたい場合はClamp01を使う方が便利です。

Mathf.Clampの使い方

ここからは、Clampメソッドの使い方を紹介していきます。

Mathf.Clampの記述方法

Clampメソッドを使う場合は、以下のように記述していきます。

Mathf.Clamp(value, min, max)

value:範囲を制限したい値(float型)
min:制限する範囲の最小値(float型)
max:制限する範囲の最大値(float型)

実際に、以下のスクリプトを作ってコンソールウィンドウに表示させてみると、

using UnityEngine;

public class Test : MonoBehaviour
{
    float value1 = 5;
    float value2 = 15;
    float value3 = 25;

    float min = 10; // 最小値
    float max = 20; // 最大値
    void Start()
    {
        // それぞれの値をClampで処理して表示
        Debug.Log(value1 + " ⇒ " + Mathf.Clamp(value1, min, max));
        Debug.Log(value2 + " ⇒ " + Mathf.Clamp(value2, min, max));
        Debug.Log(value3 + " ⇒ " + Mathf.Clamp(value3, min, max));
    }
}

範囲を上回る場合は最大値、下回る場合は最小値、範囲内の場合はそのままの値が返っているのが分かります。

また、Clamp01メソッドを使う場合は、以下のように記述します。

Mathf.Clamp01(value)

value:範囲を制限したい値(float型)

こちらも実際に試してみると、

using UnityEngine;

public class Test : MonoBehaviour
{
    float value1 = -0.3f;
    float value2 = 0.3f;
    float value3 = 1.2f;

    void Start()
    {
        // それぞれの値をClampで処理して表示
        Debug.Log(value1 + " ⇒ " + Mathf.Clamp01(value1));
        Debug.Log(value2 + " ⇒ " + Mathf.Clamp01(value2));
        Debug.Log(value3 + " ⇒ " + Mathf.Clamp01(value3));
    }
}

0から1の間で制限がかかっているのが分かります。

カメラの回転角度に制限をかける処理

ここでは、実際にカメラの回転処理に、Mathf.Clampメソッドを使って制限を作ってみます。

まずは、Clampを使わずに、キー操作でカメラを回転させる処理を作っていきます。

以下のスクリプトをカメラオブジェクトにアタッチしておきます。

using UnityEngine;

public class Test2 : MonoBehaviour
{
    float angleX;
    float angleY;
    float angleZ;
    float rotationAngle = 0;    // Y軸における回転角度の変数

    void Start()
    {
        // スタート時点でのそれぞれの角度を取得しておく
        angleX = transform.rotation.eulerAngles.x;
        angleY = transform.rotation.eulerAngles.y;
        angleZ = transform.rotation.eulerAngles.z;
    }
    void Update()
    {
        // キー操作による回転量の計算
        if (Input.GetKey(KeyCode.A))
        {
            rotationAngle -= 0.1f;
        }
        else if (Input.GetKey(KeyCode.D))
        {
            rotationAngle += 0.1f;
        }
        transform.rotation = Quaternion.Euler(angleX, angleY + rotationAngle, angleZ);  // カメラを回転させる処理
    }
}

まず、Startメソッドの13行目から15行目でeulerAnglesを使って、スタート時点でのそれぞれの軸におけるカメラの角度を取得しています。

20行目から27行目でAキーとDキーを押した場合に、カメラを回転させる角度が0.1ずつ変化するように変数で計算を行っています。

そして、28行目でEulerメソッドを使って、Y軸に計算した回転角度を加算することで、カメラを回転させる処理を行っています。

この時点でゲームを実行してみると、

上記のように、AキーとDキーを押すとカメラが回転するようになりましたが、制限をかけていないので、360度回転してしまっているのが分かります。

次に、先ほどのスクリプトにClampメソッドの処理を加えていきます。

using UnityEngine;

public class Test2 : MonoBehaviour
{
    float angleX;
    float angleY;
    float angleZ;
    float rotationAngle = 0;    // Y軸における回転角度の変数

    void Start()
    {
        // スタート時点でのそれぞれの角度を取得しておく
        angleX = transform.rotation.eulerAngles.x;
        angleY = transform.rotation.eulerAngles.y;
        angleZ = transform.rotation.eulerAngles.z;
    }
    void Update()
    {
        // キー操作による回転量の計算
        if (Input.GetKey(KeyCode.A))
        {
            rotationAngle -= 0.1f;
        }
        else if (Input.GetKey(KeyCode.D))
        {
            rotationAngle += 0.1f;
        }

        rotationAngle = Mathf.Clamp(rotationAngle, -45f, 45f);  // 角度の制限処理

        transform.rotation = Quaternion.Euler(angleX, angleY + rotationAngle, angleZ);  // カメラを回転させる処理
    }
}

29行目で、回転させる角度の変数に対して、Mathf.Clampメソッドで制限をかけています。

制限の範囲は、最小値を-45、最大値を45としているので、左右45度までしか回転できないようにしています。

これで再度実行してみると、

左右どちらも45度まで回転したら、それ以上は回転できないようになり、制限をかけることができました。

まとめ

このページでは、Unityで使えるMathf.Clampメソッドについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

Clampは、値の範囲を制限する処理を行うメソッドで、最小値と最大値の間で数値を返してくれるメソッドです。

Clampメソッドで処理を行う数値が、指定した範囲外の場合、最小値を下回る際は最小値、最大値を上回る際は最大値が返ってくることになります。

また、最小値を0、最大値を1としたClamp01メソッドは、割合などの処理を行う際に活用できます。

最後までお読みいただきまして、ありがとうございました!

コメント