こんにちは、Unityエンジニアのオオバです。
基本的にUnityEngine.Mathfを使う
Unityでは、C#の算術クラスSystem.Mathをラップ・拡張したUnityEngine.Mathfが提供されています。
たとえばUnityEngine.Mathf.Abs関数は引数の絶対値を求めてくれますが、中身を覗くと以下のコードで記述されています。
内部的にはSystem.Math.Abs関数を実行しているだけです。
ではUnityでコードを書く場合、UnityEngine.Mathf.AbsとSystem.Math.Absどちらを使えばよいのか。
ケースによって判断が変わるため、3つの観点から比較していきます。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
パフォーマンスの違いはどれくらい?
上記のコードを使い、Unityプロファイラで負荷を確認しました。1回の実行では目立った差は出ませんが、10000回実行すると顕著な差が現れます。
UnityEngine.Mathf.AbsはSystem.Math.Absに比べて約2倍の負荷がかかっています。
UnityEngine.Mathf.Absが内部でMath.Absを呼び出しているため、「2つの関数」をまたぐオーバーヘッドが原因です。
パフォーマンスチューニングの手段として、Mathクラスをそのまま使うのは1つの選択肢になります。
マルチプラットフォーム対応ではどちらが安全?
Unityはワンソースで複数のプラットフォームに対応するように作られています。
UnityEngine.Mathfに限った話ではありませんが、UnityEngine配下のクラスを使ったほうが安全です。
チーム開発ではどちらに統一すべき?
チーム内でコードレビューをする際、MathfとMathのどちらを使うかで議論が発生しがちです。
「このケースなら使っていい」「このケースはやめよう」といった判断がコードレビューの複雑化を招きます。
大きな問題が発生していないのであれば、Mathfクラスに統一したほうがシンプルで良いでしょう。
まとめ
パフォーマンスに余裕がある場合は素直にUnityEngine.Mathfを使うのがベストです。
| 観点 | おすすめ | 理由 |
|---|---|---|
| パフォーマンス重視 | System.Math | 関数呼び出しが1段少なく約2倍速い |
| マルチプラットフォーム | UnityEngine.Mathf | プラットフォーム差異をUnityが吸収 |
| チーム開発 | UnityEngine.Mathf | ルール統一でレビューがシンプルに |

筆者のXをフォローしよう
- Unity6000.1.17f1








