Unityで2つ以上スクリプトをつくったとき、別のスクリプトで定義した変数や関数を呼び起こしたい時があるかと思います。
また、別のスクリプトから変数をアクセス(使う)場合はstatic(静的)にする必要がありますが、static変数はゲームを終了して再開しても値を保持できないことやクラス間の依存関係の増加など致命的な問題があります。
したがって、本記事では、staticを使わずに、別スクリプトの関数を呼び起こす方法を紹介します。
- 別のスクリプトの関数を呼び出したい。
- static以外で変数にアクセスしたい。
- 「GetComponent<>();」の使い方を知りたい。
GetComponent
GetComponentは、Unityでゲームオブジェクトにアタッチされたコンポーネントを取得するためのメソッドです。
取得には、次の通りに書きます。
GetComponent<コンポーネントの型>()
GameObjectは物理エンジンを適用させるRigidbodyを取得して、スクリプトから操作する場面が多く、以下のコードはRigidbodyコンポーネントを取得して、重力、質量、速度、移動を制御するコードになります。
// Rigidbodyコンポーネントを取得
Rigidbody rb = GetComponent<Rigidbody>();
// 重力を有効にする
rb.useGravity = true;
// 質量を変更する
rb.mass = 2f;
// 速度を変更する
rb.velocity = new Vector3(1f, 0f, 0f);
// 力を加えて移動させる
rb.AddForce(Vector3.forward * 10f);
GetComponentで別スクリプトの関数を呼び起こす方法
それでは、別のスクリプトから関数を呼び出す方法を解説します。
今回はスクリプト「ScriptA.cs」「ScriptB.cs」の2つを使います。
「ScriptB.cs」にて、スペースキーを押すと、「ScriptA.cs」の関数で変数を加算するコードです。
関連記事:「【Unity】UIボタンを押すごとに数字を増やし、クリックした回数をカウントをする」
ソースコード
関数を渡す側
using UnityEngine;
public class ScriptA : MonoBehaviour
{
int Count;
public void MethodA()
{
Count++;
Debug.Log(Count);
}
}
関数を受け取る側
using UnityEngine;
public class ScriptB : MonoBehaviour
{
private ScriptA scriptA;
private void Start()
{
scriptA = GetComponent<ScriptA>();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("Spaceキーが入力されました");
scriptA.MethodA();
}
}
}
UdemyでUnityを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 【Unity C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
C#の文法やApp StoreとGoogle Playへゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
初めに、「ScriptA」を解説します。
「Count」はint型変数で、関数「MethodA()」内で「Count」を1ずつ加算します。
int Count;
public void MethodA()
{
Count++;
Debug.Log(Count);
}
つづいて、「ScriptB」を解説します。
scriptAは、クラス「ScriptA」のprivateなインスタンス変数です。
クラス「ScriptA」の新しいインスタンスを作成して、変数「scriptA」に格納します。
よって、別のスクリプト(ScriptB)からScriptAクラスで定義されたメンバー変数、メソッド、プロパティにアクセスすることができます。
private ScriptA scriptA;
また、Start()内で、privateな変数「scriptA」にGetComponentメソッドを使用して、スクリプトで定義されたメソッドや変数にアクセスします。
scriptA = GetComponent<ScriptA>();
最後にUpdate()内で、スペースキーを押すと、スクリプト「ScriptA」内の関数MethodA()を実行させます。
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("Spaceキーが入力されました");
scriptA.MethodA();
}
実演
完成した2つのスクリプトをHierarchyウィンドウにアタッチしてください。
再生ボタンを押して、スペースキーを押すと以下のようになります。
まとめ
今回は、staticを使わず、別スクリプトの関数を呼び起こす方法を紹介しました。
関数を呼び起こすためには、「GetComponent()」を使い、呼び起こしたい関数があるクラスの新しいインスタンスを作成して、privateな変数を定義します。
privateな変数を用意することで、そのスクリプト内のみで変数が有効になるので、別のスクリプトからの干渉を受ける心配はなくなります。