Unity指令碼子執行緒修改UI的一種方式

2021-10-05 02:23:18 字數 933 閱讀 1530

初學unity,發現它和android一樣,沒法在子執行緒中修改ui,甚至沒法建立gameobject或者使用gameobject.find()

於是又只有拐著彎去實現執行緒間通訊。

我使用了一種方法,在這裡記錄一下,因為都是自己探索的,所以這個方法不一定所有情況都好用。

在乙個房間列表介面,房間列表的內容是從伺服器不斷接收的,所以不得不為socket的接收建立乙個子執行緒,接收到房間資訊之後需要在ui上顯示出來。

使用兩個全域性資料來維護房間資訊

public static dictionaryroom_dictionary = new dictionary();  //維護房間資訊

public static listui_room_list = new list(); //子執行緒中維護,主線程查詢,如果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即可。

總而言之,就是利用資訊維護為橋梁,不斷查詢某個資訊池來傳遞資訊。

Qthread執行緒修改UI

from pyqt5.qtcore import from pyqt5.qtgui import from pyqt5.qtwidgets import import time 訊號傳參型別 pyqtsignal 無引數訊號 pyqtsignal int 乙個引數 整數 的訊號 pyqtsignal...

C Wpf非同步修改UI,多執行緒修改UI(二)

1.使用定時器非同步修改 這是相對比較簡單的方法 在wpf中定時器使用diapatchertimer,不使用timer原因 在乙個應用程式中,timer會重複生成time事件,而dispatchertimer是乙個整合到了dispatcher佇列中的時鐘,這可以使它被按照指定的時間間隔以指定的pri...

跨執行緒修改UI控制項

1.直接修改,失敗引發異常.namespace test private void setlabeltext private void btnvisitlabel click object sender,eventargs e 2.使用 呼叫ui控制項的invoke方法修改,成功.namespace...