こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • MathfとMathの違いがわからない
  • どっちを使えばいいの?
  • パフォーマンスに差はある?
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    基本的にUnityEngine.Mathfを使う

    Unityでは、C#の算術クラスSystem.Mathをラップ・拡張したUnityEngine.Mathfが提供されています。

    たとえばUnityEngine.Mathf.Abs関数は引数の絶対値を求めてくれますが、中身を覗くと以下のコードで記述されています。

    内部的にはSystem.Math.Abs関数を実行しているだけです。

    ではUnityでコードを書く場合、UnityEngine.Mathf.AbsSystem.Math.Absどちらを使えばよいのか。
    ケースによって判断が変わるため、3つの観点から比較していきます。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    パフォーマンスの違いはどれくらい?

    上記のコードを使い、Unityプロファイラで負荷を確認しました。1回の実行では目立った差は出ませんが、10000回実行すると顕著な差が現れます。

    【Unity】MathfとMathの違い!どっちを使うべきか解説_0

    Mathf.Abs vs Math.Abs プロファイラ結果

    UnityEngine.Mathf.AbsSystem.Math.Absに比べて約2倍の負荷がかかっています。
    UnityEngine.Mathf.Absが内部でMath.Absを呼び出しているため、「2つの関数」をまたぐオーバーヘッドが原因です。

    パフォーマンスチューニングの手段として、Mathクラスをそのまま使うのは1つの選択肢になります。

    マルチプラットフォーム対応ではどちらが安全?

    Unityはワンソースで複数のプラットフォームに対応するように作られています。
    UnityEngine.Mathfに限った話ではありませんが、UnityEngine配下のクラスを使ったほうが安全です。

    ※逆のパターンもありえますが、基本的にはUnityEngine配下のAPIがプラットフォーム差異を吸収してくれます

    チーム開発ではどちらに統一すべき?

    チーム内でコードレビューをする際、MathfとMathのどちらを使うかで議論が発生しがちです。

    「このケースなら使っていい」「このケースはやめよう」といった判断がコードレビューの複雑化を招きます。
    大きな問題が発生していないのであれば、Mathfクラスに統一したほうがシンプルで良いでしょう。

    まとめ

    パフォーマンスに余裕がある場合は素直にUnityEngine.Mathfを使うのがベストです。

    MathfとMathの使い分け
    観点おすすめ理由
    パフォーマンス重視System.Math関数呼び出しが1段少なく約2倍速い
    マルチプラットフォームUnityEngine.Mathfプラットフォーム差異をUnityが吸収
    チーム開発UnityEngine.Mathfルール統一でレビューがシンプルに
    オススメ記事
    検証環境