👌

Unity3D 他のGameObjectから、privateなフィールドを取得する方法。

2024/01/21に公開


掲載元

記事タイトルの本題に入る前に、アクションゲームなどで、上記のようなゲームオブジェクト(以降、回復パックと呼ぶ)を、シーンに配置し、『プレイヤーが接触すると、HPを回復できる。』という効果を実装したい場合を考えます。

この場合は、
1.“回復パック”に規定(Heal_Pack)のタグをつける。
2.“プレイヤー”が持つスクリプトのOnTriggerEnterメソッド内に
【タグがheal_Packnaなら、このオブジェクトのHPフィールドをx加算する】
という処理を記述すれば実行できます。

わざわざ、“回復パック側”のスクリプトに
【Playerのフィールドをget取得して回復値を加算し、setで返却する】
のような処理を実装する必要はありません。

しかし!
特定のオブジェクトのフィールドを覗き込み、値によって自分の動作を変えたいオブジェクトを実装する場合はget(およびset)を実装する必要があります。

先ほどの例では、
“回復パック”は、最終的に変化するのは“プレイヤー”という、自分以外のオブジェクトだったので、この必要性は生まれませんでした。

また、他のオブジェクトのパラメータでも、速度や位置などはスクリプト内のクラスフィールではなく、RigidBody・transformなどの別コンポーネントが保持しているので
対象のオブジェクトに対してGetComponent<>();することで取得できますね。

今回の記事は、クラス内に自分で設定したprivareなフィールドを取得する方法です。

【例1】
近くを通ったプレイヤーの残りHPを報告するセンサー
【例2】
巣の卵の数が規定値以下だと襲い掛かってくる母鳥

などが『他のオブジェクトのフィールドの値によって自分の動作を変えたいオブジェクト』
に該当しますね。

例1では、プレイヤーのHPフィールド←センサー(報告する数値が変化)
例2では、巣のcount_eggフィールド←母鳥(アニメーションや動作が変化)

という動きになります。

実際に実装していきましょう!

1.覗かれるオブジェクトのクラスにgetterを実装する。

渡したいフィールド変数を返却地に持つgetterメソッドを記述しましょう
また、覗きたいオブジェクトのクラスでgetter_HPを記述するのでアクセス修飾子は
public である必要があります。
<int HPの場合>

public int getter_HP(){

return HP;

}

となりますね。

2.覗くオブジェクトは対象のスクリプト・コンポーネントを取得する。

1.覗きたい(getter_HPしたい)対象のオブジェクトを取得する。
2.取得したオブジェクトのスクリプト・コンポーネントを取得し、スクリプト変数に格納する。
3.スクリプト変数名.getter_HPで、数値を取得できる。

GameObject gameobject = GameObject.Find("Player");
NewBehaviourScript Player_script = gameobject.GetComponent<NewBehaviourScript>();
int Player_HP = Player.script.getter_HP();

Discussion