线程中的Unity,全局事件,全局侦听器或GM.Find()

时间:2016-03-28 21:20:23

标签: c# multithreading events unity3d listener

我将Unity 5.3.4与C#一起使用。

我创建了一个全局套接字系统,允许我在整个游戏过程中保持连接。脚本(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?
}

1 个答案:

答案 0 :(得分: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(){ }
}

由于