他のオブジェクトにあるスクリプトを実行するには、GetComponentを使う方法があります。
今回はクラスをインスタンス化して、そこにアクセスする方法を試してみましょう。
関連記事:
他のスクリプトの変数を取得する
他のスクリプトの関数を実行する
他のスクリプトのBoolを取得する
キューブをクリックすると、ボールが出現する動きをつくってみます。
PlaneとCube、GameObject(空のオブジェクト)を用意します。
SphereのPrefabを作成して、リジッドボディを付けておきます
instanceを使う
BallDrop.csを作成し、GamaObject(空のオブジェクト)に追加します。
BallDrop.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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallDrop : MonoBehaviour { public GameObject ball; //BallDropをインスタンス化して保持 public static BallDrop instance; //BallDropインスタンスがなければ、このBallDropをインスタンスとする void Awake() { if (instance == null) { instance = this; } } public void BallAppear() { Instantiate(ball, new Vector3(2, 5, 0), Quaternion.identity); } } |
Awake()は、Start()よりも前に、スクリプトのインスタンスがロードされたときに呼び出されます。
「NullReferenceException: Object reference not set to an instance of an object」というエラーを回避するため、Nullであれば、BallDropをインスタンスとして参照するようにしています。
GameObjectのインスペクターを確認すると、Ball項目が出来ています。
ここにはSphereのPrefabデータを入れておきます。
以上でボールを生成する(アクセスされる)側のスクリプトは完成しました。
staticクラスにアクセスする
続いて、Cubeのほうのスクリプトをつくりましょう。
CubeClice.csを作成して、Cubeに追加します。
スクリプトは以下のように書きました。
1 2 3 4 5 6 7 8 9 10 11 12 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeClick : MonoBehaviour { void OnMouseDown() { //BallDropのBallAppearを実行 BallDrop.instance.BallAppear(); } } |
プレイして動きを見ましょう。
クラスを静的なものとして固定し、ここへアクセスする方法。
instanceの使用例として紹介しました。