質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

7123閲覧

staticだとアクセスエラー。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/07/08 04:48

編集2018/07/08 11:01

前提・実現したいこと

同じインスタンスを取得してるはずなのに、
staticメソッドだとエラーになってしまいます。
static内でも「インスタンス.インスタンスメンバ」にアクセスできる方法があれば教えていただけませんか?
また、それが不可な場合は、その理由について教えていただきたいです。
ご教示お願い致します。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Sample : MonoBehaviour { 6 public int i = 20; 7}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Sample2 : MonoBehaviour { 6 7 [SerializeField] 8 Sample sample; 9 10 void Start () { 11 Sample2.MyStatic(); 12 this.MyStatic2(); 13 } 14 15 static void MyStatic(){ 16 Debug.Log(sample.i); //エラーになる。 17 } 18 19 void MyStatic2(){ 20 Debug.Log(sample.i); //エラーにならない。 21 } 22}

補足情報(FW/ツールのバージョンなど)

Unity

追記質問。

「staticメソッド内部に記載された変数はstaticとして扱われる」
これをもっと掘り下げると、
「staticメソッド内部に記載されたローカル変数以外の変数やメソッドはstaticとして扱われる。」
で合っていますか?
また、下記コードのコメントも合っていますか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Sample3 { 6 public int i = 1; 7 static int j = 2; 8 9 public static void staticMethod(){ 10 //Debug.Log(i); //Sample3クラスのstaticなiを参照しようとして見つからないのでエラー。 11 Debug.Log(j); //出力:2。Sample3クラスのstaticなjを参照する。 12 MyMethod(); //出力:MyMethod。Sample3クラスのstaticなMyMethodを呼び出す。 13 int k = 3; //staticメソッド内で宣言した変数はローカル変数なのでstaticとして扱われない。 14 Debug.Log(k); //出力:3。 15 Sample3 s = new Sample3(); //staticメソッド内で生成した変数はローカル変数なのでstaticとして扱われない。 16 Debug.Log(s.i); //出力:1。 17 } 18 19 public static void MyMethod(){ 20 Debug.Log("MyMethod"); 21 } 22 23}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class GameManager : MonoBehaviour { 6 7 void Start () { 8 Sample3.staticMethod(); 9 } 10}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

同じインスタンスを取得していません
以下、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クラスを代入しておくこと)**です。

C#

1public class Sample2 : MonoBehaviour { 2 //staticにする 3 static Sample sample; 4 5 void Start () { 6 //static変数に値を入れる 7 sample = GetComponent<Sample>(); 8 9 Sample2.MyStatic(); 10 this.MyStatic2(); 11 } 12 13 static void MyStatic(){ 14 Debug.Log(sample.i); //エラーにならない。 15 } 16 17 void MyStatic2(){ 18 Debug.Log(sample.i); //エラーにならない。 19 } 20}

投稿2018/07/08 06:10

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/08 11:02

ご回答ありがとうございます。 「staticメソッド内部に記載された変数はstaticとして扱われる」ということを知りませんでした。 こちらに関して、追記質問を追記しましたが、合っていますか?
sakura_hana

2018/07/08 12:40

多分合っています。 厳密には、staticなメソッドの中で作ったローカル変数も、存在場所自体はstatic領域だと思います。 ただメソッドを出た瞬間に消される上に外部からのアクセスも出来ない為、基本的にはローカル変数と同じ挙動をすると思っていいと思います。 (但し非同期で複数箇所から同時に呼んだらどうなるのかはちょっと分からないです……)
退会済みユーザー

退会済みユーザー

2018/07/08 13:50

ご回答ありがとうございます。 なるほど、static内は全てstatic領域だから厳密にはローカル変数もstaticなのですね。 今回理解させていただいたことをメモの為、下記にまとめました。 ローカル変数の言い回しは厳密ではないと思いますが、下記で他に問題点がありましたら、ご指摘いただけたら幸いです。 「staticメソッド内部に記載されたローカル変数以外の変数やメソッドはstaticとして扱われる。  これより、staticメソッド内部で、ローカル変数以外でstaticでない変数やメソッドを参照しようとすると、それらの変数やメソッドをstaticなもので探しにいくので、参照エラーを起こす。」
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問