Unityで2つ以上スクリプトをつくったとき、別のスクリプトで定義した変数や関数を呼び起こしたい時があるかと思います。
また、別のスクリプトから変数をアクセス(使う)場合はstatic(静的)にする必要がありますが、static変数はゲームを終了して再開しても値を保持できないことやクラス間の依存関係の増加など致命的な問題があります。
したがって、本記事では、staticを使わずに、別スクリプトの関数を呼び起こす方法を紹介します。
- 別のスクリプトの関数を呼び出したい。
- static以外で変数にアクセスしたい。
- 「GetComponent<>();」の使い方を知りたい。
ConoHaWing開設方法|アリッシア
技術ブログを書くべき理由|アリッシア
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();
}
}
}
ブログを運営するメリット
プログラマーがブログを運営するメリットは沢山あります。
エンジニアはブログを運営するべき理由|アリッシア
- アウトプットによるスキル向上
- メモ帳代わり
- ポートフォリオ(案件獲得)
ブログを始めるためには、「テーマ」・「ドメイン」・「サーバー」の3つが必要です。
3つはブログ運営の基盤となる要素ですが、これら全て自分で用意しなければいけません。
面倒で難しくブログ開設を断念してしまう人が多いです。
ConoHa Wingの「WordPressかんたんセットアップ」は
最短10分で契約可能!
ConoHa WINGから契約をすれば、独自ドメイン、サーバーの用意、WordPressとの連携も簡単にできます。
さらに、2つの独自ドメインが永久無料の特典もあり、
月660円からの破格価格にもかかわらず、表示速度は国内最速です。
解説
初めに、「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な変数を用意することで、そのスクリプト内のみで変数が有効になるので、別のスクリプトからの干渉を受ける心配はなくなります。