私はUnity 5.3.4をC#で使用します。スレッド内のUnity、グローバルイベント、グローバルリスナまたはGM.Find()
私はすべてのゲーム中に接続を維持できるグローバルソケットシステムを作成しました。スクリプト(ClientManager)は不滅のGameObject(DontDestroy付き)に置かれます。 最初のシーンはイニシャルです。
私が別のシーンにいるときだけ、私はGameObjectを見つける必要があります。 問題は、私のスクリプトがメインスレッドで実行されていないことです。だから私はできません。私はStart()
で検索を実行することができません。なぜなら、私は正しい場面にいないため、目的のGameObjectが存在しないからです。
すべてのシーンで共通のévennements異なるスクリプトを作成するか、メインスレッドでGameObject.Find()
を実行する必要があります。
リスナーのシステムを作成しました。また、検索したスクリプトにリスナーを追加することで、私の問題を解決することもできます。
これはどのようにするのですか?別の解決策がありますか?ここで
は私のスクリプトは、次のとおりです。
クライアントマネージャ:
public class ClientManager : MonoBehaviour, ClientListener {
private Client client;
public Client Client {
get { return client; }
}
void Start() {
this.client = new Client (this);
}
// ...
public void OnFriendDisconnected(string username, int id){
//...
}
public void OnFriendConnected(string username, int id){
//...
GameObject gm = GameObject.Find ("r_Slide_view");
if (gm != null)
gm.GetComponent<rslideController>().IsOnline(username);
}
public void OnReceiveMessage(string message){
//...
}
public void OnAuthenticated(){
//...
}
public void OnRejected(){
//...
}
public void OnDisconnected(){
//...
}
void OnLevelWasLoaded(int level) {
GameObject gm = GameObject.Find ("r_Slide_view"); // ERROR - Is not execute in the main thread
if (gm != null)
SlideController = gm.GetComponent<rslideController>();
}
}
リスナー:
public interface ClientListener {
void OnAuthenticated();
void OnRejected();
void OnDisconnected();
void OnFriendDisconnected(string username, int id);
void OnFriendConnected(string username, int id);
void OnReceiveMessage(string message);
}
rSlideController(検索スクリプト):
public class rslideController : MonoBehaviour {
// How to know when the methods are called?
}
、http://stackoverflow.com/a/36249404/294884 – Fattie