はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】classにstaticを付けるべきときはいつ?

はじめに

classの前にstaticをつけると静的クラスと呼ばれるものになります。

ただこれはどういう時につけるべきなのかを調べてみました!

結論

最初に結論を書くと、クラス内のすべてのメンバーが静的メンバーのときは静的クラスにするべきです。

静的クラスにするとどうなるか

まず静的クラスにするとどういう変化があるのでしょうか。
簡単例を紹介していきたいと思います。

using UnityEngine;

public class LocalPositionConverter
{

    /// <summary>
    /// 位置をワールド座標からローカル座標へ変換
    /// </summary>
    public static Vector3 FromWorldPosition(Transform transform,Vector3 pos)
    {
        return transform.InverseTransformPoint(pos);
    }

    /// <summary>
    /// 位置をローカル座標からワールド座標へ変換
    /// </summary>
    public static Vector3 ToWorldPosition(Transform transform,Vector3 pos)
    {
        return transform.TransformPoint(pos);
    }
}

public class Hoge : MonoBehaviour
{
    void Start()
    {
        LocalPositionConverter localPositionConverter = new LocalPositionConverter();   //静的クラスにしないとこういうことができてしまう

        Vector3 pos = new Vector3(7, 0, 0);

        Debug.Log(LocalPositionConverter.FromWorldPosition(transform, pos));
        Debug.Log(LocalPositionConverter.ToWorldPosition(transform, pos));
    }

}

簡単なローカル座標とワールド座標を変換するクラスを作ってみました。
ここで注目してほしいのはStart()の冒頭にてLocalPositionConverterクラスのインスタンスを作成しているところです。
LocalPositionConverterクラスには静的メソッドしか存在しないので、これは想定外の行為です。

これを防止するために静的クラスを用います。

using UnityEngine;

public static class LocalPositionConverter
{

    /// <summary>
    /// 位置をワールド座標からローカル座標へ変換
    /// </summary>
    public static Vector3 FromWorldPosition(Transform transform,Vector3 pos)
    {
        return transform.InverseTransformPoint(pos);
    }

    /// <summary>
    /// 位置をローカル座標からワールド座標へ変換
    /// </summary>
    public static Vector3 ToWorldPosition(Transform transform,Vector3 pos)
    {
        return transform.TransformPoint(pos);
    }
}

public class Hoge : MonoBehaviour
{
    void Start()
    {
        Vector3 pos = new Vector3(7, 0, 0);

        Debug.Log(LocalPositionConverter.FromWorldPosition(transform, pos));
        Debug.Log(LocalPositionConverter.ToWorldPosition(transform, pos));
    }

}

さいごに

静的クラスにすることで無駄なインスタンスの生成を防ぐことができます。
なので、できるだけ付けられるときには付けるように心がけましょう!