オブジェクト毎に異なる値を持たせたいのでしたら、先にご回答いただいた皆さんのおっしゃるようにstatic
は外すのが妥当でしょう。あとは、各スクリプトBインスタンスがどうやって自身の親にアタッチされたそれぞれのスクリプトAインスタンスを見つけるかですが...
一つの手としては、GetComponentInParentを使うことが考えられます。スクリプトB内でこれを用いれば実行時に自身の親のスクリプトAを取得できるかと思います。
また、他にもこんな手があるでしょう。
プレハブの親オブジェクト側のスクリプトAが下記のようになっているとして...
C#
1using UnityEngine;
2
3public class ScriptA : MonoBehaviour
4{
5 public int Field; // このフィールドの値をScriptB内で使いたい
6
7 private void Awake()
8 {
9 // それぞれのScriptAインスタンスに固有の値として、とりあえずインスタンスIDを代入
10 this.Field = this.GetInstanceID();
11
12 // 個々のScriptAに異なる値がセットされたことを確認するため
13 // コンソールにオブジェクトの位置とFieldの値を出力してみる
14 Debug.LogFormat("{0} ScriptA Field:{1}", this.transform.position, this.Field);
15 }
16}
子オブジェクト側のスクリプトBを下記のようにしておきます。public
指定した(またはSerializeField属性を付けた)フィールドがインスペクタ上に表示されるようになることはすでにおなじみかと思いますが...
C#
1using UnityEngine;
2
3public class ScriptB : MonoBehaviour
4{
5 // ScriptBにScriptAの参照を保持するフィールドを追加
6 // これにプロジェクトビュー上で親オブジェクトをドロップしておく
7 public ScriptA ScriptAReference;
8
9 private void Start()
10 {
11 // 各ScriptBが、それぞれの親が持つScriptAを参照していることを確認するため
12 // コンソールに親オブジェクトの位置とScriptAのFieldの値を出力してみる
13 Debug.LogFormat("{0} ScriptB ScriptAReference.Field:{1}", this.transform.parent.position, this.ScriptAReference.Field);
14 }
15}
その後、さらにプロジェクトビュー上で(ヒエラルキービュー上ではない点にご注意ください)子オブジェクトを選択し、インスペクタ上のフィールドにプロジェクトビューにある親オブジェクトをセットします。
このような状態にあるプレハブを、下記のようにInstantiateでシーン上に生成すると...
C#
1using UnityEngine;
2
3public class ObjectSpawner : MonoBehaviour
4{
5 public GameObject CubePrefab;
6
7 private void Start()
8 {
9 // 位置をずらして3個のゲームオブジェクトを作る
10 for (var i = 0; i < 3; i++)
11 {
12 Instantiate(this.CubePrefab, Vector3.right * i, Quaternion.identity);
13 }
14 }
15}
下図のように、個々のScriptB
のScriptAReference
が、それぞれ正しく親オブジェクトのScriptA
を参照するようになります。