Итак, вы хотите изучить Lua? Давайте начнем с основ практически любого языка программирования.

Печатать, печатать, печатать, печатать

В программировании печать на самом деле не является печатью на принтере, а скорее отправкой оператора, который вы хотите, в окно вывода. Большинство языков, если не все, предоставляют вам встроенную функцию, которая поможет вам в этом. Это называется печатью. К сожалению, print() не печатает данные на ваш принтер, но работает примерно так же.

Ваш компьютер передает данные через функцию печати, чтобы облегчить печать.

Если вы запустите следующее в Roblox Studio, вы увидите строку под ним, показывающую результаты.

> print(42)
42
> print("Hello humans!")
"Hello humans!"

На Lua можно напечатать практически все, что угодно, и это полезно для отладки вашего кода. Вы также можете печатать переменные, таблицы и другие вещи.

Функции

Каждый хороший язык программирования позволяет создавать функции. Функции — это, по сути, способ запуска кода без необходимости переформулировать код снова и снова. Функция может быть записана как:

function name()
    -- code
end

Когда вы вызываете функцию, выполняется все, что находится внутри функции (между символом () и ключевым словом end). Чтобы вызвать (использовать) эту функцию, вы должны запустить:

name()

Если это все еще кажется вам сложным, продолжайте читать, и это, вероятно, будет иметь больше смысла.

Дай мне что-нибудь

Функции невероятно полезны для передачи информации. Посмотрите на эту функцию здесь:

function giveMeJuice()
    return "Juice"
end;

Когда вы вызываете giveMeJuice(), вы возвращаете строку «Juice». Ключевое слово return говорит компьютеру вернуть что-то тому, что вызвало функцию. Вы можете вернуть почти все, что захотите.

В конце концов, это можно сделать, выполнив команду giveMeJuice().

> print(giveMeJuice())
"Juice"

Никогда не забывайте скобки (()), с их помощью вы вызываете функцию.

Давайте поспорим!

В программировании споры — это не ссоры. Аргументы — это то, что вы передаете функции, чтобы она могла делать то, что ей нужно. Например,

function add(numberA, numberB)
    return numberA + numberB;
end

В этой функции параметры numberA и numberB. Вы можете думать об этом как о чем-то, что передается в функцию, чтобы вы могли что-то с этим делать.

Когда вы вызываете эту функцию, вы должны предоставить ей два аргумента: numberA и numberB вот так:

add(1, 1) -- printing this would tell you 2
add(2, 4) -- this would be 6 and so on

Вы бы поддержали свои данные. Вот классная часть, вы можете использовать add() внутри add():

add(add(1, 1), add(2, 2)) -- would result in add(2, 4) or 6.

Переменные

Вы можете думать о переменных как о ящике, в котором хранится что-то для вас. Переменная состоит из двух частей: имени и назначения. Итак, вы знаете, каким нынешним президентом США является Дональд Трамп? Вы можете создать переменную, содержащую имя нынешнего президента США, например:

local POTUS = "President Trump";

Сферы

Если вы играли в шутер от первого лица, вы, вероятно, видели прицел. В программировании прицелы — это не то, через что видят снайперы. В упрощенном виде области видимости — это мир, в котором живет переменная. Вы можете увидеть, как они работают ниже.

-- world one is out here
local POTUS = "emma"
function newPOTUS(name)
    -- there's a whole new world in here
    local POTUS = "john"
    POTUS = name
end
newPOTUS("elmo")
print(POTUS)

Этот блок кода напечатает «emma». Вам, наверное, интересно, почему он не напечатал «john». Я имею в виду, ведь мы изменили переменную POTUS, верно?
В том-то и дело, что мы не изменили переменную POTUS в первой области видимости, мы изменили ее во второй области видимости. Всякий раз, когда вы определяете функцию, вы создаете другую область видимости. Когда мы впервые определили POTUS, мы сделали это в нашей первой области видимости. Когда мы определили функцию newPotus, мы создали еще одну область внутри первой области.
В Lua вам разрешено создавать новую переменную с тем же именем из другой области. Когда вы присваиваете что-то переменной в этой области, как мы сделали с POTUS, вы присваиваете «ближайшей переменной».
Ближайшая переменная — это переменная, которая находится в текущей области с этим именем. Если переменной с таким именем нет, код ищет эту переменную в области, содержащей область, в которой произошло присвоение. Он продолжает работать, пока не найдет ее, если не найдет, то выдаст вам сообщение об ошибке, говорящее, что переменная не существует.

Код там можно исправить, не переопределяя переменную POTUS внутри функции, а вместо этого просто назначая имя переменной.

Петля де Петля

Цикл в Lua позволяет вам повторять что-то снова и снова. Каждый раз, когда это происходит, это называется итерацией. В Lua есть много типов циклов.

The Roblox Wiki довольно хорошо объясняет основные циклы.

Циклы могут делать действительно классные вещи. Допустим, вы хотите закрепить каждую часть в модели, но не знаете, как эти части называются и сколько их.

for index, part in pairs (workspace.Model:GetChildren()) do
    part.Anchored = true
end

Этот цикл for проходит по каждому дочернему элементу внутри модели и делает свойство Anchored равным true. Это может показаться запутанным, но рано или поздно вы поймете. Индекс относится к имени объекта. Эта часть похожа на переменную той части, на которой находится цикл.

Условные

Если бы у меня была часть

Что, если ваша Модель содержит и Части, и Скрипты, которые вы не хотите включать в свой цикл? В Lua есть нечто, называемое условным оператором. Вы знаете, что есть игры, в которых есть система магазинов, которая проверяет, сколько у вас денег, прежде чем покупать продукт? Эта система использует условные операторы, чтобы выяснить, может ли что-то произойти.

Ваш типичный условный оператор в Lua будет выглядеть так:

if something == something then
    -- do this
end

Английский перевод этого кода:

Если что-то равно чему-то, сделайте это

Условное утверждение — это что-то == что-то, что может оказаться истинным (да) или ложным (нет).

ключевое слово descriptionandThis проверяет, верны ли оба условия до и после. Если да, то возвращается true. Если одно из них ложно, то это возвращает false. orThis проверяет, является ли условие до и после условие истинным. Даже если одно из условий ложно, это возвращает true.

Вы помните нашу петлю раньше, верно? Вот как мы можем применить нашу новую концепцию к этому циклу. Наша цель — нацелиться на каждого ребенка внутри Модели под названием «HitMe», и она является ее частью. Следующий код перебирает каждого дочернего элемента и проверяет, действительно ли это то, что нам нужно. Если это не так, он движется дальше. Если бы это было то, что мы хотим, он запускает код между then … end.

for index, part in pairs (workspace.Model:GetChildren()) do
    if part:IsA("Part") and part.Name == "HitMe" then
        part.Anchored = true
    end
end

Вам интересно, почему я не сделал == true в первом условии? Это потому, что когда вы помещаете такую ​​функцию, и она возвращает логическое значение (true или false), вам это не нужно, поскольку это подразумевается само собой. Он автоматически проверяет, правда это или ложь.

Или еще!

Или еще что? В Lua вы также можете сделать что-то еще со своим условным оператором. Посмотрите на следующий фрагмент кода:

-- check if 2 + 2 is 3
if 2 + 2 == 3 then 
    print("my math is wrong") -- if it is 3, then print this
else
    print("2 plus 2 is not 3") -- if not, do something else like print this
end

Я думаю, вы достигли точки, когда вы можете понять, что делает этот код. Операторы Else создают пересечение для вашего кода. Вы понимаете, куда вы можете пойти, и именно туда вы идете. Что делать, если вы не можете пойти? Это означает, что вы переходите к следующему доступному варианту: иначе.

Что, если это не то, а это другое, но не то?

Какие? Ой! Я думаю, вы хотите использовать elseif. elseif позволяет проверить несколько вещей. Вот как можно использовать elseif.

if money > 1000 then
    title = "Legend"
elseif money > 500 then
    title = "Rich"
else
    title = "Broke"
end

Предполагая, что деньги и титул определены, у этого кода будет 3 места. Имейте в виду, что при выполнении подобных утверждений elseif вам нужно идти от наибольшего значения к наименьшему. Почему? Допустим, вы поменяли местами строку money > 500 и строку money > 1000. Если у игрока есть 2000 money, куда оно девается? Он переходит к первому условному выражению, в которое он может войти, которое равно money > 500, и поэтому он никогда не проверяет, превышает ли money 1000.

if money < 500 then
    title = "Broke"
elseif money >= 500 then
    title = "Rich"
else
    title = "Legend"
end

То же самое касается этого блока кода. Если у игрока более 1000 денег, он никогда не удосужится ввести оператор else, потому что деньги больше или равны 500.

События

Еще одна ключевая часть хорошего игрового процесса — использование событий. События — это в основном функции, которые вы можете настроить так, чтобы они запускались каждый раз, когда что-то происходит. В Roblox доступно бесчисленное количество событий. Большинство событий форматируются следующим образом:

Event:Connect(function(parametersPassedThroughTheEvent)
end

То, что делает приведенный выше код, в основном «подключает» функцию к событию, поэтому каждый раз, когда запускается событие, функция запускается.

Одним из наиболее часто используемых событий является событие PlayerAdded. Как вы можете догадаться, это событие запускается (вызывается) каждый раз, когда игрок присоединяется к игре. Это событие также передает параметр функции, которая содержит объектplayer, представляющий игрока, присоединившегося к игре. Подробнее о том, как использовать события, можно прочитать здесь на Wiki.

Вывод

При программировании на Lua нужно начинать с основ. Когда я только начинал, Вики была не очень полезной и не содержала столько руководств и объяснений, как сейчас. Я учился, вставляя бесплатные модели в свои игры, чтобы понять, как они работают. В конце концов, код, который вы видите, не является тарабарщиной, а скорее похож на другой язык, который вы понимаете.

Если вы хотите узнать больше, посетите Wiki. У вас есть предложения по следующему посту, о которых вы хотели бы узнать больше? Напишите мне на мою электронную почту (at) suufi.xyz или твитните мне @Qxest_.