質問: new Sample3(); //staticメソッド内で生成した変数はローカル変数なのでstaticとして扱われない。 Debug.Log(s.i); //出力:1。 } public static void MyMethod(){ Debug.Log("MyMethod"); } } ``` ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { void Start () { Sample3.staticMethod(); } } ```
回答: 同じインスタンスを取得して**いません**。 以下、staticとそうでないクラス/変数/メソッドのイメージです。 staticでないクラス/変数/メソッドは「インスタンス」として存在します。 SampleクラスおよびSample2クラスが付いたオブジェクト「SampleObj」がシーン上に存在していて、Sample2の変数sampleにSampleObjに付いているSampleクラスをセットしていたとすると、 `sample.i は SampleObjに付いているSampleのi` `sample2.MyStatic2() は SampleObjに付いているSample2のMyStatic2メソッド` となります。 一方、staticなクラス/変数/メソッドはインスタンスとして存在しません。 では何処に存在しているかというと、「static領域」にひとつだけ存在しています。 `Sample2.MyStatic() は static領域のSample2のMyStaticメソッド`を指していることになります。 (Sample2クラスが付いたオブジェクトが何個存在しようが、`static領域のSample2のMyStaticメソッド`というただ1つの存在を参照します) C#のルールとして「staticメソッド内部に記載された変数はstaticとして扱われる」というものがあります。 つまり`Sample2.MyStatic()の中のsample.i は static領域のSample2の中の変数sampleのi`を指しています。 しかしそんな変数は存在していません。 Sample2で定義されているsample変数は`何らかのオブジェクトに付いているSampleクラス(=インスタンス)`を指している為、**static領域で変数sampleは宣言されていない**為です。 なのでこの場合の対処方法は、**Sample2の中のsample変数もstaticにすること(そしてその変数に適切なSampleクラスを代入しておくこと)**です。 ``` public class Sample2 : MonoBehaviour { //staticにする static Sample sample; void Start () { //static変数に値を入れる sample = GetComponent(); Sample2.MyStatic(); this.MyStatic2(); } static void MyStatic(){ Debug.Log(sample.i); //エラーにならない。 } void MyStatic2(){ Debug.Log(sample.i); //エラーにならない。 } } ```