Garry's Mod

Garry's Mod

Not enough ratings
【Lua】GLuaの基本
By さしみ/sashimi
Gmodで扱うプログラミング言語「Lua」について紹介します。
これは後々書く予定のエンティティ・ゲームモード等の作り方の説明の前に見ておいてください。
過酷な道のりになるかもしれないのでご注意ください。
はぁまた書くことなくなったよまったく、でもとりあえずなんか書いとけば概要の行の量でチラ見した人が圧倒されるだろうし大丈夫だろ()
   
Award
Favorite
Favorited
Unfavorite
1. そもそも
本当ならここ[wiki.facepunch.com]見れば早い話です。(説明放棄)
まあそれがいやなら基礎から学びましょう。
2. 変数
Luaの基本構文いきまーす。



そもそも変数とは
変数とは、何かしらの値を代入する箱のようなものです。
変数を使えるようにすることを変数の宣言(または変数の初期化)といいます。
さっそく変数の宣言方法を見てみましょう。
hensuu = 0
Luaではこれだけで宣言できます。
では解説します。まず左辺で変数を宣言して、右辺には初期値を入れます。
念のためですが、日本語名、数字で始まるものや後に出てくる特定のワードは入れないほうがいいでしょう。

宣言した変数はLuaのファイル内なら基本どこでも使えます。ただし、あまり他の範囲の同じ名前の変数と被らせたくなければ、ローカル変数を使うのをおすすめします。
local hensuu = 0
左辺の変数名の前にlocalをぶちこみます。これでローカル変数化しました。

変数のタイプ
変数には数値以外も入れられます。試しに文字列を入れてみましょう。
local mozi = "あああ"
文字列は、入れたい文字をダブルクオーテーション(")で囲むとできます。

真偽値というものもあります。これはいわゆるONかOFFかのスイッチみたいなものです。
local isOn = true
真偽値はfalseがOFF、trueがONと考えておいてください。

配列という、箱に複数のものが入るものだってあります。
local arr = {}
変数名の最後に[数値]をつけると、該当する番号の配列の要素を取得できます。
変数名の最初に#をつけることで配列の要素数を取得できます。
値の追加方法は後々紹介します。

値が「存在しない」or「有効ではない」ことを示す値があります。
local none = nil
nilは、以降でも重要になってくる値なので覚えておきましょう。



変数変更
初期化したきりではありません。変数は値を変えることもできるのです。
local num = 0 num = 1
この場合、宣言に使ったlocalはいりません。

変数に変数
こんなこともできます。
local str = "HELLO" local str2 = str
宣言した変数を右辺に使うこともできます。
3. 計算というか演算というかなんというか
四則演算や、ちょっと特殊な計算もできます。
local num = 5 * 3
numにはしっかり5x3が代入されます。残念ながら^で階乗とかはできません、多分。
注意点として、「*/+-より優先される」というルールはありません。

文字列を連結させる計算(?)もあります。
local str = "あいう" .. "えお"
..を使うと文字列を連結させれます。さらに、数値を文字列と連結することもできます、確か。確証はない。
local strblend = "あ" .. 0

変数交じりも可能です。
local a = 2 local b = a * 5



比較・論理演算
通常の計算とは違い、「~だったらtrue」という値を返す演算です。
真偽値を返すので変数に代入することができます。
local a = false local b = true local c = a && b local d = a || b local e = !a
この場合、cはfalseでdはtrue、eもtrueです。
&&は、ANDと言って二つ(もしくはそれ以上)の条件が両方ともtrueだったらtrueを返します。
||は、ORと言って二つ(もしくはそれ以上)の条件のどちらかがtrueだったらtrueを返します。
!は、NOTと言って一つの条件がfalseだったらtrue、つまり逆を返します。

比較について
local a = 5 local b = 5 local c = (a == b) local d = (a != b)
この場合、cはtrueでdはfalseです。
==は、二つの値が一致していればtrueを返し、!=はその逆を返します。

さらに、数値には
local a = 2 local b = 3 local c = (a < b) local d = (a > b) local e = (a <= b) local f = (a >= b)
という風に、大なり小なり以上以下を使うことができます。
cはtrue、dはfalseでeとfも同じです。
4. 関数
ここから難しくなってきます。
関数とは、まあなんか実行する命令みたいなものだと考えておけOKです。
はい。
説明に戻りますが、関数はfunctionというものを使って宣言します。
function a() local b = 100 end
書き方としては、
function 関数名(引数...) 処理... end
という感じになります。関数が呼び出される時にこのfunctionからendまでが実行されます。
引数とは、その関数を実行する際に与える値です。
変数のように使えますというかほぼ変数です。
あそうそう、書き忘れてましたが値は基本的に左辺ではなければ変数を初期化する時の右辺と同じなのでそこで計算したりそこに変数を入れたりできます。
引数入りの書き方↓
function Func(Arg) local a = Arg * 5 end
また、引数が複数ある場合はカンマ(,)で区切ります。
function Func(Arg1, Arg2) local a = Arg1 * Arg2 end

戻り値
戻り値とは、関数を呼び出して返ってきた値です。
returnというものを使います。
function Times(num, count) return num * count end
return以降の処理は実行されません。そのため、戻り値無しの関数でもreturnを使うことができます。
使う方法については後で言います。

関数の呼び出し
関数はこのように呼び出します。
function Func(arg) return arg * arg end Func(5)
Func(5)となっている部分で呼び出しています。この場合Func(5)は25を返します。
かっこの中に引数の値を入れます。



無名関数
匿名関数ともいいます。というかこっちの方が言う。
主に値として用いられます。
書き方は、
function () (処理) end
です。これで宣言することはできないので注意してください
コード例↓
function Func(func) func() func() end Func(function () local a = 5 * 4 end)
このコードは少し複雑ですが、「Funcという関数を呼び出すと、指定された関数を2回呼び出す」というものです。
匿名関数は変数にも入れられます(下参照)

関数タイプの変数
関数を変数に入れることもできます。
local func = function () local a = 0 end
その場合、呼び出しは
変数名(引数)
でできます。
5-1. 特殊な構文(条件分岐)
プログラミングやってればほぼ確実に知っているであろう条件分岐。
条件分岐とは、「もし~なら...する」といったものです。
ifというものを使います。
書き方:
if (真偽値) then 処理 end
thenをつけるのを忘れずに。かっこの中に真偽値を入れます。
これを使ってこんなコードができます。
function CheckOverFive(num) if (num > 5) then return 0 end return num end local a = CheckOverFive(6) local b = CheckOverFive(3)
CheckOverFiveは、指定された数値が5より大きかったら0、そうでなかったらその数値を返します。上の場合、aは0でbは3です。
条件分岐を使えば、複雑な処理ができたりします。

そうでなかったら
elseを使うと、ifの条件を満たさなかった場合の処理を書けます。
if (真偽値) then 満たした場合の処理 else 満たさなかった場合の処理 end
という感じに書きます。
例:
local a = 0 if (a > 1) then a = 2 else a = -2 end
この場合、aは条件を満たしていないので-2です。
注意:elseは絶対に最後に書いてください。

また、「そうでなくて~なら」というelseifもあります。
if (真偽値1) then 満たした場合の処理 elseif (真偽値2) then 真偽値1を満たさず、真偽値2を満たした場合の処理 end
thenを書くのを忘れずに。
local a = 0 if (a > 1) then a = 2 elseif (a == 0) then a = 1 else a = -2 end
この場合、aは1より大きくはありませんでしたが、aは0に等しかったので1です。
5-2. 特殊な構文(for繰り返し)
まれにこういうコードを書いている人を見そう。
local num = 0 function AddNum (a) num = num + a end AddNum(0) AddNum(1) AddNum(2) AddNum(3) AddNum(4)
非効率ですね、どうみても。
これを解消する方法。
それはforというものを使います。
forは繰り返しの処理をしてくれます。
for 変数=0, 回数 do 処理 end
このように書きます。(ちなみに変数はよくiが用いられます。)
変数には現在繰り返した回数が代入されます。
さっきのコードをforにまとめると、
local num = 0 function AddNum (a) num = num + a end for i=0, 5 do AddNum(i) end
と、かなりすっきりしました。



配列を使うならもっとすっきりできる
さっきから全然説明に出てこなくて影が薄い配列型変数くん(8)
今回はそんな彼が活躍できる場を用意しました。

配列の要素毎に処理をしたい時、
local nums = {1, 5, 4, 6, 3, 2} function All(list) local result = 0 for i=0, #list do result = result + list[0] end return result end local a = All(nums)
これでも処理はできるんですがちょっと書くのめんどくさいですよね。
そんな時はこれ!
local nums = {1, 5, 4, 6, 3, 2} function All(list) local result = 0 for k,v in pairs(list) do result = result + v end return result end local a = All(nums)
for文のところに注目
まずk,vですがこれはキーと値です、vの方が圧倒的に重要でkはほぼ使いません。
そしてin、これはvが配列の要素の一つであることを示しています。
最後にpairs、これはまあキーと値の配列を返す関数だと思っておいてください。
pairsを宣言する必要はありません。
はい、一気に言ってしまってすみません。これは自分でもよくわからないので覚えましょう。
for k,v in pairs(配列) do 処理 end
でも本当にこうすれば楽に配列要素ごとに処理ができるので便利です。
5-3. 特殊な構文(while、repeat等)
whileは、条件を満たしている間ずっと処理を繰り返す構文です。
while (真偽値) do 処理 end
これでヨシ!
あでも絶対にwhile (true)とかやんないでね、フリーズするか落ちるかするから。

repeatはwhileの逆で、条件を満たすまでずっと処理を繰り返す構文です。
開始時にすでに満たしていても一回は処理されるらしい。
repeat 処理 until (真偽値)
5-4. ループから抜けたいorループをやり直したい
ループから抜けたい時ってありますよね。
そんな時はぶち壊そう。
local a = 0 while (a < 4) do a = a + 1 if (a == 2) then break end end
breakは文字通りループをぶっ壊してくれます。
breakの後は処理されません。

ゲームでリセマラとかやるよね。
素早くリセットする方法があるんだ。
local a = 0 while (a < 6) do if (a == 2) then a = a + 2 continue end a = a + 1 end
continueはループをやり直します。
continueの後は処理されません。
6. クラス&イベント
(注意:本来のluaにはクラスやイベントという概念はないです。が、GLuaでは疑似的なクラスというものが出てくるので覚えておいてください。)

クラスとは、機械みたいなものです。そしてその機械の中には箱があったり、命令することができたりします。とどのつまりは、「変数や関数があるグループ」です。
クラスという概念は、いろいろなプログラミング言語で用いられているので、覚えておいて損はないはずです。

イベントとは、特定の場合に呼び出される関数です。例えば、「プレイヤーがスポーンしたら~関数を呼び出す」という感じです。
7. ビルドイン関数
Luaの中には、デフォルトで既にある関数があります。
これらをビルドイン関数といい、特に指定がなければどこでも呼び出せます。

重要系
Originally posted by 実在しないリアル人間:
Luaのビルドイン関数って面白いの多いよね (※この人は存在しません。)
それな

関数名
説明
tostring(e)
指定された値を文字列に変換します。
Originally posted by ガイド購読者:
さっき数値をそのまま文字列に変換してたよなぁ
あれできるんじゃねえの????
ほんとにすんません。
pairs
よくわからない謎の存在
print(e1, e2, ...)
コンソールにログを出力します。デバッグ段階だとソースコードに大量のprint関数がある。

数学系
なんかいろいろ計算します。

関数名
説明
math.sin(r) / math.cos(r) / math.tan(r)
サインとかコサインとか求められるSUGEEE関数。ご丁寧にタンジェントもある。
math.floor(x) / math.ceil(x)
切り捨て&切り上げする。
math.abs(x)
絶対値を求められる。
math.random([max[, min]])
ランダムな値が返ってくる。何も指定しないと0か1が返ってくる。maxのみ指定で1以上max以下、両方でmin以上max以下。

文字列系
文字列を操作します。

関数名
説明
string.len(str)
文字列の長さを求めます。#strでも代用できるらし。
string.upper(str) / string.lower(str)
大文字化、小文字化する。
string.reverse(str) / string.rep(str, n)
文字を反転したりn回繰り返したりする。
string.sub(str, i[, j])
i番目からj番目までの文字を取り出す。jを省略すると最後まで出す。iかjに負の値を指定すると最後の文字からになる。

配列系
配列を操作します。

関数名
説明
table.insert(t, [n,] v)
配列tのn番目にvをぶち込む。nが省略されたら最後になる。
table.remove(t, n)
tのn番目を消す。
8. コメント
なんでこれ一番最後に教えるんだろう。
というわけでコメントです。
「プログラムのこの部分にメモしたい!」なんて時に使えます。
--ここにコメント
--と書くと、その行のそこから右はすべてコメントになります。
if (a > 5) then a = a + 1 --いえーいここから自由にコメント書き放題!くぁwせdrftgyふじこlp;@:「 end

また、複数行にわたってコメントを書きたい場合は、
--[[ここにコメント ここにもコメント ここはセーフ]]ここはだめ
--[[と]]で囲めばできます。
if (a > 5) then --[[ さっきより書き放題だやったあああああああああああああああああああああああああああくぁwせdrftgyふじこlp;@:「おはうぇいさぶうぇい👈 ]] a = a + 1 end
9. おつかれ
ここまで理解するのに一時間以上かかったかもね。
でもこれはGmodでLuaを扱うためのベースに過ぎない。
いつか書くであろうゲームモードの作り方やエンティティの作り方でやっと本格的にプログラミングがはじまるのだ。
繰り返しになるけどここ見ておいてね
https://wiki.facepunch.com/gmod/
後々重要になるから。
1 Comments
Marumochi 3 Aug, 2021 @ 12:10am 
わかりやすいですねぇ