創作內容

9 GP

Unity的多執行緒初步研究

作者:KK│2020-09-01 22:47:21│巴幣:18│人氣:2366

關鍵字也就是,Multi-Thread

遊戲開發中的多執行緒應用很多而且都很實用,

舉凡 AI、巡路、網路連線、開檔讀檔與其它 I/O 操作......等。

但!

在我學 Unity 時就聽過一句話,

Unity 是沒有多執行緒的!

在今天的初步研究後,這句話是對也是錯。

我們繼續看下去。


首先在一個全新的場景建立一個 Cube

接著我們拿一個簡單的腳本做研究,

( 折返跑、兩點巡邏、左右移動型平台......隨你喜歡的方式理解它。 )


在那個 Cube 上掛上這個腳本。


很單純的效果。

那麼,接著繼續進行下去。

這邊提一下,Unityscript 可以用兩種語言來寫,

一個是 C#、另一個是 Java Script

C# 中就有 Thread 可以使用囉,接著我們就是要用這個來取代 Update

首先記得 using 一下 System.Threading;



打到左括號時我們看一下,

3 種跟第 4 種一樣,只是多帶一個堆疊大小的參數,

此處先不要理會,用這兩種單純的就好。

ThreadStart.Net 的文件說明叫做代理人,

ParameterizedThreadStart 就是可以帶一個參數 object 的代理人,

這兩個是用來委派去執行其它方法的。

記住這個委派,後面會再補充。

那麼我就利用這個 Thread,把原本 Update 要做的是,委派給 Run 這個新的方法去執行。


這樣的改動應該還不到太複雜。

ThreadStartAbort 剛好就是一組,

請養成習慣讓它們成雙成對,就像 File OpenClose 一樣。

但很遺憾的,這樣的做法並不能如期執行。

還會拿到一個 Unity Error


這個 Error 講得很清楚了,

Unity 提供的 API ( UnityEngine、UnityEditor ) 只能在主執行緒中使用。

所以上面我想透過自己的執行緒 t 去不停跑 Run,以達到我讓物件左右移動的目標,

是不允許的!

要先了解不允許在哪,才知道下一步該怎麼做。

OK,物件移動的功能部分我就保留,讓它在主執行緒下進行。

但是位移的位置資訊,我要用另一個 Thread 去變化。

這聽起來很難懂?其實位置的資訊就是一個三維向量而已,

把上面 MoveObject 中的位置都用一個 Vector3 變數 lastPos 去接起來;

之後再讓掛這個腳本的物件在 Update 時把自己的 localPosition 去同步這個位置。

但,要讓兩個執行緒同步處理,你還需要一個 AutoResetEvent 這個函式,

並且搭配時間控管去實作執行緒等待的效果。


跑跑看,是一樣效果,動圖我就不貼了。

至此,實現了 Unity 中的多執行緒的練習。

所以 Unity 還是可以多執行緒的嘛!!

不過在所Unity API 都不能使用的方式下,

要想盡辦法繞路去使用多執行緒,我們真的要說這個做法是 OK 的嗎?

所以開頭才會說個似是而非的回答。

當然,就算不用 C#Thread 來玩多執行緒,

其實內建提供的 Coroutine 協程就可以實現類似的作法,

我們都戲稱這是假多執行緒,也是可以用就是了。

好了,讓我們回到委派,

你知道我聽到委派有多興奮嗎?你知道有多少好用的結構都是用委派寫的嗎?

只要知道這東西是委派,你之前用委派寫過的那些東西通通都能直接放上去。


void 能放上去,所有委派都能直接照著用,我們都是委派寫法!


另外補一個可帶餐數的 ThreadStart 寫法,

有注意到上面的參數都帶不同類型嗎?這些都是可以的,compile 會過喔!

因為這個參數是開 object

object 很好啊!什麼都能填進去!萬用!

一個沒有受限制參數的方法有多危險,多難找 Bug,等到哪天你痛了一次就知道了。

所以使用這個時要自己小心,

執行緒本身就是一個危險的東西,越好用的東西越危險。

那麼......我大致上了解多執行緒,以及在 Unity 上練習過了,

但這對做遊戲有什麼幫助啊?我能拿它做什麼?




在和平的村莊裡,鐵匠敲出第一把屠龍劍時,

全村的人都覺得那是沒用的東西。

有人拿來曬衣服,嫌這會刮破布料,

有人拿來切水果,嫌這又太過笨重,

只有你真正踏上旅程,展開你的冒險,

面對那些所有挑戰者都放棄的魔物時,

你就會知道什麼時候該用它了。




我每學一樣東西,我就多一樣裝備在手,

做遊戲的心情就會踏實一點,

從以前到現在,不曾變過;

這就是我學程式的初心。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4902622
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unity|多執行緒

留言共 2 篇留言

樂小呈
[e28][e28][e28]

09-01 22:55

KK
小呈太努力了,要繼續向你看齊[e12]09-01 22:57
矮鵝
雖然應該已經寫得很乾貨了,我覺得還是有點複雜...https://i.imgur.com/JfjFAii.gif

09-03 14:59

KK
沒關係,等之後整理完再發出來的東西應該比較實用,理論階段一律看看就好,人生更美好。[e35]09-03 15:20
我要留言提醒:您尚未登入,請先登入再留言

9喜歡★nigel0813 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:熱熱神作祟-開發日記20... 後一篇:LiteNetLib-連...

追蹤私訊切換新版閱覽

作品資料夾

e975483216天氣
天氣好熱R 甘霖老師看更多我要大聲說昨天22:54


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】