ゾンビとUnity

ゾンビネタとUnityでのゲーム制作について綴るブログです。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unity スクリプトにアクセスしやすくする

新規プロジェクトを開いて、おもむろに Cube を追加し、その Cube にこんな感じ
using UnityEngine;
public class Test : MonoBehaviour {
private int count = 0;
public int Count { get { return count; } }
void Update() {
count++;
}
}
のスクリプトをコンポーネントとして追加する。
この Test クラスのメソッドなりプロパティなりフィールドなりを呼び出したい場合。

1. Cube のゲームオブジェクトを取得
2. そのゲームオブジェクトのコンポーネントを取得
3. 取得したコンポーネントのメソッドなりプロパティなりフィールドなりを呼び出す

具体的に書くと

Test t = GameObject.Find( "Cube" ).GetComponent<Test>();

こうすることで Test のインスタンスを取ることができるので、Count プロパティにアクセスしたいなら

Debug.Log ( t.Count );

一行で書くこともできる。

Debug.Log ( GameObject.Find( "Cube" ).GetComponent<Test>().Count );

ただ、これちょっと長すぎないだろうか?
例えば、こんな風に書けたら最高だと思う。

Debug.Log ( Test.Count );

これができる条件は限られているけど、使える状況は結構あったりする。

条件はたった1つ
2つ以上のインスタンスを作らないことが分かっている

シングルトンなクラスなら可能。
同じスクリプトを持ってるゲームオブジェクトが2つ以上になる場合は使えない。

using UnityEngine;
public class Test : MonoBehaviour {
static private int count = 0;
static public int Count { get { return Test.count; } }
void Update() {
Test.count++;
}
}
※Test.count と書いているけど、この場合 Test. は付けなくてもコンパイルは通るし、動作もするはず。

欠点
1. static なので、プログラム終了までずっとメモリに残る。
2. staticじゃないメソッドなりプロパティなりフィールドなりにアクセスしたい場合は、更に工夫が必要。
using UnityEngine;
public class Test : MonoBehaviour {
static private int count = 0;
static public int Count { get { return Test.count; } }
private string log;
public string Log { get { return this.log; } }
void Update() {
Test.count++;
this.log = this.log + ", " + Test.count;
}
}
Log プロパティを Test.Log という形で呼び出したいが、static じゃないので不可能。
でも、Test クラスはシングルトンであることは分かっているので、工夫次第で似たようなことはできる。
using UnityEngine;
public class Test : MonoBehaviour {
static private int count = 0;
static public int Count { get { return Test.count; } }
private string log;
public string Log { get { return this.log; } }
static private Test instance = null;
static public Test Instance { get { return Test.instance; } }
void Awake() {
if (Test.instance == null) Test.instance = this;
}
void Update() {
Test.count++;
this.log = this.log + ", " + Test.count;
}
}
追加した Instance プロパティを使うことで、static じゃない Log プロパティにアクセス可能になる。

Debug.Log ( Test.Instance.Log );

それでも、こう GameObject.Find( "Cube" ).GetComponent<Test>().Log するよりはずっと楽だし、読みやすい。
 
スポンサーサイト

- 0 Comments

Add your comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。