Unity脚本子线程修改UI的一种方式

本文介绍了一个初学者在Unity中遇到的问题:如何在子线程中更新UI。通过创建房间列表实例,详细解释了使用全局数据维护房间信息,实现在主线程与子线程间的通信,确保UI的稳定性和数据的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初学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即可。

#总结

总而言之,就是利用信息维护为桥梁,不断查询某个信息池来传递信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值