プログラミング不要で VCI の Lua スクリプトを生成する Unity エディタ拡張
unitypackage をダウンロード(Google Drive)VCI Event Creator は、VirtualCast の VCI アイテムに搭載する Lua スクリプトを、 コードを一切書かずにビジュアル操作だけで作成できる Unity エディタ拡張ツールです。
RPGツクールのイベントエディタと同じような「コマンドを積み上げる」方式のインターフェースで、 「アイテムを掴んだら音を鳴らす」「ボタンを押したらアニメーションを再生する」といった動作を 直感的に組み立てることができます。
作成した設定は保存され、Unity から「スクリプト更新」ボタンを押すだけで
VCI に必要な .lua ファイルが自動出力されます。
| バージョン | 日付 | 主な変更点 |
|---|---|---|
| v1.0.0 | 2026-05-02 | 公開版リリース |
.unitypackage ファイル(Google Drive からダウンロード)Google Drive(配布フォルダ) からファイルをダウンロードしてください。
Unity Hub から VCToolKit のプロジェクトを開いてください。 すでに開いている場合はそのままで構いません。
Assets/VciEventCreator/ フォルダが作成されていれば成功です。
Hierarchy ウィンドウの空白部分を右クリックし、
VCI Event Creator テンプレート作成 → 空の VCI オブジェクト を選択します。
ファイル保存ダイアログが開きます。ファイル名がそのまま VCI の Title になるため、
アイテム名を入力して保存先を決めてください(日本語も使用できます)。
保存すると、Hierarchy に以下の構成が自動で生成されます。
Hierarchy でルートオブジェクトを選択し、Inspector に表示される 「VCI Event Editor を開く」 ボタンをクリックします。
左側の「イベント一覧」パネルから、対応するトリガーを選んでクリックします。 たとえば「OnUse」を選ぶと「サブアイテムをUseした時」のイベントになります。
次に、対象となるサブアイテムを Hierarchy からドラッグ&ドロップして登録し、 そのサブアイテムの行を選択してコマンドを追加していきます。
コマンドの設定が完了したら、「スクリプト更新」 を実行します。 以下のどちらかから実行できます。
実行すると、作業フォルダの main.lua と VCIObject の Scripts が同時に更新されます。
作業フォルダの main.lua を更新することで、VirtualCast アプリ上の VCI にスクリプトの変更が反映されます。
main.lua の更新時には、上書き前のファイルが自動的にバックアップとして保存されます。
バックアップは最大 10 件まで保持され、それを超えると古いものから自動削除されます。
VCI Event Editor ウィンドウの「Lua全体プレビュー」ボタンを押すと、生成される Lua コードをプレビューで確認できます。
main.luaの更新はVCIをサイトにアップロードしていなくても作成できます。
「アイテムグループ」とは、同じ種類のオブジェクトを複数まとめて管理する機能です。
グループには「現在選択中のインデックス」があり、「次へ進む」「前へ戻る」「ランダム」などで
インデックスを動かしながら、対象オブジェクトを順番に切り替えて操作できます。
複数の弾丸オブジェクトを順番に発射、スライドショーのページ切り替え、ランダムにおみくじを引くなど。
弾丸オブジェクト(Bullet_1〜Bullet_6)を6個用意し、掴んだ銃を使うたびに 次の弾丸を取り出して発射するしくみを作る例です。
① アイテムグループに弾丸を登録する
② OnUse イベントにコマンドを登録する
銃の SubItem に OnUse トリガーのイベントを作成し、以下の2つのコマンドを順番に追加します。
「アイテムグループ」→「Bullets」 を選び、
変数管理では2種類の変数を扱えます。
IFでの条件分岐や、テキストへの表示などに使用できます。
| 種類 | 用途 |
|---|---|
| 独自変数 | 自分の処理内だけで使う一時的な値。 カウンターや計算の中間値など |
| 共有変数(State) | 全プレイヤー間で値を共有する変数。 スコアや残弾数など、みんなに見えるデータに使う |
「タイマー」パネルでタイマーを登録しておくと、OnTimerComplete(タイマー終了時)や OnTimerReached(指定秒数到達時)のイベントを使えるようになります。 カウントダウンゲームの制限時間管理などに利用できます。
「イベント」とは、「どんなきっかけで処理を実行するか」を決めるものです。 以下の種類から選択してコマンドを組み立てます。
| トリガー名 | 発火するタイミング | SubItem |
|---|---|---|
| Initialize | VCI がロードされた時に1回だけ実行される。初期設定に使う | — |
| UpdateAll | 毎フレーム、全プレイヤーで実行される処理 | — |
| OnSecondTick | 1秒ごとに1回実行される処理(UpdateAll 内でカウント) | — |
| OnUse | サブアイテムをUseボタンで使い始めた時 | 必要 |
| OnUnuse | Useボタンを離した時(Use終了時) | 必要 |
| OnGrab | サブアイテムを掴んだ時 | 必要 |
| OnUngrab | 掴んでいたサブアイテムを離した時 | 必要 |
| OnContactEnter (初心者向け) |
Collider 設定に関係なく、何かに触れた時。 OnTriggerEnter と OnCollisionEnter の両方で実行されます |
必要 |
| OnContactExit (初心者向け) |
Collider 設定に関係なく、何かから離れた時 OnTriggerExit と OnCollisionExit の両方で実行されます |
必要 |
| OnTriggerEnter | IsTrigger が有効な Collider に他の Collider が触れた時 | 必要 |
| OnTriggerExit | IsTrigger が有効な Collider から他の Collider が離れた時 | 必要 |
| OnCollisionEnter | IsTrigger が無効な Collider に他の Collider が衝突した時 | 必要 |
| OnCollisionExit | IsTrigger が無効な Collider から他の Collider が離れた時 | 必要 |
| OnPlayerJoined | プレイヤーが入室した時(ルーム・スタジオ共通) | — |
| OnPlayerLeft | プレイヤーが退室した時(ルーム・スタジオ共通) | — |
| 共有変数の内容が変化した時 | 登録した「共有変数(State)」の値が変化した時。変数ごとに自動生成される | — |
| タイマー変数のタイムアウト | CountDown タイマーが 0 秒になった時。タイマーごとに自動生成される | — |
| タイマー変数が指定秒数に到達時 | タイマーが指定した秒数に到達した時 | — |
| ログの内容が変化した時 | ログ変数の内容が変化した時(管理方法が全員共有になっている場合のみ) | — |
| コメントを受信した時 わんコメOSCプラグイン |
わんコメOSCプラグイン経由でコメントを受信した時 | — |
SubItem を持つトリガーでは、各 SubItem 行のマッチング方式を選べます。
| モード | 動作 |
|---|---|
| 完全一致(デフォルト) | 指定した名前と完全に一致するアイテムのみ反応。 SubItem 欄に Hierarchy からドラッグして追加する |
| 部分一致 | 指定したパターンを名前に含むアイテムが反応。 SubItem 欄を右クリックして「アイテム名の部分一致を追加」から追加する |
Bullet と入力します。
すると Bullet1・Bullet2・… すべてが同じイベントのトリガーとして反応します。
完全一致で6件個別に登録する手間が省け、後からオブジェクトを増やした場合も自動的に対応されます。
「IF(条件分岐)」コマンドは、特定の条件を満たすときだけ後続のコマンドを実行する仕組みです。 RPGツクールの「条件分岐」と同じイメージです。
| 条件の入力方法 | 説明 |
|---|---|
| 式で入力 | 左辺と右辺の値を演算子(==, !=, <, > など)で比較する。共有変数・ローカル変数・イベント専用の引数・直接入力値が使える |
| Grabしている | 特定の SubItem を掴んでいるかどうかを判定する |
| Useしている | 特定の SubItem をUse中かどうかを判定する |
| VCI 環境の判定 | ルーム・スタジオ・ローカルなど、現在の実行環境を判定する |
| SubItem の Active 判定 | 特定のオブジェクトが表示状態かどうかを判定する |
| 衝突オブジェクト名(hit) | 接触・衝突系トリガー限定。衝突した相手の名前で分岐する(人体ボーン名・システムアイテムの判定も可) |
| 変数名に含む | 変数の値に指定テキストが含まれているかを判定する |
| 直接入力 | 条件式をスクリプトで直接入力する |
IF コマンドを選択したときのパラメータ欄で 「条件を満たさないときの分岐を作成」 にチェックを入れると、 条件を満たさなかった場合の処理(ELSE ブロック)を追加できます。
Transform 系・サウンド系・エフェクト系など多くのコマンドには、 「全員に適用する」(broadcastToAll)チェックボックスがあります。
VCI ではデフォルトでは自分の画面にしか反映されないアクションがあります。 このオプションをオンにすると、コマンドを実行したプレイヤーの操作が 部屋にいる全員の画面に同期されます。
_ALL_ 系関数(例: ExportAudioSource._ALL_Play())と
ほぼ同等の機能です。一からセットアップするのが大変な場合は、付属のサンプルテンプレートを使うと すぐに動く VCI の雛形を配置できます。
Hierarchy の右クリックメニューから VCI Event Creator テンプレート作成 からサンプルを選んで
サンプルを作成できます。
以下はテンプレートの一部です。
| テンプレート名 | 内容 |
|---|---|
| 弾丸発射サンプル | Useボタンで弾を発射する銃のサンプル |
| スライドショーサンプル | ボタン操作でスライドを切り替えるサンプル |
| 刀サンプル | 掴んで攻撃できる刀のサンプル |