【Unity】値の範囲を制限するClamp関数の使い方

こじゃらこじゃら

キャラの移動範囲を制限する簡単なやり方はないの?

このはこのは

UnityのClamp関数を使えば良いわ!

Unityには、指定された範囲内に値を丸めるClamp関数が提供されています。

これを用いると、例えば次のようにキャラクターの移動範囲を制限することができます。

また、Clamp関数にはいくつかバリエーションが存在します。

本記事では、Clamp関数を用いて値の範囲を制限する方法とその活用例について紹介していきます。

UCL UCL

この作品はユニティちゃんライセンス条項の元に提供されています

動作環境
  • Unity 2022.1.0f1

スポンサーリンク

float型の値の範囲を制限する

Mathf.Clampメソッドを使います。

public static float Clamp(float value, float min, float max);

引数には、制限したい値範囲の下限範囲の上限の順に指定します。

戻り値は、valueをminとmaxの間に丸めた値です。

参考:Mathf-Clamp – Unity スクリプトリファレンス

使用例

オブジェクトのx軸方向の移動範囲を制限する例です。

ClampSide.cs
using UnityEngine;

public class ClampSide : MonoBehaviour
{
    // x軸方向の移動範囲の最小値
    [SerializeField] private float _minX = -1;

    // x軸方向の移動範囲の最大値
    [SerializeField] private float _maxX = 1;

    private void Update()
    {
        var pos = transform.position;

        // x軸方向の移動範囲制限
        pos.x = Mathf.Clamp(pos.x, _minX, _maxX);

        transform.position = pos;
    }
}

このスクリプトをClampSide.csという名前でUnityプロジェクトに保存し、移動範囲を制限したいオブジェクトにアタッチすると機能するようになります。

実行結果

キャラクターのx軸方向(横方向)の移動範囲が制限されていることを確認できました。

移動範囲が分かるように色付けしています。

float型の値を0~1の範囲に制限する

制限したい値の下限が0、上限が1と決まっている場合は、Mathf.Clamp01メソッドを使うと楽です。0~1に正規化された値を扱いたい場合などに重宝するでしょう。

public static float Clamp01(float value);

引数には、0~1の範囲に丸めたい値を指定します。

戻り値は、0~1の範囲に丸められた値です。

参考:Mathf-Clamp01 – Unity スクリプトリファレンス

このはこのは

0から1の間の値を使いたいケースはよくあるので、活躍できる場面も少なくないかもしれないわ。

ベクトルの長さを制限する

Vector2型Vector3型のベクトルを指定された長さ以下に収めるClampMagnitudeメソッドも存在します。

Vector2

public static Vector2 ClampMagnitude(Vector2 vector, float maxLength);

Vector3

public static Vector3 ClampMagnitude(Vector3 vector, float maxLength);

第1引数には、範囲に収めたいベクトル第2引数にはベクトル長の上限を指定します。

戻り値は、第2引数の長さに丸められたベクトルです。

参考:Vector2-ClampMagnitude – Unity スクリプトリファレンス

参考:Vector3-ClampMagnitude – Unity スクリプトリファレンス

使用例

原点から指定された距離以上にならないように移動範囲を制限するスクリプトです。

ClampCircle.cs
using UnityEngine;

public class ClampCircle : MonoBehaviour
{
    // 移動範囲の最大半径
    [SerializeField] private float _maxRadius = 1;

    private void Update()
    {
        var pos = transform.position;

        // 指定された半径の円内に位置を丸める
        var clampedPos = Vector2.ClampMagnitude(pos, _maxRadius);

        transform.position = new Vector3(clampedPos.x, clampedPos.y, pos.z);
    }
}

このスクリプトをClampCircle.csという名前でUnityプロジェクトに保存し、移動範囲を制限したいオブジェクトにアタッチすると機能します。

実行結果

円形の領域からキャラクターが出ないようになりました。

Vector2.ClampMagnitudeメソッド円の内部に、Vector3.ClampMagnitudeメソッド球の内部にベクトルを閉じ込めるような振る舞いをします。

さいごに

Clamp関数を用いて値の範囲を制限する方法を紹介しました。

この辺の計算は自前で実装してもそれほど複雑にはなりませんが、Clampを使うとコード周りがすっきりとします。

ぜひ活用してみてください。

参考サイト

スポンサーリンク