iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0

氣貫長虹


1. task函式

我們再看一次昨天最後的程式

while true do
    local R = math.random(0, 255)
    local G = math.random(0, 255)
    local B = math.random(0, 255)
    script.Parent.Color = Color3.fromRGB(R, G, B)
end

昨天說過,如果你直接把這串拿去運行,你的Roblox Studio會當機,這是為什麼呢? 其實這是因為,你的迴圈經過的次數太多,但程式卻沒有停下來等,導致電腦在上一個任務還沒執行完成前就急著去執行下一個任務 (也就是這個迴圈還沒跑完就先去跑下一個迴圈), 導致整個程式卡住了。

而解決的辦法也很簡單,我們只需要讓他等待就行,而如果想要執行像等待這類的指令,我們就需要使用一項特殊函式,也就task

task這項函式可以執行的功能有非常多,以下列出所有task中的子函式

spawn(函式或指令): 立即執行所給予的函式或指令,不受其他指令影響 (像是wait)
defer(函式或指令): 在當前執行緒完成後執行所給予的函式或指令 (意思就是會等上一行指令執行完後再執行),不受其他指令影響 (像是wait)
delay(數字, 函式或指令): 會在等待所給予的數字的秒數過後再執行所給予的函式或指令,該等待的秒數會在物理成象後計算,執行的函式或指令不受其他指令影響 (像是wait)
desynchronize(): 基本使用時與task.spawn的功能並無差異,詳細的使用方法會在後續單元講解
synchronize(): 基本使用時與task.spawn的功能並無差異,詳細的使用方法會在後續單元講解
wait(數字): 將程式暫停執行所給予的數字秒數
cancel(函式或指令): 取消所給予的函式或指令的執行,防止其恢復

其餘的功能我們真的很少使用到,但最常用到的功能是wait,上述提到wait這項函式可以暫停這個程式,也就是說,只要我們在迴圈裡讓他等待一下,迴圈就不會把整個Roblox Studio卡住了。

while true do
    task.wait(1) --讓他等待一秒再執行
    local R = math.random(0, 255)
    local G = math.random(0, 255)
    local B = math.random(0, 255)
    script.Parent.Color = Color3.fromRGB(R, G, B)
end

甚至說你也可以直接把等待放在迴圈條件裡

while task.wait(1) do --因為task.wait這項函式會執行,所以這項函式為是,所以迴圈會一直無限的執行
    local R = math.random(0, 255)
    local G = math.random(0, 255)
    local B = math.random(0, 255)
    script.Parent.Color = Color3.fromRGB(R, G, B)
end

甚至你可以連task都不寫

while wait(1) do
    local R = math.random(0, 255)
    local G = math.random(0, 255)
    local B = math.random(0, 255)
    script.Parent.Color = Color3.fromRGB(R, G, B)
end

不過要注意的是,task.wait()跟單純只用wait()這兩種是不一樣的,task.wait會直接執行,也就是說他不會受到遊戲的物理成像卡頓或玩家本身的網路問題而影響,但wait()就會

2. 陣列

其實這一Part應該要在第一章節,但想說昨天先提到了wait就只能先講task了,好不重要我們繼續

所謂的陣列,你可以把他想成可以放很多變數的變數,而陣列的寫法,在Lua語言中會長這樣:

local array = {我是變數一, 我是變數二, 我是變數三}

而當然你也可以直接定義一個空的陣列

local array = {}

然後再添加物件進去

local array = {}
table.insert(array, 1, "我是一個字串")

而你也可以提取陣列裡的東西來輸出

local array = {"我是一個字串", "我也是一個字串"}
print(array[1])
print(array[2])
--輸出為:
--我是一個字串
--我也是一個字串

值得注意的是,在Lua語言中,陣列的首位為第一位,與其他程式語言的第零位不同

或者你也可以添加物件到已經有東西的陣列裡

local array = {"我是一個字串", "我也是一個字串"}
table.insert(array, 2, "我還是一個字串") --在array這個陣列的第二項的位置添加一個物件

而這時已添加的物件就會取代上一個在這個位置的物件的位置,所以逐個將他們輸出就會像:

local array = {"我是一個字串", "我也是一個字串"}
table.insert(array, 2, "我還是一個字串")
print(array[1])
print(array[2])
print(array[3])
--輸出就像
--我是一個字串
--我還是一個字串
--我也是一個字串

當然,既然你能添加物件,你也可以移除物件

local array = {"我是一個字串", "我要假裝我不是字串"}
table.remove(array, 2) --移除array這個陣列裡在第二位的物件

我們在第一天有講過了,Lua語言中的陣列叫做table,而明天我們會繼續依照這個概念延伸,講解字典的用法以及要如何將陣列與for迴圈結合


上一篇
Day 5: 迴圈與各類數學函式
下一篇
Day 7: 字典與取得陣列內部子項目
系列文
透過Roblox Studio學習Lua語言與基本程式邏輯21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言