初学Unity,发现它和Android一样,没法在子线程中修改UI,甚至没法创建GameObject或者使用GameObject.Find()
于是又只有拐着弯去实现线程间通信。
我使用了一种方法,在这里记录一下,因为都是自己探索的,所以这个方法不一定所有情况都好用。
#情景
在一个房间列表界面,房间列表的内容是从服务器不断接收的,所以不得不为socket的接收创建一个子线程,接收到房间信息之后需要在UI上显示出来。
#方法
使用两个全局数据来维护房间信息
public static Dictionary<string, string> room_dictionary = new Dictionary<string, string>(); //维护房间信息
public static List<string> UI_room_list = new List<string>(); //子线程中维护,主线程查询,如果room没显示在UI上,则显示
public static string Room_OnUI_Flag = "OnUI"; //UI上已经显示房间
public static string Room_NotOn_UI_Flag = "OutUI"; //UI上未显示房间
其中room_dictionary记录现有房间信息,Key是房间名,Value是房间状态,UI_room_list记录UI界面上还未显示的房间。
当我们从服务器接受到新建房间的信息后,将房间名存入room_dictionary 并标记为Room_NotOn_UI_Flag。
这时在主线程中的Update()中,不断遍历查询room_dictionary中房间状态,将标记为Room_NotOn_UI_Flag状态的房间显示在UI上即可。但查询费时太多,会影响UI的帧率,所以多开一个线程专门查询,并将需要在UI上显示的房间放入UI_room_list中,Update()只需遍历这个list即可。
#总结
总而言之,就是利用信息维护为桥梁,不断查询某个信息池来传递信息。