他のオブジェクトにある関数を実行する際、スクリプトの管理をわかりやすくするため、デリゲートを使用してみます。
Sphere側のスクリプトで1秒経過した後、Cubeにカラーが青に変わります。
はじめに、デリゲートを使わないでスクリプトを作成。
その後、デリゲートを使ってスクリプトを書き直してみましょう。
関連記事:
出現してから1秒後に落下する
Invokeを使ってn秒後に関数を実行する
相手が動いている間、プレーヤーを動けなくする
数秒後にオブジェクトを出現させる
コルーチンを使って1秒後にテキストを消す
触れた相手をn秒後に削除する
乗ったオブジェクトをn秒後に消す
ぶつかればn秒間ストップ
スタートから3秒後にプレーヤーを追いかける
デリゲートを使わないケース
他のオブジェクトの関数を実行する際、まずは、よくある方法で作成してみましょう。
CubeとSphereを作成し、横並びに配置します。
GameManager.csをCubeに追加し、SphereScript.csをSphereに追加します。
GameManager.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { public void ChangeColor() { GetComponent<Renderer>().material.color = Color.blue; } } |
SphereScript.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 SphereScript : MonoBehaviour { public GameManager gameManager; void Start() { Invoke("StartChange", 1.0f); } void StartChange() { gameManager.ChangeColor(); } } |
Sphereを選択し、GameManagerのフィールドに、Cubeを入れます。
ゲームプレイしてみましょう。
1秒後に、Cubeが青色に変わります。
デリゲートを使ったケース
この動きを、デリゲートを使って書き換えてみましょう。
SphereScript.csのほうから書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereScript : MonoBehaviour { public delegate void TimeUp(); //関数を登録できる型を作成 public TimeUp timeUp; //関数を登録できる変数を宣言 void Start() { Invoke("StartChange", 1.0f); //1秒後にStartChangeを実行 } void StartChange() { timeUp(); //timeUpを実行 } } |
TimeUpという名前で型を作成し、これを使ってtimeUpという変数をつくっています。
1秒後にtimeUpが実行されます。
このtimeUpの中に、Cube側で関数を登録していきます。
次は、GameManager.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 GameManager : MonoBehaviour { public SphereScript sphereScript; //SphereScriptを取得するための変数 void Start() { sphereScript.timeUp += ChangeColor; //timeUpに関数:ChangeColorを登録 } public void ChangeColor() //timeUpが実行されると、ChangeColorも実行される { GetComponent<Renderer>().material.color = Color.blue; } } |
SphereScriptのフィールドに、Sphereオブジェクトを入れます。
ゲームプレイしてみましょう。
1秒後に、Cubeが青色に変わります。
sphereScript.timeUp += ChangeColor; により、ChangeColor()の関数を登録しています。
timeUpが実行されたタイミングで、そこに登録されているChangeColor()が実行されます。
実行結果は同じなのですが、デリゲートを使うことで、Cube側(GameManager.cs)で、他のスクリプトを管理できます。
コード記述が多くなってくると、このように管理用のスクリプトから、内容を把握できたほうが、見た目がわかりやすくなります。
関連記事:
出現してから1秒後に落下する
Invokeを使ってn秒後に関数を実行する
相手が動いている間、プレーヤーを動けなくする
数秒後にオブジェクトを出現させる
コルーチンを使って1秒後にテキストを消す
触れた相手をn秒後に削除する
乗ったオブジェクトをn秒後に消す
ぶつかればn秒間ストップ
スタートから3秒後にプレーヤーを追いかける