Unity の monobehaviour スクリプトから別の monobehaviour スクリプトの変数またはメソッドにアクセスするための鍵は、スクリプト参照または変数とメソッドへの参照を取得する方法です。
1. オブジェクトを見つけて、スクリプト コンポーネントを取得し、スクリプト参照を取得します。
スクリプト 2 が配置されている GameObject を GameObject.Find() メソッドで取得し、スクリプト 2 のインスタンスを GetComponent() メソッドで取得します。
// 获取脚本2 所在的 GameObject
GameObject obj = GameObject.Find("脚本2所在的GameObject的名称");
// 获取脚本2 的实例
Script2 script2 = obj.GetComponent<Script2>();
// 访问脚本2 的变量
script2.variableName;
// 调用脚本2 的方法
script2.MethodName();
2. スクリプトを直接定義し、観測パネルに直接値を代入し、スクリプトへの参照を取得する例
スクリプト 1 でパブリック変数を宣言し、スクリプト 2 を [インスペクター] ウィンドウの変数にドラッグします。これにより、スクリプト 1 のスクリプト 2 のパブリック変数とメソッドに直接アクセスできます。
// 在脚本1 中声明一个 public 变量
public Script2 script2;
// 在 Inspector 窗口中将脚本2 拖拽到该变量上
// 访问脚本2 的变量
script2.variableName;
// 调用脚本2 的方法
script2.MethodName();
第三に、メッセージを使用して達成する
Unity では、メッセージ システムを使用してスクリプト間の通信を実現できます。メッセージ システムは、他のスクリプトのインスタンスを直接参照せずにメッセージを送信することで、他のスクリプトのメソッドを呼び出す疎結合の方法です。
メッセージ システムを使用してスクリプト間の通信を実現する手順は次のとおりです:
1. スクリプトにメッセージを受信する必要があるメソッドを追加する [SerializeField] タグと [HideInInspector] タグを使用してメソッドを追加し、UnityEvent を使用する必要があります。次のように入力して、イベントを定義します。
using UnityEngine;
using UnityEngine.Events;
public class ReceiverScript : MonoBehaviour
{
[SerializeField]
[HideInInspector]
public UnityEvent messageEvent;
public void OnMessageReceived()
{
// 在这里编写处理消息的代码
}
}
2. メッセージを送信する必要があるスクリプトで、SendMessage() または SendMessageUpwards() メソッドを使用してメッセージを送信します。次に例を示します。
using UnityEngine;
public class SenderScript : MonoBehaviour
{
public void SendMessageToReceiver()
{
GameObject receiver = GameObject.Find("Receiver");
receiver.SendMessage("OnMessageReceived");
}
}
3. メッセージ受信スクリプトの GameObject に受信側コンポーネントを追加します。例:
using UnityEngine;
public class ReceiverScript : MonoBehaviour
{
[SerializeField]
[HideInInspector]
public UnityEvent messageEvent;
private void OnEnable()
{
messageEvent.AddListener(OnMessageReceived);
}
private void OnDisable()
{
messageEvent.RemoveListener(OnMessageReceived);
}
public void OnMessageReceived()
{
// 在这里编写处理消息的代码
}
}
この例では、レシーバー スクリプトにイベント (messageEvent) を追加し、OnEnable() メソッドにイベント リスナーを追加しました。これは、GameObject が有効になったときに OnMessageReceived() メソッドを呼び出します。OnDisable() メソッドでは、イベントからイベント リスナーを削除して、GameObject が無効になっているときにメソッドが呼び出されないようにしました。
次に、送信者スクリプトで SendMessage() メソッドを使用してメッセージを送信します。SendMessage() メソッドは、レシーバーの GameObject で「OnMessageReceived」という名前のメソッドを探して呼び出します。
これが、メッセージ システムを使用して Unity でスクリプト間の通信を実装する方法です。メッセージ システムを使用すると、コードの結合を減らし、スクリプトがより柔軟に連携できるようになります。
第 4 に、単一のインスタンスを使用して達成する
Unity では、シングルトン パターンを使用してスクリプト間の通信を実現できます。シングルトン パターンは、アプリケーション全体でインスタンスが 1 つだけであることを保証する設計パターンです。シングルトン パターンを使用すると、各スクリプトがシングルトン インスタンスに直接アクセスできるため、スクリプト間の通信がより簡単かつ便利になります。
シングルトン パターンを使用してスクリプト間の通信を実装する手順は次のとおりです。
1. シングルトン インスタンスを格納するためにシングルトンにする必要があるスクリプトに静的変数を追加し、それを Awake() メソッドで現在のインスタンスに割り当てます。例えば:
using UnityEngine;
public class SingletonScript : MonoBehaviour
{
private static SingletonScript _instance;
public static SingletonScript Instance
{
get {
return _instance; }
}
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(this.gameObject);
}
else
{
_instance = this;
}
}
// 在这里编写其他方法和属性
}
2. シングルトンにアクセスする必要がある他のスクリプトでは、SingletonScript.Instance を使用してシングルトン インスタンスにアクセスできます。次に例を示します。
using UnityEngine;
public class OtherScript : MonoBehaviour
{
private void Start()
{
SingletonScript singleton = SingletonScript.Instance;
if (singleton != null)
{
// 在这里访问单例的方法和属性
}
}
}
この例では、SingletonScript スクリプトに静的変数 (_instance) を追加して、シングルトン インスタンスを格納しました。Awake() メソッドでは、シングルトン インスタンスが既に存在するかどうかを確認し、存在する場合は現在のゲーム オブジェクトを破棄し、存在しない場合はそれを現在のインスタンスとして割り当てます。これにより、アプリケーション全体で SingletonScript のインスタンスが 1 つだけになることが保証されます。
SingletonScript インスタンスにアクセスする必要がある他のスクリプトでは、SingletonScript.Instance を使用してシングルトン インスタンスにアクセスできます。SingletonScript.Instance は静的プロパティであるため、どこからでもアクセスできます。
これは、シングルトン パターンを使用して Unity でスクリプト間の通信を実装する方法です。シングルトン パターンを使用すると、各スクリプトがシングルトン インスタンスに直接アクセスできるため、スクリプト間の通信がより便利でシンプルになります。
5. 変数またはメソッドを静的型として定義する
変数とメソッドを静的として定義すると、オブジェクトをインスタンス化せずにアプリケーション全体で使用できるようになります。これにより、コードが多少簡素化され、読みやすく保守しやすくなります。Unity では、静的変数とメソッドを使用して、スクリプト間でデータを通信および共有できます。
以下は、変数とメソッドを静的として定義する例です。
1. 静的変数
using UnityEngine;
public class StaticScript : MonoBehaviour
{
public static int score = 0;
// 在这里编写其他方法和属性
}
この例では、score 変数を静的として定義します。つまり、StaticScript オブジェクトをインスタンス化することなく、アプリケーション全体でアクセスできます。スコア変数は、StaticScript.score を介して他のスクリプトでアクセスできます。
2.静的メソッド
using UnityEngine;
public class StaticScript : MonoBehaviour
{
public static void PrintMessage(string message)
{
Debug.Log(message);
}
// 在这里编写其他方法和属性
}
この例では、PrintMessage() メソッドを静的として定義しました。つまり、StaticScript オブジェクトをインスタンス化することなく、アプリケーション全体でアクセスできます。PrintMessage() メソッドは、StaticScript.PrintMessage() を介して他のスクリプトから呼び出すことができます。
静的変数とメソッドを使用すると、アプリケーション全体でデータとメソッドを共有できるため、コードが単純になり、読みやすくなります。ただし、静的変数とメソッドは、グローバルな状態に影響を与える可能性があるため、コードのテストや保守がしにくくなる可能性もあります。したがって、静的変数とメソッドを使用する場合は、アプリケーションでの役割と影響を慎重に検討する必要があります。