【Unity】staticとは?1つしか存在しない変数やメソッドを作れる

staticとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityのstatic修飾子ってなに?」

「staticを使うとどうなるの?」

というお悩みの方に向けた内容となっています。

Unityで変数やメソッドを定義する際に、頭に「static」というキーワードを付けることができます。

このstaticを付けると、インスタンスを作らなくても、そのクラス自体に変数やメソッドが紐づく形となり、ゲーム内で一つしか存在しないものになります。

また、public staticを付けた変数やメソッドを他のクラスで呼び出す際、

と書くだけで、簡単にアクセスすることができるようになります。

そこで、このページでは、Unityで使うことができるstaticキーワードについて、どんな仕様なのか、特徴や使い方などをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

staticとは?

まずは、staticがどういうものなのか紹介していきます。

そのクラスに紐づいた変数やメソッドになる

staticを付けて変数やメソッドを定義した場合、その変数やメソッドはクラス自体に紐づくものとなります。

通常、変数やメソッドはインスタンスに紐づくものとなり、使用する場合はインスタンスを生成してそこに紐づけて使えるようになります。

しかし、定義する際にstaticを付けると、変数やメソッドがインスタンスではなくクラスに直接紐づくものとなります。

そのため、他のクラスで定義された変数やメソッドは、通常ではそのクラスのインスタンスを生成してから呼び出す必要がありますが、staticの変数やメソッドはインスタンスを生成せずに直接呼び出すことができます。

staticを使うメリット

staticを付けることで、変数やメソッドがクラスに紐づくことが分かりましたが、なぜstaticを使うのでしょうか?

staticを使うメリットとして、

  • 一つしか存在しないものを作れる
  • 他のクラスからのアクセスが簡単にできる

という2つのメリットがあります。

一つしか存在しないものを作れる

staticを使うことで、ゲーム内において一つしか存在しない変数やメソッドを作ることができます。

通常、変数やメソッドはインスタンスに紐づくため、紐づけたインスタンスごとに、変数やメソッドがゲーム内に存在することになります。

一方で、クラス自体は一つしか無いため、staticを付けることで、その変数やメソッドはゲーム内で一つしか存在しないものになります。

このstaticの特徴を使うことで、例えば、スコアやライフなどゲーム内で複数存在しないような変数を作る際に活用できます。

他のクラスからのアクセスが簡単にできる

staticを付けて宣言した変数やメソッドは、他のクラスからアクセスするのが簡単にできるようになります。

具体的には、staticとアクセス修飾子のpublicを付けて宣言した変数やメソッドは、他のクラスで「クラス名.変数」「クラス名.メソッド」と記述してあげるだけで、簡単に呼び出すことができます。

また、クラスに紐づくため、インスタンスを生成する必要も無く呼び出すことができるので、非常に便利に使うことができます。

ゲーム起動中は常に存在しているもの

staticを付けて宣言した変数やメソッドは、ゲーム起動中は常に存在しているものになっています。

通常の変数やメソッドは、インスタンスに紐づくことになるため、インスタンスが生成されたタイミングで作られ、インスタンスが破壊されるとその変数やメソッドも消えることになります。

しかし、staticを付けた変数やメソッドは、ゲーム起動直後の最初から存在するものとなり、ゲーム終了まで常にゲーム内にある状態となります。

そのため、常に呼び出すことができるものとして使うことができます。

ただし、その分ゲーム内のメモリを常に占有することになるため、使い過ぎないように注意しておきましょう。

staticの使い方・呼び出し方

ここからは、実際にstaticの使い方や呼び出し方を紹介していきます。

staticの使い方

変数の宣言やメソッドの定義の前に、「static」のキーワードを付けてあげることで使うことができます。

static 型名 変数名;	// staticを付けた変数の宣言

static 返り値の型 メソッド名()	//staticを付けたメソッドの定義
{
}

また、他のクラスからその変数やメソッドを呼び出す場合は、アクセス修飾子の「public」を付けて、public staticと書いて定義することができます。

例えば、ゲーム内で常に存在させておきたい変数scoreを宣言する場合は、

using UnityEngine;

public class Test1 : MonoBehaviour
{
    public static int score = 50;
}

と、5行目のように書いてあげることで、その変数はクラスのTest1に紐づくデータで、他のクラスからもアクセスできるものになります。

public staticを使った変数やメソッドの呼び出し方

public staticを付けて定義した変数やメソッドは、他のクラスから

クラス名.変数	// staticを付けた変数の呼び出し
クラス名.メソッド	// staticを付けたメソッドの呼び出し

と書いてあげるだけで、呼び出すことができます。

例えば、先ほどTest1のクラスに作った変数scoreを別のクラスでアクセスしたい場合、

using UnityEngine;

public class Test2 : MonoBehaviour
{
    void Start()
    {
        Debug.Log(Test1.score); // Test1クラスのscore変数を呼び出す

        Test1.score += 100;  // Test1クラスのscore変数に100を加算する
        Debug.Log(Test1.score);
    }
}

上のように書いてあげることで、呼び出すことができ、変数の書き換えも出来るようになっています。

staticのメソッド内でメンバ変数は使えない

staticを使う際の注意点として、staticを付けたメソッド内ではメンバ変数を使うことができません。

例えば、以下のようにクラス内で宣言したメンバ変数hpを、staticを付けたメソッドDamegeの中で使おうとしても、うまくいきません。

using UnityEngine;

public class Test1 : MonoBehaviour
{
    int hp = 10;

    public static void Damage()
    {
        hp -= 1;    // staticが付いていないメンバ変数は使えない
    }
}

これは、通常のメンバ変数はインスタンスに紐づいているものであり、それをクラスに紐づいているメソッドの中で使おうとしているので、エラーが起きてしまっています。

そのため、staticの中ではstaticを付けていないメンバ変数を使うことができないので、注意しておきましょう。

まとめ

このページでは、Unityで使うことができるstaticについて、どんな仕様やメリットがあるのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

変数の宣言やメソッドの定義の前に「static」を付けることで、その変数やメソッドがクラスに紐づく一つしか存在しないものになります。

また、ゲーム内で常に存在しているものになるので、「public static」と書くことで、他のクラスから常に呼び出すことができる変数やメソッドになります。

ただし、ゲーム内のメモリを常に占有してしまうことになるため、staticは使い過ぎないように注意しておく必要があります。

最後までお読みいただきまして、ありがとうございました!

コメント