我将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?
}
答案 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(){ }
}
由于