以前の記事で「他のスクリプトの関数を実行する」というのがあったのですが、今回はまた別の方法で、試してみようと思います。
他のメソッドにアクセスする方法はいつかありますが、今回はinstanceを使ってつくってみましょう。
赤のボールが床に衝突すれば、青のキューブを表示させるというしくみです。
前回よりもかなり簡素に実装できますので、ぜひ試してみましょう。
関連記事:
他のスクリプトの関数を実行する方法
キューブ(アクセスされる側)
Plane、Cube、Sphereの各オブジェクトを用意して、Sphereを上に持っていきます。
Sphereにはリジッドボディを追加しましょう。
Cubeに、CubeAppear.csを作成して追加します。
CubeAppear.csを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeAppear: MonoBehaviour { static public CubeAppear instance; void Start () { this.gameObject.SetActive(false); } public void CubeActive() { this.gameObject.SetActive(true); } } |
ボール(アクセスする側)
続いて、Sphereにもスクリプトを作成します。
Sphereに、BallDrop.csを作成して追加しましょう。
BallDrop.csを書きます。
1 2 3 4 5 6 7 8 9 10 11 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallDrop : MonoBehaviour { void OnCollisionEnter() { CubeAppear.instance.CubeActive(); } } |
ここでゲームプレイしてみると、エラーが表示されます。
NullReferenceException: Object reference not set to an instance of an object
もう一度、CubeAppear.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 CubeAppear: MonoBehaviour { static public CubeAppear instance; void Awake() { if (instance == null) { instance = this; } } void Start () { this.gameObject.SetActive(false); } public void CubeActive() { this.gameObject.SetActive(true); } } |
CubeActive()にアクセスを試みていますが、その過程で、オブジェクトのインスタンスを参照できなかった。
そこで、void Srart()よりも早く実行されるvoid Awake()を使って、nullを回避しました。
プレイしてみましょう。
このメソッドを呼び出す方法ですと、Findを使ってGameObjectを参照する手間が省けます。
関連記事:
他のスクリプトの関数を実行する方法