2016-03-28 11 views
0

私は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? 
} 
+0

、http://stackoverflow.com/a/36249404/294884 – Fattie

答えて

0

私はで私の問題を解決しましたクレアClient.cs内のListenerリストを参照してください。

public class Client { 
    private readonly List<ClientListener> listeners = null; 

    public Client(ClientListener listener){ 
     this.listeners = new List<ClientListener>(); 
     this.listeners.Add(listener); 
     //... 
    } 

    private void Call(){ 
     foreach (var listener in this.listeners) { 
      listener.OnReceiveMessage (parameters [0]); 
     } 
    } 

    //... 

    public void AddListener(ClientListener listener){ 
     this.listeners.Add (listener); 
    } 
    public void RemoveListener(ClientListener listener){ 
     this.listeners.Remove (listener); 
    } 
} 

そして:このよう

public class rslideController : MonoBehaviour, ClientListener { 

    private Client client; 

    // Use this for initialization 
    void Start() { 
     this.client = GameObject.Find ("Manager").GetComponent<ClientManager>().Client; 
     this.client.AddListener (this); 
    } 

    void OnDestroy() { 
     this.client.RemoveListener (this); 
    } 

    //... 

    public void OnFriendDisconnected(string username, int id){ } 
    public void OnFriendConnected(string username, int id){ } 
    public void OnReceiveMessage(string message){ } 
    public void OnAuthenticated(){ } 
    public void OnRejected(){ } 
    public void OnDisconnected(){ } 
} 

おかげで、ここまでのGooglerのため

関連する問題