Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一、全局事件、全局侦听器或线程中的GM.Find()_C#_Multithreading_Events_Unity3d_Listener - Fatal编程技术网

C# 统一、全局事件、全局侦听器或线程中的GM.Find()

C# 统一、全局事件、全局侦听器或线程中的GM.Find(),c#,multithreading,events,unity3d,listener,C#,Multithreading,Events,Unity3d,Listener,我将Unity 5.3.4与C#一起使用 我已经创建了一个全球插座系统,允许我在整个游戏过程中保持连接。脚本(ClientManager)被放置在一个坚不可摧的游戏对象中(使用DontDestroy)。 这是第一幕 只是,当我在另一个场景中时,我需要找到一个游戏对象。 问题是我的脚本没有在主线程上执行。所以我不能。我无法在Start()中执行搜索,因为我不在正确的场景中,并且所需的游戏对象不存在 我需要在所有场景中创建一个通用的脚本,或者在主线程中执行我的GameObject.Find() 我创

我将Unity 5.3.4与C#一起使用

我已经创建了一个全球插座系统,允许我在整个游戏过程中保持连接。脚本(ClientManager)被放置在一个坚不可摧的游戏对象中(使用DontDestroy)。 这是第一幕

只是,当我在另一个场景中时,我需要找到一个游戏对象。 问题是我的脚本没有在主线程上执行。所以我不能。我无法在
Start()
中执行搜索,因为我不在正确的场景中,并且所需的游戏对象不存在

我需要在所有场景中创建一个通用的脚本,或者在主线程中执行我的
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>();
    }
}
rSlideController(搜索的脚本):


我通过在Client.cs中创建侦听器列表解决了问题。 像这样:

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);
    }
}
公共类客户端{
私有只读列表侦听器=null;
公共客户端(ClientListener){
this.listeners=新列表();
this.listeners.Add(listener);
//...
}
私有无效调用(){
foreach(此.listeners中的var listener){
listener.OnReceiveMessage(参数[0]);
}
}
//...
public void AddListener(ClientListener侦听器){
this.listeners.Add(listener);
}
公共void RemovelListener(ClientListener侦听器){
this.listeners.Remove(listener);
}
}
以及:

公共类rslideController:MonoBehavior,ClientListener{
私人客户;
//用于初始化
无效开始(){
this.client=GameObject.Find(“Manager”).GetComponent().client;
this.client.AddListener(this);
}
void OnDestroy(){
this.client.RemoveListener(this);
}
//...
public void OnFriendDisconnected(字符串用户名,int-id){}
public void OnFriendConnected(字符串用户名,int-id){}
公共无效OnReceiveMessage(字符串消息){}
已验证(){}上的公共无效
已拒绝()上的公共无效({}
public void OnDisconnected(){}
}
感谢谷歌人来到这里,
public class rslideController : MonoBehaviour {
   // How to know when the methods are called?
}
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(){ }
}