(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



intやfloat、Vectorの値が一定の範囲内に収まっているかの判定【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2018.4.19f1


はじめに

UnityにはMathfという数学関係の関数や変数を持ったクラスがあります。



その中にClampやClamp01といった、値を範囲内に収めるメソッドはありますが、

float value = 10, min = -5, max = 5;
Debug.Log (Mathf.Clamp(value, min, max));//valueを-5 ~ 5 の間に制限
Debug.Log (Mathf.Clamp01(value));//valueを0 ~ 1 の間に制限

5
1


値が範囲内かどうか判定するメソッドはありません。


という事で今回は、

値が一定の範囲内に収まっているか判定する処理を作ってみたという感じの記事です!


値が一定の範囲内に収まっているかの判定

そもそも前述のminとmaxのように2つの値の大小が決まっていれば、実装はシンプルですが

float value = 10, min = -5, max = 5;

//minとmax内に収まっているか
bool isBetween = value <= max && target >= min;


例えば大小が決まってないaとbみたい場合は判定を分ける必要があります。

//aとbのどちらが大きいかで判定が変わる
bool isBetween;
if (a > b) {
  isBetween = value <= a && value >= b;
}
else {
  isBetween = value <= b && value >= a;
}


さすがに毎回これを書くのはいただけないので、メソッド化してみると以下のような感じ。

/// <summary>
/// targetがaとbの間の数値か
/// </summary>
public static bool IsBetween(int target, int a, int b) {
  if (a > b) {
    return target <= a && target >= b;
  }
  return target <= b && target >= a;
}


さらにfloatやVectorの判定を追加して、クラス化してみると以下のような感じ。

なお、refが分からない人は消しても大丈夫です。



使い方は以下のような感じで、ValueBetweenChecker.IsBetweenを実行するだけ。

int target = 20;
int a = 10, b = -5;

bool isBetween = ValueBetweenChecker.IsBetween(target, a, b);
    
Debug.Log($"{target}は{a}と{b}の間か? : {isBetween}");

20は10と-5の間か? : False

var target = new Vector3(0, 1, 2);
var a = new Vector3(0, 0, 0);
var b = new Vector3(3, 3, 3);

bool isBetween = ValueBetweenChecker.IsBetween(ref target, ref a, ref b);
    
Debug.Log($"{target}は{a}と{b}の間か? : {isBetween}");

(0.0, 1.0, 2.0)は(0.0, 0.0, 0.0)と(3.0, 3.0, 3.0)の間か? : True


また、使い勝手をよくするために拡張メソッド にするという方法もあります。



使い方は以下のような感じで、intやVector3の変数から直接IsBetweenを実行するだけ。

int target = 20;
int a = 10, b = -5;

bool isBetween = target.IsBetween(a, b);
    
Debug.Log($"{target}は{a}と{b}の間か? : {isBetween}");

20は10と-5の間か? : False

var target = new Vector3(0, 1, 2);
var a = new Vector3(0, 0, 0);
var b = new Vector3(3, 3, 3);

bool isBetween = target.IsBetween(ref a, ref b);
    
Debug.Log($"{target}は{a}と{b}の間か? : {isBetween}");

(0.0, 1.0, 2.0)は(0.0, 0.0, 0.0)と(3.0, 3.0, 3.0)の間か? : True