【Unity】地味に使い所があるMathfのClampについて知る
UnityのMathfといえば数学的な計算をしてくれるメソッドが豊富にあることで有名ですが、個人的にClampまたはClamp01のメソッドを使うことが多いです。
このClampメソッドは値を指定の範囲内に制限してくれるメソッドで、想定外の値が入ってきたとしても値が変なものにならない便利メソッドです。Clamp01はその名前の通り0から1の間に制限してくれるもので、割合の計算を行う際は非常に便利です。
このページでは便利メソッドのMathf.ClampとMathf.Clamp01について紹介します。
地味に使い所があるMathfのClamp
冒頭でも紹介しましたがMathfクラスのClampメソッドは指定した範囲の値に制限してくれるメソッドです。多分コードを見て動きと対応させた方がわかりやすいと思うので、以下のように簡単にコードを書いてみました。
0から10までの範囲内の値、下限より小さい値、上限より大きい値を入力してみます。すると結果は以下の通り。指定した範囲(ここでは0fから10f)の値である5fはそのまま使われています。0fよりも小さい-5fはClampメソッドによって0fになりました。10fより大きい20fの場合はClampメソッドによって10fになっています。
以下のようにMathf.Clampの引数をint型にすると戻り値もint型になります。下のコードだとローカル変数のclampedがint型になっています。
int型でも使えるので、例えばRPGの所持金で上限と下限の確認を行う際にこのメソッドを使えば1行で範囲内の値を取得できます。所持金がマイナス表記になるのは……意図して行う場合は別として、通常はあって欲しくないですもんね。
Clamp01についても
Clampメソッドの仲間としてClamp01メソッドがあります。こちらは0から1の間に制限するもので、float型の値が返ってきます。
0から1というと範囲が狭いような気もしますが、割合の計算をする場合は0から1という範囲は非常に便利です。
例えばMathfやVector3のクラスに存在するLerpメソッド(線形補間のメソッド)では、開始点から終了点までの割合を使って現在の値を取得します。Mathfの場合だったらfloat型の値について線形補間するので、0fから10fまで値が変化するとして、割合が0.4(40%)なら4.0f、0.75(75%)なら7.5fといったようにどこまで値が変化したかの値を返してくれます。
この計算には0から1で値を返してくれるClamp01メソッドが便利です。
また、色の表し方でもint型で0から255の間で表現する方法(UnityではColor32クラス)もあれば、float型で0から1の間で表現する方法(UnityではColorクラス)もあります。スクリプトリファレンスを眺めていて引数として0から1までの値を使う場合は「Clamp01を使うと便利だなー」と思い出せるといい感じにコーディングできます。
同じMathfクラスにあるPerlinNoiseの機能を使う場合などにも、厳密に0から1に制限したい時に使うと便利です。
Lerpのサンプル
Vector3型にはLerpメソッドがあるので、この割合としてClamp01を使った値を渡すようにしてみましょう。LerpはLinear interpolation(線形補間)の略です。……どこをとってLerpなのか一瞬迷いますね。
インスペクターウィンドウから開始位置、終了位置を設定できるようにします。また、移動時間についてもインスペクターウィンドウから設定できるようにしています。
経過時間はフィールドとして保持するようにしました。
Update()メソッドの中ではLerpメソッドを使ってこのスクリプトがアタッチされたゲームオブジェクトの位置を更新しています。ローカル変数のはrateでは経過時間を移動時間で割ることで割合を求めています。割合は0から1で取得したいのでClamp01を使っています。
開始位置、終了位置を結んだ線について、割合を使って現在の位置を求めています。その位置はゲームオブジェクトの位置として設定しています。
この処理を書いたスクリプトを任意のゲームオブジェクトにアタッチすると、以下のように開始点から終了点までオブジェクトを移動させることができます。
Lerpメソッドはコルーチンなどを使って音量を徐々に変化させたりすることもできます。結構使い道が広いので、ClampとLerpを組み合わせて使う方法をマスターしておくといいかもしれません。
ただまぁこの方法だとリニアに値が変化するので、より自然に値を変化させるならイージングについても意識すると良いと思います。DOTweenのようにTween系のアセットを使うとこのイージングのプリセットがあるので便利です。
基本的な考え方を理解するためにはこのClampとLerpの組み合わせは役に立つと思います。
Clampって?
余談ですが、Clampは(クランプで)締める、しっかり固定する、といった意味の言葉。名詞としてのクランプはDIYやる人ならよく見かけるかも。あとは理科室とか、技術の授業でも見たことがあるかもしれません。人によっては漫画家の方が先に思い浮かぶかも?
メソッド名になっているということは動詞がベースになっているのですが、道具とその道具によって行われる行為をイメージするとメソッドについて分かりやすくなることも。
まとめ
MathfクラスのClampメソッドについて紹介しました。個人的に地味に使い所が多いClampメソッドとClamp01メソッドなので、ぜひ使ってもらいところ。ここで紹介した以外にもたくさんの使い道があると思うのでどんどん使ってみてね。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】MathfのSinとCosを使って円形の軌道を描くサンプル【C#】 2020.12.28
-
次の記事
【Unity】パーリンノイズ(PerlinNoise)って何ね? と思ったので遊んで試してみよう 2020.12.30
コメントを書く