Rigid Chips リファレンスマニュアル モデルデータ LUAブロック


目次へ戻る

■LUAブロック


ここではLUAブロック内で、組み込み言語「Lua」を用いてプログラムを作成するにあたり、Rigid Chips で特に有用と思われる事項について説明します。
「Lua」についての詳細な説明は、専門サイト等を参照して下さい。


◆値・型


型・値内容備考
nil
未定義値を表します。
変数が最初に宣言された(と見なされた)とき、nilが値として与えられます。
nilは他のどんな型とも異なる型として扱われます。

true
ブーリアン型として「真」であることを表します。

false
ブーリアン型として「偽」であることを表します。

数値 実数を表します。
【表記例】
3、-3.0、3.1416、314.16e-2、0.31416E1
"文字列"
’文字列’
文字列を表します。



◆変数・配列


予約語や関数以外の文字列は、変数として見なされます。
予約語や関数以外の文字列(英数字+アンダースコア"_"+ピリオド".")の後ろに鍵括弧"[ ]"で括ったインデックスを付加すると、配列として見なされます。
VALブロックにて宣言されている変数は、大文字記述で参照します。
値は現在保持されている値を参照します。
VALブロックにて最小値、最大値が宣言されている場合でも、値の補正はLUAブロックの処理が1サイクル終了する毎に行われるため、LUAブロックの途中では、宣言した範囲外の値を持つことがあります。
VALブロックにて宣言されていない変数は、LUAブロック内で値が保持され、グローバル変数・配列であれば、LUAブロックの処理が1サイクル終了した後も値は保持されます。(次の処理サイクルに値を引き継げます。)

書式内容備考
【宣言・参照・代入】
変数名=値
local 変数名=値
変数名1, 変数名2, ・・・=値1, 値2, ・・・
local 変数名1, 変数名2, ・・・=値1, 値2, ・・・
変数名には英数字とアンダースコア"_"、ピリオド"."を使用可能です。
プログラム中で最初に参照または代入が行われた場合、グローバル変数として宣言されたものと見なされます。
ローカル変数として宣言するには、変数名の前に「local」と記述します。
代入は左辺の項と右辺の項をそれぞれカンマ","で区切って記述することで、同時に複数の変数の代入を行うことが出来ます。
関数の引数として定義された変数は、その関数内部でのみ有効なローカル変数として扱われます。
forループのインデックス変数はforループ内部でのみ有効なローカル変数として扱われます。
ローカル変数は、宣言されたブロック内部でのみ参照可能となります。
異なる階層のブロックで同名のローカル変数が宣言されると、互いに別のローカル変数として見なされます。
【例】
x = 10 -- グローバル変数
do -- 新しいブロック
    local x = x -- 新しい変数 `x'、値は 10
    out(0, x) --> 10
    x = x+1
    do -- 別のブロック
        local x = x+1 -- 別の新しい `x'
        out(1, x) --> 12
    end
    out(2, x) --> 11
end
out(3, x) --> 10 (グローバル変数)
【宣言】
配列名={値1, 値2, ・・・}
local 配列名={値1, 値2, ・・・}

【参照・代入】
配列名[インデックス]=値
配列名1[インデックス]=配列名2
配列名には英数字とアンダースコア"_"、ピリオド"."を使用可能です。
プログラム中で最初に宣言が行われた場合、グローバル配列として宣言されたものと見なされます。
ローカル配列として宣言する場合は、配列名の前に「local」と記述します。
インデックスは、その配列要素が最初に参照または代入が行われた時点で定義されます。
インデックスには数値、文字列を使用することが出来、連続している必要はありません。
宣言時に初期値を指定した場合、インデックスは数値の「1」から順に格納されます。
多元配列を宣言する場合は「配列名1[インデックス]=配列名2」のように、上位の配列要素に下位の配列を代入することで実現できます。
【2次元配列の使用例】
function main()
    a0={}
    a1={}
    a2={}
    a0[0]=0
    a0[1]=1
    a0[2]=2
    a1[0]=10
    a1[1]=11
    a1[2]=12
    a2[0]=20
    a2[1]=21
    a2[2]=22
    b={}
    b[0]=a0
    b[1]=a1
    b[2]=a2
    out(0, b[0][0]) -- 0
    out(1, b[0][1]) -- 1
    out(2, b[0][2]) -- 2
    out(3, b[1][0]) -- 10
    out(4, b[1][1]) -- 11
    out(5, b[1][2]) -- 12
    out(6, b[2][0]) -- 20
    out(7, b[2][1]) -- 21
    out(8, b[2][2]) -- 22
end


◆制御構造


書式内容備考
function [関数名]([引数1], [引数2], ・・・)
    (関数の内容)
end
ユーザ関数の定義を行います。
関数名には英数字とアンダースコア"_"、ピリオド"."が使用できます。
引数は任意の個数を持つことが出来ますが、引数が無い場合でも、括弧"( )"は省略できません。
引数に用いた変数は、その関数の内部でのみ参照可能なローカル変数として扱われます。
またmain関数「function main() ・・・ end」は、Luaブロック内で必ず1つ定義しなければなりません。
Luaブロックで記述したプログラムは、main()関数から実行開始します。
return 戻り値1, 戻り値2, ・・・
関数の戻り値を定義します。
戻り値は、カンマ","で区切ることで複数指定することが出来ます。
【例】
function math.sgn_abs(val)
    if val<0 then r1=-1
    elseif val>0 then r1=1
    else r1=0
    end
    if val<0 then r2=-val
    else val>=0 then r2=val
    end
    return r1, r2
end

上記のような関数が定義されているとき、以下のように関数の呼び出しを行うと、変数valの符号と絶対値が返ります。

val_sgn, val_abs = math.sgn_abs(val)
if 条件式1 then
    命令1
    :
elseif 条件式2 then
    命令2
    :
else
    命令3
    :

end
条件式1が成立した場合(条件式1が真(=1)の場合)、命令1(群)を実行します。
条件式1が非成立でかつ条件式2が成立した場合、命令2(群)を実行します。
条件式1と条件式2の両方が非成立であった場合、命令3(群)を実行します。
elseifとelseの部分は必ずしも必要ではありません。
elseifの部分は、必要に応じて幾つでも増やすことが出来ます。
do
    命令
    :
end
命令(群)を実行します。
(do、endを省略した場合と同じです。)
"break"によって、doブロックを強制的に抜けることが出来ます。
while 条件式 do
    命令
    :
end
条件式が成立している(真である)限り、命令(群)を繰り返し(ループ)実行します。
条件式の成立判定は、命令(群)の実行前に毎回行われます。
whileループを強制的に抜けるには、"break"を用います。
repeat
    命令
    :
until 条件式 do
条件式が成立している(真である)限り、命令(群)を繰り返し(ループ)実行します。
条件式の成立判定は、命令(群)の実行後に毎回行われます。
repeatループを強制的に抜けるには、"break"を用います。
for インデックス変数 = 初期値, 終了値, 加算値 do
    命令
    :
end
初期値で始まり終了値で終わるまで、命令(群)が実行されます。
1回のループ実行が行われる毎に、インデックス変数の値に加算値が加算されます。
加算値を省略した場合は、「加算値=1」と見なされます。
ループの終了判定は、ループ実行前に1回のみ行われます。
forループを強制的に抜けるには、"break"を用います。
インデックス変数は、forループの内側でのみ参照することが出来ます。
ループ内部でインデックス変数に代入が行われると、挙動は未定義となります。
for インデックス変数1, インデックス変数2 in {値1, 値2, ・・・} do
    命令
    :
end
値1で始まり値のリストが終わるまで、命令(群)が実行されます。
1回のループ実行が行われる毎に、インデックス変数1は「1、2、・・・」と更新され、インデックス変数2は「値1、値2、・・・」と更新されます。
ループの終了判定は、ループ実行前に1回のみ行われます。
forループを強制的に抜けるには、"break"を用います。
インデックス変数は、forループの内側でのみ参照することが出来ます。
ループ内部でインデックス変数1に代入が行われると、挙動は未定義となります。
break
do、while、repeat、forブロックから強制的に抜けます。

out(行番号, 表示値, 表示値, ・・・) 画面左上の行番号で指定した行に、表示値で指定した文字列、または数値を表示します。
行番号=0〜24(上:0〜24:下)
表示値に文字列を指定する場合は、ダブルクォーテーション"文字列"で括ります。
文字列には半角カナや全角文字は使用できません。(表示されません。)
表示値には変数や関数を用いることが出来ます。
数値を表示する場合は、小数点以下第2位までが表示されます。
複数の表示値をつなげる場合は、各表示値をカンマ","で区切ってつなげます。
数値として解釈可能な文字列(例:"0.12")は、数値に変換されて表示されます。
行頭に半角"&"を付けると等幅フォントで表示されます。
--コメント文・・・[改行]
--[[コメント文(改行含む)・・・]]
マイナス符号2個以降から改行までは、コメント文と見なされます。
マイナス符号直後に左鍵括弧2個"[["を記述すると、右鍵括弧2個"]]"が現れるまでの全てのキャラクタがコメント文と見なされます。



◆数式


以下の演算子を用いて、四則演算や論理演算などの数式を記述出来ます。
なお、数式は括弧"( )"で括ると、括弧内を優先して計算します。

算術演算子意味
-A符号反転
A + B加算
A - B減算
A * B乗算
A / B除算
B=0だとエラーになります。
A ^ B累乗
AのB乗を求めます。

関係演算子意味
A == BAとBは等しい
A ~= BAとBは等しくない
A > BAはBより大きい
A < BAはBより小さい
A >= BAはB以上
A <= BAはB以下

論理演算子意味
A and BAかつB(論理積)
A or BAまたはB(論理和)
not AAでない(否定)

文字列演算子意味
A .. B文字列AとBの連結


◆関数


LUAブロック内では、SCRIPTブロック用の算術関数を使用することが出来ません。
LUAブロック内では、LUA固有の算術関数を使用します。
  1. 算術関数
  2. 関数名内容備考
    math.min(a, b, ・・・)最小値 引数として渡された変数リストの中で、最小の値を返します。
    math.max(a, b, ・・・)最大値 引数として渡された変数リストの中で、最大の値を返します。
    math.floor(値)切り捨て 値の小数点以下を切り捨てた値を返します。
    【例】math.floor(3.14)=3、math.floor(-3.14)=-4
    math.ceil(値)切り上げ 値の小数点以下を切り上げた値を返します。
    【例】math.ceil(3.14)=4、math.ceil(-3.14)=-3
    math.abs(値)絶対値 値の絶対値を返します。
    【例】math.abs(3.14)=3.14、math.abs(-3.14)=3.14
    math.sqrt(値)平方根 値の平方根(√)を返します。
    値が負の数の場合、"-1.#J"を返します。(演算不能)
    math.pi円周率 円周率π(≒3.1415927)の近似値を返します。
    math.sin(値)正弦 値に対する正弦(サイン:sin)を返します。
    値の単位はラジアンです。
    math.cos(値)余弦 値に対する余弦(コサイン:cos)を返します。
    値の単位はラジアンです。
    math.tan(値)正接 値に対する正接(タンジェント:tan)を返します。
    値の単位はラジアンです。
    math.asin(値)逆正弦 値に対する逆正弦(アークサイン:arcsin)を返します。
    得られる値の単位はラジアンです。
    【戻り値範囲】−π/2〜+π/2
    math.acos(値)逆余弦 値に対する逆余弦(アークコサイン:arccos)を返します。
    得られる値の単位はラジアンです。
    【戻り値範囲】0〜+π
    math.atan(値)逆正接 値に対する逆正接(アークタンジェント:arctan)を返します。
    得られる値の単位はラジアンです。
    【戻り値範囲】−π/2〜+π/2
    math.atan2(a, b)逆正接2 直交座標上の点(a, b)と原点を結ぶ線分が、a軸と成す角を返します。
    得られる値の単位はラジアンです。
    【戻り値範囲】−π〜+π
    なお、math.atan2(0, 0)=0となります。
    math.deg(rad)RADIAN→DEGREE変換 RADIAN値rad(ラジアン)をDEGREE値(度)に変換します。
    math.deg(rad) = rad * 180 / math.pi
    math.rad(deg)DEGREE→RADIAN変換 DEGREE値deg(度)をRADIAN値(ラジアン)に変換します。
    math.rad(deg) = deg * math.pi / 180
    math.mod(a, b)剰余 aの絶対値をbの絶対値で割ったときの余りを返します。
    符号はaの符号をそのまま返します。
    【例】math.mod(34,7)=6、math.mod(34.56,-7)=6.56、math.mod(-34,-7)=-6、math.mod(-34.56,7)=-6.56
    (厳密な定義でのModuloと同値ではありません。)
    math.pow(a, b)累乗 aのb乗を返します。("a ^ b" と同じ。)
    math.exp(a)指数 自然対数の底eのべき乗(eのa乗)を返します。
    【参考】e≒2.71828、math.exp(a)=math.pow(e, a)
    math.log(a)自然対数 底をeとするaの対数を返します。
    【参考】math.log(a)=bのとき、a=math.exp(b)の関係がある。
    math.log10(a)常用対数 底を10とするaの対数を返します。
    【参考】math.log10(a)=bのとき、a=math.pow(10, b)の関係がある。
             math.log10(a)=math.log(a)/math.log(10)
    math.ldexp(r, e)浮動小数点 実数rと2の整数e乗の乗算値を返します。
    【参考】戻り値a = r * 2 ^ e
    math.frexp(a)逆浮動小数点 実数aを小数部rと指数部eに分解します。
    戻り値は(r,e)となり、rは0.5以上1未満の小数となる。
    a=0の場合、(0,0)を返します。
    【参考】a = r * 2 ^ e
    math.random(a)乱数 0以上a未満の乱数を返します。
    aを省略した場合はa=1と見なされます。
    【参考】0〜100までの整数の乱数を得たい場合の数式:r=math.floor(math.random(101))
    math.randomseed(a)乱数初期化 実数aを種として、乱数列の初期化を行います。
    戻り値はnilとなります。

◆イベント関数


以下の関数は、システムで名前が予約された関数であり、関数を定義(記述)しておくと、特定のイベントが発生した際にコールされます。

関数名内容備考
function OnInit() ・・・ end初期化 初期化(Uキー押下)時にコールされます。
シナリオファイルをロードした際にもコールされます。
モデルリロード(ctrl+U押下)ではコールされません。
function OnReset() ・・・ endリセット リセット(Rキー押下)時にコールされます。
モデルリロード(ctrl+U押下)ではコールされません。
function OnFrame() ・・・ endフレーム 毎フレームの最初にコールされます。
main()と同じですが、main()関数より優先度が高く、本関数が記述されている場合はmain()関数はコールされません。


◆補足


LUAブロックでは、1フレーム毎に実行するプログラムを記述します。

LUAブロック内では英字に大文字・小文字の区別があります。

LUAブロックとSCRIPTブロックの両方が存在する場合、LUAブロックが優先的に処理され、SCRIPTブロックは無視されます。

LUAブロック内の処理が終了しないと、1フレームの処理が完了しないため、無限ループが発生するとRigidChips本体がハングアップします。

LUAブロック内で、SCRIPTブロック内で使用可能な「RigidChips固有関数」を呼び出すことが可能です。(一部制限あり)

LUAブロック内で、VALブロックにて宣言した「変数」を参照したり「変数」に代入する場合、また「RigidChips固有関数」を呼び出す場合は、大文字で記述します。
なお、RigidChips固有関数の引数に、name属性で定義した「チップ名」を用いる場合は、チップ番号を格納した数値変数として扱います。(チップ名は文字列ではありません。)

【例】

以下のRigidChips固有関数は、LUAブロック内では使用できません。

目次へ戻る