Lua の基礎

このページは、Lua をはじめて触る人向けの入門です。Lua スクリプトエフェクトで使える範囲に絞って、 言語そのものの書き方を学びます。エンジンは Lua 5.2 互換の MoonSharp です。 ファイル入出力やコルーチンなど一部の機能は使えません。詳しくは標準ライブラリを参照してください。

コメント

Lua のコメントは -- から行末までです。複数行コメントは --[[ から ]] までです。 コメントは実行に影響しません。なお、行頭の --track:--!native のような特定の書式は プラグインが解釈する指定子として扱われます。

書き方意味
-- text1 行コメント
--[[ text ]]複数行コメント

値と型

Lua の値には次の型があります。スクリプトでよく使うのは数値・文字列・真偽値・テーブルです。

説明
nilnil値が無いことを表す。未定義の変数も nil
booleantrue, false真偽値。条件分岐で使う
number10, 3.14, -0.5数値。内部は倍精度浮動小数点
string"hello", 'abc'文字列
table{1, 2, 3}配列や連想配列に使う唯一の構造体
functionfunction(x) return x end関数も値として扱える
条件式で「偽」とみなされるのは falsenil だけです。 0""(空文字列)も「真」です。これは C や JavaScript と違うので注意してください。

変数

変数は local を付けて宣言します。local を付けるとそのブロック内だけで有効な ローカル変数になります。付けないとグローバル変数になります。スクリプトでは原則 local を使ってください。

local a = 10
local b = 20
local sum = a + b
obj.x = sum

複数の変数を一度に宣言・代入できます。

local x, y = 100, 200
x, y = y, x
このエフェクトでは、グローバル変数の状態はフレーム間で保持されません。 毎フレーム独立に実行されるため、「前のフレームの値」を変数に貯めることはできません。

演算子

分類演算子
算術+ - * / %(剰余) ^(べき乗)
比較== ~=(等しくない) < > <= >=
論理and or not
連結..(文字列の連結)
長さ#(文字列やテーブルの長さ)

andor は値を返します。a and ba が偽なら a、 真なら b を返します。a or ba が真なら a、偽なら b を返します。 これを使うと既定値を簡潔に書けます。

local amp = obj.track0
local v = amp ~= 0 and amp or 50
obj.x = obj.x + v

このプラグインは、標準の Lua に無い記法(is not??・複合代入・範囲 for など)も追加しています。 詳しくは構文拡張を参照してください。

条件分岐

if obj.t < 0.5 then
    obj.alpha = 255
elseif obj.t < 0.8 then
    obj.alpha = 128
else
    obj.alpha = 0
end

三項演算子の代わりに and / or を使うのが定番です。

obj.alpha = obj.check0 and 255 or 0

繰り返し

数値 for

for 変数 = 開始, 終了 [, 増分] do ... end です。終了値も含みます。

local total = 0
for i = 1, 10 do
    total = total + i
end

ピクセル処理では 0 始まりで幅・高さ分ループするのが基本形です。

for y = 0, obj.h - 1 do
    for x = 0, obj.w - 1 do
        local r, g, b, a = obj.getpixel(x, y)
        obj.setpixel(x, y, 255 - r, g, b, a)
    end
end

汎用 for(ipairs / pairs)

配列を順に走査するなら ipairs を、すべてのキーを走査するなら pairs を使います。

local points = {10, 20, 30}
local sum = 0
for index, value in ipairs(points) do
    sum = sum + value
end

while と repeat

local i = 0
while i < 5 do
    i = i + 1
end

local j = 0
repeat
    j = j + 1
until j >= 5
ループの終了条件は必ず満たされるようにしてください。 無限ループになると 5 秒で実行が打ち切られ、そのフレームは描画されません。

関数

関数は function で定義します。スクリプト内で定義した関数は入力補完にも出ます。

local function ease(t)
    return t * t * (3 - 2 * t)
end

obj.alpha = ease(obj.t) * 255

複数の戻り値

Lua の関数は複数の値を返せます。anim.polar など多くの組み込み関数がこれを使います。

local function offset()
    return 10, -20
end

local dx, dy = offset()
obj.x = obj.x + dx
obj.y = obj.y + dy

可変長引数

local function sum(...)
    local total = 0
    for _, v in ipairs({...}) do
        total = total + v
    end
    return total
end

テーブル

テーブルは Lua で唯一の複合データ構造で、配列にも連想配列にも使えます。

配列として

local list = {5, 10, 15}
local first = list[1]
local count = #list
配列のインデックスは 1 始まりです。多くの言語と違って 0 ではありません。 ただし obj.getpixel(x, y) の座標や、数値 for を 0 から回す処理は別物です。 ピクセルデータプロキシのインデックスは 1 始まりです(ピクセル操作)。

連想配列として

local config = { speed = 90, radius = 100 }
obj.rz = time * config.speed

テーブル操作

table ライブラリで挿入・削除・連結・並べ替えができます。

local t = {}
table.insert(t, 1)
table.insert(t, 2)
table.sort(t)
local joined = table.concat(t, ",")

文字列

文字列は string ライブラリで整形・検索できます。連結は .. です。

local label = string.format("%.1f", obj.t)
local upper = string.upper("abc")
local n = string.len(label)

標準で使える数学関数

math ライブラリに基本的な数学関数があります。よく使うものだけ挙げます。

local r = math.sqrt(obj.x * obj.x + obj.y * obj.y)
local angle = math.atan2(obj.y, obj.x)
obj.rz = math.deg(angle)
obj.zoom = math.max(0.1, 1 + math.sin(time))

全関数の一覧は 標準ライブラリ を参照してください。 アニメーション向けの高度な補間や波・ノイズは anim ライブラリ にまとまっています。

このエフェクト特有の注意点

標準 Lua との違いとして、使える標準ライブラリの範囲、乱数の扱い、5 秒の実行時間制限などの制約があります。 これらは制限事項とトラブルにまとめています。

← 導入と使い方 標準ライブラリ →