2016-03-28 28 views
0

C# ile Unity 5.3.4 kullanıyorum.Birlik, Global Olay, Global Dinleyici veya GM.Find() İş parçacığı içinde

Tüm oyun sırasında bağlantıda kalmama izin veren bir genel soket sistemi oluşturdum. Komut dosyası (ClientManager), yıkılmaz bir GameObject'e (DontDestroy ile) yerleştirilir. Bu ilk sahne oldu.

Yalnızca başka bir sahnedeyken bir GameObject bulmam gerekecek. Sorun, komut dizimin ana iş parçacığı üzerinde yürütülmesi değil. Bu yüzden yapamam. Aramımı Start()'da yürütemiyorum çünkü doğru sahnede değilim ve istenen GameObject mevcut değil.

Tüm sahnelerde genel bir évennements farklı komut dosyası oluşturmalı veya ardından ana iş parçacığımda GameObject.Find() numaralı arabamı çalıştırmam gerekir.

Bir dinleyici sistemi oluşturdum. Sorgularımın aranan bir dinleyiciye eklenmesiyle de çözebilirim ...

Bunu nasıl yapacağınızı biliyor musunuz? Başka bir çözüm var mı?

Müşteri Yöneticisi:

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>(); 
    } 
} 

Dinleyici: Burada

benim komut dosyaları ben benim sorun çözüldü

public class rslideController : MonoBehaviour { 
    // How to know when the methods are called? 
} 
+0

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

cevap

0

:

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 (aranan script)

Crea Client.cs sayfamda bir Dinleyici listesi ting.

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); 
    } 
} 

Ve: Bunun gibi

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(){ } 
} 

Teşekkür buraya Google'cuların için