この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 最新リビジョン 両方とも次のリビジョン | ||
vci:script:luatutorial [2021/04/08 20:59] Ramen [5.number型の扱いと結合] |
vci:script:luatutorial [2023/10/04 18:34] pastatto リファレンスページのURL変更 |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
====== Luaのチュートリアル (VCIスクリプト) ====== | ====== Luaのチュートリアル (VCIスクリプト) ====== | ||
- | Luaの基本的なプログラミングのチュートリアルになります。\\ | + | Luaの基本的なプログラミングのチュートリアルになります。 |
- | このチュートリアルは**VCIの作成とVCIスクリプトの導入まで終わったユーザー向け**のものです。終わっていない方は、まずはそちらを終了させてください。\\ | + | |
- | \\ | + | |
- | ※VCIスクリプトの記述にはLuaというスクリプト言語を使用します。\\ | + | |
- | ([[https://ja.wikipedia.org/wiki/Lua|Lua - wikipedia]])\\ | + | |
- | ---- | + | このチュートリアルは**VCIの作成とVCIスクリプトの導入まで終わったユーザー向け**のものです。終わっていない方は、まずはそちらを終了させてください。 |
- | ===== チュートリアルの準備 ===== | + | ※VCIスクリプトの記述にはLuaというスクリプト言語を使用します。 |
- | こちらのチュートリアルをはじめる前に、\\ | + | ([[https://ja.wikipedia.org/wiki/Lua|Lua - wikipedia]]) |
- | [[vci:beginner|[ガイド]初めてVCIを作成する]] の**[開発環境の導入から、アイテム作成・実行まで]**を終えてください。\\ | + | |
- | 必要な環境構築や基本的な手順について、このページでは説明しません。\\ | + | |
- | ---- | + | ===== チュートリアルの準備 ===== |
+ | こちらのチュートリアルをはじめる前に、 | ||
+ | [[vci:beginner|[ガイド]初めてVCIを作成する]] の**[開発環境の導入から、アイテム作成・実行まで]**を終えてください。 | ||
- | ===== チュートリアル一覧 ===== | + | 必要な環境構築や基本的な手順について、このページでは説明しません。 |
- | Luaを使ったプログラミングを俯瞰する為の基本的なチュートリアルになります。\\ | + | ===== チュートリアル一覧 ===== |
- | Luaの基本を把握した上で [[vci:script:reference|VCIスクリプトリファレンス]] を参考にしていただけると、VCIで様々な事ができるかと思います。\\ | + | Luaを使ったプログラミングを俯瞰する為の基本的なチュートリアルになります。 |
- | + | ||
- | ---- | + | |
+ | Luaの基本を把握した上で [[https://developer.virtualcast.jp/vci-docs/api/|VCIスクリプトリファレンス]] を参考にしていただけると、VCIで様々な事ができるかと思います。 | ||
==== 1.Luaのコメントについて ==== | ==== 1.Luaのコメントについて ==== | ||
ライン 38: | ライン 33: | ||
コメントとはプログラム本体には含まれない文章です。\\ | コメントとはプログラム本体には含まれない文章です。\\ | ||
1行のコメントはハイフンを2つ繋げた後の文字がコメントになります。\\ | 1行のコメントはハイフンを2つ繋げた後の文字がコメントになります。\\ | ||
- | 複数行のコメントはカッコで囲まれた部分が全てコメントになります。\\ | + | 複数行のコメントはカッコで囲まれた部分が全てコメントになります。 |
- | ---- | ||
==== 2.コンソールに文字列を表示する ==== | ==== 2.コンソールに文字列を表示する ==== | ||
ライン 68: | ライン 62: | ||
print() のカッコの中に文字列を入れる事で、Consoleに文字を表示します。\\ | print() のカッコの中に文字列を入れる事で、Consoleに文字を表示します。\\ | ||
**文字列を使う時は文字列の範囲を""(ダブルクォーテーション)で囲います。 ※1**\\ | **文字列を使う時は文字列の範囲を""(ダブルクォーテーション)で囲います。 ※1**\\ | ||
- | また、数字が代入されてる変数は自動で文字列に変換されてprintで出力されます。\\ | + | また、数字が代入されてる変数は自動で文字列に変換されてprintで出力されます。 |
- | \\ | + | |
- | ※1 ""をつける事で、文字列なのか変数なのか区別をつける事ができます。\\ | + | ※1 ""をつける事で、文字列なのか変数なのか区別をつける事ができます。 |
- | ---- | + | <wrap notice right>⇒ [[vci/script/console]]</wrap>\\ |
==== 3.変数と型 ==== | ==== 3.変数と型 ==== | ||
ライン 101: | ライン 95: | ||
なので、変数宣言時に型を宣言する必要はなく、変数のみ宣言し代入演算子で直接データを代入できます。\\ | なので、変数宣言時に型を宣言する必要はなく、変数のみ宣言し代入演算子で直接データを代入できます。\\ | ||
全ての型を知りたい場合はLua公式ドキュメントをご確認ください。([[http://milkpot.sakura.ne.jp/lua/lua52_manual_ja.html#2.1|値と型]]) | 全ての型を知りたい場合はLua公式ドキュメントをご確認ください。([[http://milkpot.sakura.ne.jp/lua/lua52_manual_ja.html#2.1|値と型]]) | ||
- | |||
- | ---- | ||
==== 4.変数のスコープ ==== | ==== 4.変数のスコープ ==== | ||
ライン 112: | ライン 104: | ||
print("Grab : "..GranCount) | print("Grab : "..GranCount) | ||
| | ||
- | --掴んでる回数が3の倍数か判定 | + | --つかんでる回数が3の倍数か判定 |
local num = GranCount % 3 | local num = GranCount % 3 | ||
if num == 0 then | if num == 0 then | ||
ライン 138: | ライン 130: | ||
(''local'' が無ければグローバル変数として扱う)\\ | (''local'' が無ければグローバル変数として扱う)\\ | ||
上記のサンプルの場合 ''GranCount'' はどこからでも呼べます。 | 上記のサンプルの場合 ''GranCount'' はどこからでも呼べます。 | ||
- | \\ | ||
- | ''local'' を付けた場合は ''local'' を宣言した関数の中でしかアクセスできません。\\ | ||
- | 上記のサンプルの場合 ''num'' にアクセスできるのは ''onGrab()'' の中だけです。\\ | ||
- | ---- | + | ''local'' を付けた場合は ''local'' を宣言した関数の中でしかアクセスできません。\\ |
+ | 上記のサンプルの場合 ''num'' にアクセスできるのは ''onGrab()'' の中だけです。 | ||
==== 5.number型の扱いと結合 ==== | ==== 5.number型の扱いと結合 ==== | ||
ライン 218: | ライン 208: | ||
べき乗32 | べき乗32 | ||
</code> | </code> | ||
- | |||
- | ---- | ||
==== 6.テーブル型 ==== | ==== 6.テーブル型 ==== | ||
ライン 278: | ライン 266: | ||
キーと値をセットで保持する事で連想配列のように使う事もできます。\\ | キーと値をセットで保持する事で連想配列のように使う事もできます。\\ | ||
宣言する時は ''キー = 値'' という風に宣言し、コロンで区切って宣言してゆきます。\\ | 宣言する時は ''キー = 値'' という風に宣言し、コロンで区切って宣言してゆきます。\\ | ||
- | アクセスする場合は、上記のようにカッコの中にキーを文字列で指定してアクセスするか、配列名.キー名 という風にピリオドで区切ってアクセスするかの二通りのパターンがあります。\\ | + | アクセスする場合は、上記のようにカッコの中にキーを文字列で指定してアクセスするか、配列名.キー名 という風にピリオドで区切ってアクセスするかの二通りのパターンがあります。 |
- | + | ||
- | ---- | + | |
==== 7.if文 ==== | ==== 7.if文 ==== | ||
ライン 300: | ライン 286: | ||
これらの演算子を使う事である程度の複雑さなら条件として記述できます。\\ | これらの演算子を使う事である程度の複雑さなら条件として記述できます。\\ | ||
[[http://milkpot.sakura.ne.jp/lua/lua52_manual_ja.html#3.3.4|制御構造]] | [[http://milkpot.sakura.ne.jp/lua/lua52_manual_ja.html#3.3.4|制御構造]] | ||
- | |||
- | ---- | ||
==== 8.for文 while文 ==== | ==== 8.for文 while文 ==== | ||
ライン 352: | ライン 336: | ||
while文の中で条件から抜け出す処理を書かないと無限ループするので注意しましょう。\\ | while文の中で条件から抜け出す処理を書かないと無限ループするので注意しましょう。\\ | ||
[[http://milkpot.sakura.ne.jp/lua/lua53_manual_ja.html#3.3.4|制御構造]] | [[http://milkpot.sakura.ne.jp/lua/lua53_manual_ja.html#3.3.4|制御構造]] | ||
- | |||
- | ---- | ||
==== 9.イベント関数を使う ==== | ==== 9.イベント関数を使う ==== | ||
ライン 359: | ライン 341: | ||
<file lua main.lua> | <file lua main.lua> | ||
function onGrab(target) | function onGrab(target) | ||
- | print(target.."を掴みました") | + | print(target.."をつかみました") |
end | end | ||
ライン 367: | ライン 349: | ||
function onUse(use) | function onUse(use) | ||
- | print(use.."を掴んだ状態でグリップボタンが押されました") | + | print(use.."をつかんだ状態で使用されました") |
end | end | ||
ライン 387: | ライン 369: | ||
</file> | </file> | ||
- | VCIを掴んだ時、離した時、グリップした時、触れた時、離れた時等…\\ | + | VCIをつかんだ時、離した時、使った時、触れた時、離れた時等…\\ |
- | VCIを使ってる状態を条件にして実行する関数を [[vci:script:reference:eventfunction|イベント関数]] といいます。\\ | + | VCIを使ってる状態を条件にして実行する関数を [[https://developer.virtualcast.jp/vci-docs/api/events/index.html|イベント関数]] といいます。 |
- | \\ | + | |
また、イベント関数には**引数**を設定できます。\\ | また、イベント関数には**引数**を設定できます。\\ | ||
引数とは、**関数が情報を受け取る仕組み**です。\\ | 引数とは、**関数が情報を受け取る仕組み**です。\\ | ||
イベント関数の場合は **SubItemのgameobject名が引数に渡される** という決まりがあります。\\ | イベント関数の場合は **SubItemのgameobject名が引数に渡される** という決まりがあります。\\ | ||
- | イベント関数でSubitemの名前が受け取れると何がいいのか?といいますと… ''function onGrab(target)'' の ''target'' の文字列を見る事で、**どのSubitemを掴んだのか?**を知る事ができます。\\ | + | イベント関数でSubitemの名前が受け取れると何がいいのか?といいますと… ''function onGrab(target)'' の ''target'' の文字列を見る事で、**どのSubitemをつかんだのか?**を知る事ができます。\\ |
- | 掴んだアイテム名を知る事ができるので、そのアイテムに対して処理が施せるわけです。\\ | + | つかんだアイテム名を知る事ができるので、そのアイテムに対して処理が施せるわけです。 |
- | \\ | + | |
- | (引数…例えば、所持金に対して、買えるジュースの本数を計算関数があるとします。この場合、関数を実行するのに所持金を知る必要があります。この所持金が引数にあたります。)\\ | + | |
- | \\ | + | |
- | また、イベント関数の一覧は[EmbeddedScriptWorkspace]フォルダ内の[template.lua]にも書かれています。\\ | + | |
- | ---- | + | (引数…例えば、所持金に対して、買えるジュースの本数を計算関数があるとします。この場合、関数を実行するのに所持金を知る必要があります。この所持金が引数にあたります。) |
+ | |||
+ | また、イベント関数の一覧は[EmbeddedScriptWorkspace]フォルダ内の[template.lua]にも書かれています。 | ||
==== 10.関数を自作する ==== | ==== 10.関数を自作する ==== | ||
ライン 420: | ライン 400: | ||
関数は自作する事ができます。\\ | 関数は自作する事ができます。\\ | ||
作成する場合は ''function 任意の関数名()'' で宣言し…関数の処理を書いて ''end'' で囲います。\\ | 作成する場合は ''function 任意の関数名()'' で宣言し…関数の処理を書いて ''end'' で囲います。\\ | ||
- | 関数を実行する時は [[vci:script:reference:eventfunction|イベント関数]] の中で ''作成した関数名()'' と書く事で実行できます。\\ | + | 関数を実行する時は [[https://developer.virtualcast.jp/vci-docs/api/events/index.html|イベント関数]] の中で ''作成した関数名()'' と書く事で実行できます。\\ |
- | VCIスクリプトでは自作の関数はイベント関数を経由して実行します。\\ | + | VCIスクリプトでは自作の関数はイベント関数を経由して実行します。 |
- | + | ||
- | ---- | + | |
==== 11.関数の引数と戻り値 ==== | ==== 11.関数の引数と戻り値 ==== | ||
- | {{ :モデル作成:vci作成:function.png?direct&200 |}} | + | {{vci:script:function.png?direct&200|}} |
関数とは、ある入力に対して処理を行い、その結果を返してくれます。 | 関数とは、ある入力に対して処理を行い、その結果を返してくれます。 | ||
ライン 437: | ライン 415: | ||
function ShowPosition(target) | function ShowPosition(target) | ||
- | local pos = vci.assets.GetSubItem(target).GetPosition() | + | local pos = vci.assets.GetTransform(target).GetPosition() |
local posc = tostring(pos) | local posc = tostring(pos) | ||
local message = target.."の現在位置は"..posc.."です" | local message = target.."の現在位置は"..posc.."です" | ||
ライン 453: | ライン 431: | ||
引数は ''function 関数名(引数)'' で定義され、戻り値は ''return 戻り値'' で定義されます。\\ | 引数は ''function 関数名(引数)'' で定義され、戻り値は ''return 戻り値'' で定義されます。\\ | ||
上記のサンプルでは ''ShowPosition()'' 関数は引数に ''target'' を使用し、戻値は ''message'' になります。\\ | 上記のサンプルでは ''ShowPosition()'' 関数は引数に ''target'' を使用し、戻値は ''message'' になります。\\ | ||
- | ''target''に引数としてSubitemの名前を渡してあげれば、''message'' に現在地の情報が代入され、結果として現在地を取得できます。\\ | + | ''target''に引数としてSubitemの名前を渡してあげれば、''message'' に現在地の情報が代入され、結果として現在地を取得できます。 |
- | \\ | + | |
このような方法で関数を設定するメリットは以下の通りになります。\\ | このような方法で関数を設定するメリットは以下の通りになります。\\ | ||
* 関数の処理内容が分からなくても、引数と戻り値さえ理解すれば色々な結果を得る事ができる。\\ | * 関数の処理内容が分からなくても、引数と戻り値さえ理解すれば色々な結果を得る事ができる。\\ | ||
* 似たような処理を繰り返し使う場合、関数を呼び出すだけで済んでしまう。(再利用性)\\ | * 似たような処理を繰り返し使う場合、関数を呼び出すだけで済んでしまう。(再利用性)\\ | ||
- | * 他の人がプログラムを見た時の可読性を上げる事ができる。\\ | + | * 他の人がプログラムを見た時の可読性を上げる事ができる。 |
- | ---- | ||
==== 12.Luaのライブラリを使おう ==== | ==== 12.Luaのライブラリを使おう ==== | ||
ライン 493: | ライン 470: | ||
これらの機能を組み合わせて使いこなす事で、様々な処理を実現する事が可能です。\\ | これらの機能を組み合わせて使いこなす事で、様々な処理を実現する事が可能です。\\ | ||
例えば、アナログ時計など作る場合は ''os.date()'' によって得られる値を使って針の角度を変更すればよいわけです。\\ | 例えば、アナログ時計など作る場合は ''os.date()'' によって得られる値を使って針の角度を変更すればよいわけです。\\ | ||
- | ランダム関数をつかえばおみくじなども作れます。\\ | + | ランダム関数をつかえばおみくじなども作れます。 |
- | \\ | + | |
Luaのライブラリは [[http://milkpot.sakura.ne.jp/lua/lua52_manual_ja.html|Lua 5.2 リファレンスマニュアル]] に書かれています。\\ | Luaのライブラリは [[http://milkpot.sakura.ne.jp/lua/lua52_manual_ja.html|Lua 5.2 リファレンスマニュアル]] に書かれています。\\ | ||
- | VCIで使用可能なライブラリは[[vci:script:reference|VCIスクリプトリファレンス]]の他、[EmbeddedScriptWorkspace]フォルダ内の[types.lua]からも定義されてる関数を確認する事ができます。\\ | + | VCIで使用可能なライブラリは[[https://developer.virtualcast.jp/vci-docs/api/|VCIスクリプトリファレンス]]の他、[EmbeddedScriptWorkspace]フォルダ内の[types.lua]からも定義されてる関数を確認する事ができます。 |
- | \\ | + | |
- | ※1 使えるライブラリには制限があります。\\ | + | |
- | ---- | + | ※1 使えるライブラリには制限があります。 |
==== 13.使えるライブラリの確認について ==== | ==== 13.使えるライブラリの確認について ==== | ||
- | [[vci:top|VCI TOP]] の **使えるライブラリ一覧** よりヘルプのファイルをダウンロード。\\ | + | [[vci/script/reference|旧VCIスクリプトリファレンス]] の **リファレンス(自動出力)** より''vcireferencedoc.zip''のファイルをダウンロード。\\ |
- | (Lua自体のライブラリも確認できます)\\ | + | (Lua自体のライブラリも確認できます) |
- | \\ | + | |
- | VCIのライブラリは [[vci:script:reference|VCIスクリプトリファレンス]] より確認できます。\\ | + | 現在のVCIのライブラリは [[https://developer.virtualcast.jp/vci-docs/api/|新VCIスクリプトリファレンス]] より確認できます。 |
- | \\ | + | |
また、**Luaのみのプログラミング**をしたい場合であれば [[http://codepad.org/|codepad]] で簡易的な確認をする事ができます。\\ | また、**Luaのみのプログラミング**をしたい場合であれば [[http://codepad.org/|codepad]] で簡易的な確認をする事ができます。\\ | ||
- | ※上記は当然VCI固有の処理はできないので、純粋なLuaのプログラミングに使用します。\\ | + | ※上記は当然VCI固有の処理はできないので、純粋なLuaのプログラミングに使用します。 |