/*****************************
* Title:
* Date: 2022.11.01
* Author: 玄策
* UnityVersion: 2019.4.28
* Func: 線程里面不能調(diào)用主線程的東西饼问,需要用這個(gè)腳本
* 使用方法:在線程里面废恋,將主線程的東西注冊(cè)到一個(gè)Action里面抡爹,然后調(diào)用這個(gè)腳本Loom.QueueOnMainThread(Action action);
*
****************************/
using UnityEngine;
using System.Collections.Generic;
using System;
using System.Threading;
using System.Linq;
public class Loom : MonoBehaviour
{
//是否已經(jīng)初始化
static bool isInitialized;
private static Loom _ins;
public static Loom ins { get { Initialize(); return _ins; } }
void Awake()
{
_ins = this;
isInitialized = true;
}
//初始化
public static void Initialize()
{
if (!isInitialized)
{
if (!Application.isPlaying)
return;
isInitialized = true;
var obj = new GameObject("Loom");
_ins = obj.AddComponent<Loom>();
DontDestroyOnLoad(obj);
}
}
//單個(gè)執(zhí)行單元(無延遲)
struct NoDelayedQueueItem
{
public Action<object> action;
public object param;
}
//全部執(zhí)行列表(無延遲)
List<NoDelayedQueueItem> listNoDelayActions = new List<NoDelayedQueueItem>();
//單個(gè)執(zhí)行單元(有延遲)
struct DelayedQueueItem
{
public Action<object> action;
public object param;
public float time;
}
//全部執(zhí)行列表(有延遲)
List<DelayedQueueItem> listDelayedActions = new List<DelayedQueueItem>();
//加入到主線程執(zhí)行隊(duì)列(無延遲)
public static void QueueOnMainThread(Action<object> taction, object param)
{
QueueOnMainThread(taction, param, 0f);
}
//加入到主線程執(zhí)行隊(duì)列(有延遲)
public static void QueueOnMainThread(Action<object> action, object param, float time)
{
if (time != 0)
{
lock (ins.listDelayedActions)
{
ins.listDelayedActions.Add(new DelayedQueueItem { time = Time.time + time, action = action, param = param });
}
}
else
{
lock (ins.listNoDelayActions)
{
ins.listNoDelayActions.Add(new NoDelayedQueueItem { action = action, param = param });
}
}
}
//當(dāng)前執(zhí)行的無延時(shí)函數(shù)鏈
List<NoDelayedQueueItem> currentActions = new List<NoDelayedQueueItem>();
//當(dāng)前執(zhí)行的有延時(shí)函數(shù)鏈
List<DelayedQueueItem> currentDelayed = new List<DelayedQueueItem>();
void Update()
{
if (listNoDelayActions.Count > 0)
{
lock (listNoDelayActions)
{
currentActions.Clear();
currentActions.AddRange(listNoDelayActions);
listNoDelayActions.Clear();
}
for (int i = 0; i < currentActions.Count; i++)
{
currentActions[i].action(currentActions[i].param);
}
}
if (listDelayedActions.Count > 0)
{
lock (listDelayedActions)
{
currentDelayed.Clear();
currentDelayed.AddRange(listDelayedActions.Where(d => Time.time >= d.time));
for (int i = 0; i < currentDelayed.Count; i++)
{
listDelayedActions.Remove(currentDelayed[i]);
}
}
for (int i = 0; i < currentDelayed.Count; i++)
{
currentDelayed[i].action(currentDelayed[i].param);
}
}
}
void OnDisable()
{
if (_ins == this)
{
_ins = null;
}
}
}
Unity 在開啟的多線程里面調(diào)用主線程的東西
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門等浊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腮郊,“玉大人,你說我怎么就攤上這事筹燕≡桑” “怎么了衅鹿?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長过咬。 經(jīng)常有香客問我大渤,道長,這世上最難降的妖魔是什么掸绞? 我笑而不...
- 正文 為了忘掉前任泵三,我火速辦了婚禮,結(jié)果婚禮上衔掸,老公的妹妹穿的比我還像新娘切黔。我一直安慰自己,他們只是感情好具篇,可當(dāng)我...
- 文/花漫 我一把揭開白布纬霞。 她就那樣靜靜地躺著,像睡著了一般驱显。 火紅的嫁衣襯著肌膚如雪诗芜。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼销凑,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仅炊?” 一聲冷哼從身側(cè)響起斗幼,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抚垄,沒想到半個(gè)月后蜕窿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡呆馁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年桐经,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浙滤。...
- 正文 年R本政府宣布,位于F島的核電站盒卸,受9級(jí)特大地震影響骗爆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔽介,卻給世界環(huán)境...
- 文/蒙蒙 一摘投、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虹蓄,春花似錦犀呼、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至律胀,卻和暖如春宋光,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炭菌。 一陣腳步聲響...
- 正文 我出身青樓赘艳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親克握。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕾管,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 在我們需要頻繁地開啟子線程執(zhí)行操作的時(shí)候娇掏,我們可以采用開啟子線程runloop的方式迸磺蓿活子線程勋眯,這樣避免頻繁創(chuàng)建線...
- 本文主要舉例說明GCD里的死鎖場(chǎng)景,分析造成死鎖的原因以及解決方案 在開始說GCD死鎖之前婉烟,我們先了解一下GCD的...
- 成長記錄-連載(三十六) ——我的第一篇五千字長文,說了什么昙衅,你一定想不到 并不是不想每天寫公眾號(hào)扬霜,而是之前思考怎...
- 在收到服務(wù)器消息時(shí),有可能不是在主線程而涉,所以邏輯需要在主線程中調(diào)用才安全著瓶,這個(gè)類就是用來干這個(gè)事的 OnUpdat...