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