生成されたPrefabの側から、ヒエラルキー内のオブジェクトを取得できる仕組みを作ってみましょう。
オブジェクトだけでなく、変数も取得できるようにスクリプトを作成します。
今回の例では、1秒おきに発射される球(Prefab)のパワー数値を、ヒエラルキーにあるオブジェクトから取得してみます。
Prefabから他の変数を取得
空のオブジェクト(アクセスされる側)を作成します。
この位置から、1秒おきに球を発射させるようにします。
BallShot.csを作成し、GameObject(空のオブジェクト)に追加します。
BallShot.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallShot : MonoBehaviour { [SerializeField] GameObject prefab; private float time; public int power; //球を飛ばすパワー void Start() { time = 1; } void Update() { //1秒おきに球を生成 time -= Time.deltaTime; if (time < 0) { GameObject ball = GameObject.Instantiate (prefab)as GameObject; time = 1; power = Random.Range(1,10); //1~9のランダム } } } |
続いて、Sphere(アクセスする側)を作成し、リジッドボディを追加します。
Ball.csを作成し、Sphereに追加します。
Ball.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Ball : MonoBehaviour { Rigidbody rb; [SerializeField] GameObject shotPos; BallShot ballShot; void Start() { rb = GetComponent<Rigidbody>(); //ヒエラルキーのGameObject取得 shotPos = GameObject.Find("GameObject"); //GameObjectのBallShotクラス取得 ballShot = shotPos.GetComponent<BallShot>(); //powerを取得してパワーをランダムに rb.velocity = new Vector3(0, 0, ballShot.power); } } |
Sphereをプレハブ化します。
Sphereの元データは削除しておきます。
プレハブのフィールドに、Sphereを入れます。
ゲームプレイしてみましょう。
1秒おきにPrefabデータ(Sphere)が発射されます。
発射されたSphereを見てみると、ヒエラルキー内のGameObjectを取得できていることが確認できます。
さらに、BallShotクラス内にあるpower(変数)を取得して、ボールに加える力をランダムにしています。