Top > Light.vn入門

Light.vn入門(想定Ver:6.0.0)

Last-modified: 2018-09-05 (水) 15:49:26


準備をしよう Edit

本体をダウンロード・解凍しよう Edit

本体をダウンロードページからダウンロードしましょう。
ダウンロードしたデータは圧縮されているので、解凍ツール(windowsエクスプローラーやLhazなど)を使用し、好きな場所に解凍しましょう。


フォルダ構成を確認しよう Edit

解凍したフォルダの構成を見てみると、次のようになっています。
収容するファイルの種類が異なるので、確認しておきましょう。

  • フォルダ「_export」……配布する際に使用するものを収めているフォルダ。
  • フォルダ「BGM」……音楽データを入れるフォルダ。
  • フォルダ「Config」……コマンドなどについての設定が入っているフォルダ。
  • フォルダ「Dlls」……エンジンの動作に用いられるファイルが入っているフォルダ。
  • フォルダ「Fonts」……フォントを入れるフォルダ。
  • フォルダ「Images」……画像データを入れるフォルダ。
  • フォルダ「Movies」……動画データを入れるフォルダ。
  • フォルダ「Particles」……パーティクル効果の素材を入れるフォルダ。
  • フォルダ「Patch」……パッチ作成時に素材を入れるフォルダ。
  • フォルダ「SaveData」……セーブデータが作られるフォルダ。
  • フォルダ「Scripts」……シナリオを入れるフォルダ。
  • フォルダ「SFX」……効果音を入れるフォルダ。
  • フォルダ「Shaders」……特殊効果を入れるフォルダ。
  • フォルダ「Voices」……音声データを入れるフォルダ。
  • Light.exe……ゲームアプリケーション。
  • LightEditor.exe……スクリプトエディター。
  • README.txt……必ず読むべきファイル。
  • setting.xml……エディターの設定ファイル。


サンプルをプレイしよう Edit

解凍したフォルダにはサンプルスクリプトがあります。
サンプルスクリプトはLight.vnの機能等を把握するための最良の教科書です。
エディターを開いてF5キーを押せばサンプルスクリプトをテストプレイできるので、制作を始める前にエディターで表示されるスクリプトを眺めながらテストプレイをしてみましょう。
最初は機能を大まかに把握するだけでも大丈夫です。


エディターを確認しよう Edit

エディターを起動し、ウィンドウ内の各領域が担う機能を確認しましょう。

  • メニューバー
    ウィンドウ内の最上部にあります。
  • ファイル
    • 新規プロジェクト作成
      新しい制作用フォルダを作成します。
      新しいフォルダには素材ファイルが無いので、自分で素材を用意する必要があります。
    • 新規スクリプト
      新しいスクリプトファイルを作成し、スクリプトタブに追加します。
    • 現在スクリプトを保存
      スクリプト領域で表示しているスクリプトを上書き保存します。
      ショートカットキー:CTRL+S
    • Light.vnを終了
      エディターを閉じます。
      終了前にダイアログが表示されます。
      終了時にはスクリプト領域で保存しているスクリプトを自動で上書き保存します。
      ショートカットキー:ALT+F4
  • 表示
    • プレビュー画面拡大
      エディター上におけるプレビュー領域の大きさを変更します。
      縦横の大きさを、設定したノベル解像度の「50%」「75%」「100%」のいずれかから選択できます。
  • ノベル
    • 現在位置からテストプレイ開始/中止
      スクリプト領域に表示しているスクリプトのテストプレイを開始または中止します。
      スクリプト上にカーソル行が存在する場合には、ひとつ下の行からテストプレイを開始します。
      スクリプトファイル自体を参照して動作するので、スクリプト領域上で上書き保存されてない変更はテストプレイに反映されません。
      また、テストプレイ中はスクリプト領域における新たな変更を反映しません。
    • ノベル設定
      ゲーム全体に関する設定や、エディターに用いる文法ファイルの変更等を行います。
    • ノベル配布
      新しいフォルダを作成し、作品を出力します。
  • ヘルプ
    • 支援ファイルフォーマット
      Light.vnで使用できる素材のファイル形式を表示します。
    • Light.vnについて
      Light.vnの紹介文を表示します。
  • スクリプトタブ
    メニューバーの直下にあります。
    エディターで編集するスクリプトはこの領域に並びます。
    スクリプトタブに表示されていないスクリプトファイルも、フォルダ「Scripts」内に納めていれば出力されます。
    領域の右端には3つのボタンがあります。
  • 新規スクリプト
    機能はメニューバーの「新規スクリプト」と同様です。
  • 開く
    フォルダ「Scripts」内にあるスクリプトファイルをスクリプトタブに加え、スクリプト領域に表示します。
  • 閉じる
    スクリプト領域で表示しているスクリプトをスクリプトタブから除きます。
    スクリプトを削除するのではありません。
  • ショートカットボタン
    ウィンドウ内の左端、スクリプトタブの直下にあります。
    スクリプト上にカーソル行が存在する状態でボタンをクリックすると、表記されているコマンドの既定値をカーソル行に記述します。
    一部のコマンドでは素材や座標の指定が必要となるので、説明バー等の指示に従ってください。
    コマンドを手入力するよりも確実性が増すので、ショートカットボタンのあるコマンドはこれを積極的に使用しましょう。
  • プレビュー領域
    ショートカットボタンの右側、スクリプト領域の左側、スクリプトタブの直下にあります。
    テストプレイ時にゲームが表示され、動作します。
    リアルタイムプレビュー機能を使用している場合には、カーソル行までのスクリプトを反映して表示します。
  • スクリプト領域
    ウィンドウ内の右端、スクリプトタブの直下にあります。
    編集中のスクリプトを表示します。
    上書き保存をするまで、スクリプト領域上におけるスクリプトの変更はスクリプトファイルに反映されません。
    スクリプトタブでスクリプトを移動する際には、変更が自動でスクリプトファイルに反映されます。
  • 説明バー
    プレビュー領域の直下にあります。
    プレビューやテストプレイ、ショートカットボタンに関する説明や指示を表示します。
  • スクリプト状態
    説明バーの直下、左側にあります。
    スクリプトの読込みに関するゲームエンジンの動作状態を表示します。
  • エディター動作設定
    スクリプト状態の直下にあります。
    エディターの一部の動作を設定・変更できます。
  • コマンド目録
    説明バーの直下、中央にあります。
    すべてのコマンドとその説明とを表示します。
  • 情報バー
    ウィンドウ内の下端にあります。
    エディターの動作状態に関する情報をリアルタイムで表示します。


対応しているファイル形式を確認しよう Edit

Light.vnで素材として使用できるファイル形式は以下のとおりです(LightEditor記載分:Ver6.0.0)。
支援外のファイル形式の素材を使用するとエラーを出す場合がありますので、しっかりと確認しましょう。
最新のものは「支援ファイルフォーマット」から確認できます。

テキストデータ Edit

  • txt(文字コード:UTF-8)

画像データ Edit

  • bmp
  • png
  • tga
  • jpg
  • gif
  • psd
  • hdr
  • pic

音楽データ Edit

mp3は法律上の問題で支援していません

  • ogg
  • wav
  • flac
  • aiff
  • au
  • raw
  • paf
  • svx
  • nist
  • voc
  • ircam
  • w64
  • mat4
  • mat5
  • pvf
  • htk
  • sds
  • avr
  • sd2
  • caf
  • wve
  • mpc2k
  • rf64


制作用のフォルダを用意しよう Edit

素材とエディター等を収めるフォルダを用意しましょう。
以下のような方法があります。


  • フォルダを新規作成する
    あなたのPC上に制作用のフォルダを新規に作成します。
    まず、メニューバーの「ファイル」から「新規プロジェクト」に移動します。
    次に、制作用のフォルダを作る場所を指定します。
    最後に「OK」を選択すれば、指定した場所に「Light.vn-new」というフォルダが作成されます。
    フォルダ内にはダウンロードしたものと同じ構成のフォルダとファイル、エディター等が収められているので、あとは各フォルダに素材を入れてゆきましょう。


  • フォルダごとコピーする
    ダウンロードしたフォルダをコピーして任意の場所に貼り付けても制作用フォルダとして用いることができます。
    この場合は素材もコピーされます。したがって、ダウンロードしたフォルダ内にある素材を容易に流用できます。


  • ダウンロードしたフォルダをそのまま使う
    ダウンロードしたフォルダをそのまま制作用フォルダとすることもできます。
    Light.vnで用意されている素材やスクリプトの流用が多いならば、この方法でも可能でしょう。


制作をしよう Edit

※リアルタイムプレビュー機能を使用することを前提としています。

知っておきたいこと Edit

いくつかのコマンドや個体に共通する要素があるので、先に紹介しておきます。


スクリプトとエンジンを知ろう Edit

  • 「Light.vnはエンジンでスクリプトを読込んで様々な動作を行います」
    一文で書き表すなら上記のようになるのですが、もう少し細かく説明します。
  • スクリプトとは、エンジンを動かす指示書や台本というイメージに近いものです。
    Light.vnのゲームエンジンは、フォルダ「Scripts」内に収められているスクリプトファイルを読込み、スクリプトの記述を1行ずつ参照し、その行の記述が指示する内容に即した動作を行ってゆきます
  • スクリプトに記述するのは「コマンド」と「テキスト」です。
    「コマンド」は、ゲームエンジンで行える様々な動作や機能を指示するものです(項目参照:コマンドとは)。
    「テキスト」は、画面上に表示するためのテキストを指します(項目参照:文章表現)。
    スクリプトにおける記述の仕方によって、エンジンは行内の記述がコマンドとテキストのいずれであるのかを判別して動作します。
  • 特定の条件下(テキスト行末尾の「\w」等)において、エンジンはスクリプトの読込みを一時停止して待機状態に入ります。
    待機状態を解除するには、コマンド「続行」の適用が必要となります。
    一般的なノベルゲームにおける「クリックやエンターキーの入力によって進行する機能」は、コマンド「続行」をエンターキーや左クリック等に対してコマンド「キートリガー」を用いて設定しておく必要があります
    ほぼすべての作品において必須となる機能なので、ゲームを起動すれば常にそれらのキートリガーが設定されるようなスクリプトを作りましょう(項目参照:キートリガー続行)。
    というわけで、まずは新しいスクリプトの先頭行に「キートリガー enter 続行」と記述してから、以下の解説をご覧になってください。

※以下の解説においては、コマンド「キートリガー 続行」の設定を終えているものとします。

レイヤーを知ろう Edit

  • レイヤーとは、画面上における個体の表示順のことです。
    個体を設定する際には設定項目として必ず指定します。
  • レイヤーの数値が大きいほど、個体は手前に表示されます
    同じレイヤー上で複数の個体の領域が被る場合には、直近に設定された個体が手前に表示されます。

透明度を知ろう Edit

項目参照:透明度

  • 透明度とは、0を透明、255を不透明とする尺度です。
    コマンド「透明度」で設定・変更ができます。


ゲームの設定をしよう Edit

制作を始めるにあたって、最初にゲームの諸要素の設定を行いましょう。
設定をするにはメニューバーから「ノベル」→「ノベル設定」へと進みます。


作品のタイトルを決めよう Edit

  • 「ノベルタイトル」には、作品のタイトルを入力します。
    入力したタイトルはゲームウィンドウに表示される名前に反映されます。
  • 「ノベルフォルダ名」には、作品の出力フォルダ名となる英数字を入力します。
    タイトルに関連のあるものにするとよいでしょう。

最初に読込むスクリプトを指定しよう Edit

  • 「スタートスクリプト」には、ゲーム起動時において最初に読込むスクリプトを指定します。
    基本的にはタイトル用のスクリプトとなるでしょう。

解像度を設定しよう Edit

  • 「ノベル解像度」には、ゲーム画面の既定解像度(ゲーム画面の大きさ)を指定します。
    幅と高さの比は4対3か16対9が一般的です。
    極端な比にすることもできます。

ダイアログ用のスクリプトを指定しよう Edit

  • 「メッセージスクリプト」には、コマンド「ダイアログ」を設定したり、ウィンドウの閉じるボタンを選択した場合において読込むスクリプトを指定します。
    最初はサンプルのものを参考にしておきましょう。

アイコン画像を指定しよう Edit

  • 「アイコン」には、ウィンドウ上部やタスクバー上に表示されるアイコンに用いる画像を指定します。
  • アイコン画像の対応ファイル形式はLight.vnで支援しているものと同じです。
    サイズは32×32が推奨されています。


テキストを表示しよう Edit

ノベルゲームの基礎であるテキストを画面に表示させてみましょう。


フォントファイルを用意しよう Edit

  • Light.vnはPC内のフォント等を利用しないため、作品内で使用するフォントはフォルダ「Fonts」に入れておく必要があります。
  • 使用したいフォントは、必ずライセンスを確認してからフォルダに入れましょう。
    お使いのPCに導入しているフォントの使用に関しても、念の為にライセンスを確認しておきましょう。

読み進めるテキストを表示しよう Edit

項目参照:文字窓使用文字窓文章表現文字自動待機文章消去

  • 一般的なノベルゲームで見られる「入力によってプレイヤーが読み進めるテキスト」は、コマンド「文字窓」「使用文字窓」を用いることで実現できます。
    スクリプトにコマンド「文字窓」「使用文字窓」を設定して、その下に「"」を記述し、なにかテキストを入力してみましょう。
    画面上にテキストが表示されれば、文字窓が正しく設定されているので、以降のテキストは文字窓に表示されてゆきます。
  • 文字窓は基本的に画像よりも手前に表示するものなので、レイヤーの数値は大きめに設定しましょう。
  • プレイヤーの入力を待機させるには、テキストの行末に「\w」を記述するか、コマンド「文字自動待機」を設定します。
  • 文字窓に表示しているテキストを一旦消してから新しいテキストを表示したい場合には、新しいテキストの行頭に「"」を記述するか、コマンド「文章消去」を設定します。
  • テキストは文字窓の領域内に留まるよう折り返して表示されますが、途中で改行させたい場合には、スクリプト上で改行させ、改行するテキストの行頭に「.」を記述します。

テキストを単独で表示しよう Edit

項目参照:文字

  • 他のテキストの影響を受けないテキストを表示させたい場合には、コマンド「文字」を用います。
    文字窓に表示されるテキストと異なり、コマンド「文字」を用いて表示されたテキストは個体として扱われるので、文章表現に則らず、特定のコマンド(コマンド「アウト」等)の設定があるまで表示され続けます。


イメージを表示しよう Edit

物語の舞台や状況、登場キャラクター等を示す画像を画面上に表示させてみましょう。


背景を表示しよう Edit

項目参照:背景

  • 背景を表示するには、コマンド「背景」を用います。
    背景は自動的にレイヤーが最も下になるので、レイヤーによる表示順序を考慮する必要がありません。
    また、背景に用いる画像は自動的にウィンドウのサイズに変更されるので、可能ならば既定解像度よりも大きいサイズの画像を用意するといいでしょう。

画像を表示しよう Edit

項目参照:

  • 立ち絵などの画像を表示するには、コマンド「絵」を用います。
    背景は1枚のみ設定できますが、コマンド「絵」では個体名の数だけ個体を設定できます。
  • 画像はレイヤーの影響を受けるので、画像の設定時にはレイヤーの数値に注意しましょう。

背景や画像を交換しよう Edit

項目参照:画像

  • 設定した背景や画像を、個体名や座標を保ったままで別の画像に変更するには、コマンド「画像」を用います。
    ショートカットボタンでは「画像変換」が該当します。
  • 交換したい背景や画像の個体名を指定すれば、その個体に用いる画像素材が変更されます。
    効果時間を設定すると交換がなめらかに行われます。
  • コマンド「背景」「絵」において、画面上に存在する個体の個体名を再び用いることでも画像素材の変更ができます。
    この場合は座標が保持されないので、再設定する必要があります。
    また、コマンド「背景」「絵」には効果時間の設定項目が無いので、変更は即座に行われます。


音を使おう Edit

場面を演出する音楽を取り入れてみましょう。


BGMを再生しよう Edit

項目参照:背景音

  • BGMを再生するには、コマンド「背景音」を用います。
  • 複数の楽曲をBGMとして同時に再生することはできません。
  • すでにBGMを再生している場合において、再度コマンド「背景音」を設定すると、BGMが即座に交代されます。
  • エディター動作設定において「編集中に背景音楽再生動作」を適用しておくと、カーソル行をエンジンが読込んだ状況において再生される予定のBGMが、エディターでのスクリプトの編集中に再生されます。
    場面想定に役立つので、制作環境に問題が無ければ適用しておくことをおすすめします。

効果音を再生しよう Edit

項目参照:効果音

  • 効果音を再生するには、コマンド「効果音」を用います。
  • BGMと異なり、効果音の再生はテストプレイをしないと確認できません。
    また、複数の効果音を同時に再生できます。

音声を再生しよう Edit

項目参照:ボイス背景ボイスボイス再生

  • 音声を再生するには、コマンド「ボイス」「背景ボイス」を用います。
  • コマンド「ボイス再生」を適用することで、コマンド「ボイス」で直近に再生された音声をもういちど再生することができます。


ボタンを作ろう Edit

選択することでコマンドを適用できるボタンを設置しましょう。


コマンドを用いるためのボタンを設置しよう Edit

項目参照:ボタンシスボタン

  • クリックすることでコマンドを適用することができるボタンは、コマンド「ボタン」で実現できます。
    一般的なノベルゲームで見られるオートやスキップを適用するためのボタンの他に、選択肢としても用いることができます。

特定のボタンだけが作動するようにしたい時は Edit

項目参照:ボタン活性領域

  • ボタンは上位のレイヤーに存在する画像等によって隠れていたり、コマンド「透明度」によって透明にされていても、領域上でクリックされれば作動します。
    ただ、コンフィグ画面やセーブ画面等においては、もともと設置しているボタンを退場させることなく、新たに設置するボタンのみを選択対象にしたい場合もあるでしょう。
    その場合には、選択対象に含めたいボタンを設定する前に、コマンド「ボタン活性領域」を設定しておきましょう
    このコマンドを設定すると、以降の行から「script_fin」と記述された行を読込むまでの間に設置されたボタンのみが選択対象となります。


簡単な効果を使おう Edit

設定した個体にあれこれしてみましょう。


個体を退場させよう Edit

項目参照:アウト

  • ここまで来ると、画面上にたくさんの個体が表示されていて、画面や音が混みあっていることでしょう。
    個体を退場させたい場合には、コマンド「アウト」を用います。
    このコマンドを適用することで、背景・画像・音楽等、設定した個体を退場させることができます。
  • 効果時間を設定すると、徐々に退場してゆくようにすることができるようになります(フェードアウト)。

個体を登場させよう Edit

項目参照:イン背景ボタン

  • ここまでの画像や音の個体はどれも即座に表示・再生されたはずですが、演出によっては、徐々に表示したり、無音から音量を上げたいという場合もあるでしょう。
    その場合には、コマンド「イン」を用います。
  • コマンド「イン」は、対象に指定した個体の素材が画像の場合には、効果時間を設定することで透明から徐々に不透明へと変化させて登場させることができます(フェードイン)。
    対象に指定した個体の素材が音の場合には、効果時間を設定することで無音から徐々に音量を上げながら登場させることができます(フェードイン)。
  • コマンド「背景」「絵」「ボタン」は、コマンド名の末尾に「0」を付与して「背景0」「絵0」「ボタン0」とすれば、設定時に透明度を0に設定したうえで登場させます。
    したがって、これらをあらかじめ設定しておいたうえで、コマンド「イン」を適用して視認できるようにすることもできます。
    ただし、ボタンに関しては透明度が0でも作動するということに注意しましょう。

個体を移動させよう Edit

項目参照:移動

  • 個体の位置の変更は、コマンドの再設定の他に、コマンド「移動」を用いることでも可能です。
    コマンド名のとおり、このコマンドでは個体を特定の座標まで移動させます。
  • 効果時間を設定すると、移動がなめらかに行われ、移動の軌跡を見ることができるようになります。

個体を拡大しよう Edit

項目参照:拡大

  • 個体の画面上における表示サイズを変更するには、コマンド「拡大」を用います。
    拡大だけでなく、縮小も可能です。
  • 効果時間を設定すると、徐々に拡大や縮小をしてゆきます。

個体を透明に近づけよう Edit

項目参照:透明度

  • コマンド「透明度」を適用すると、個体を透明に近づけてゆくことができます。
    半透明にしてみたり、透明にして画面上で視認できなくしたりと、演出にも効果を発揮するでしょう。


システムを組み上げよう Edit

スクリプト間を移動したり、一般的な機能を実装して、ゲームシステムを組み上げてみましょう。


コマンド「ジャンプ」でスクリプトを移動しよう Edit

項目参照:ジャンプ

  • ひとつのスクリプトファイルだけでは、実装できる機能に限界がありますし、制作中に物語の区切りを見失いそうになります。
    そこで、複数のスクリプトを用意し、コマンド「ジャンプ」を用いて、読込むスクリプトを移動しましょう。
  • このコマンドを用いると、移動先に指定したスクリプトを読込みます。
    スクリプトのファイル名のみを記述すると、そのスクリプトの先頭行から読込みを始めます。
    スクリプト上にコマンド「栞」を用いて栞を設定し、スクリプトのファイル名に併せて栞名を記述すると、その栞が存在する行から読込みを始めます。
  • このコマンドを用いてスクリプトを移動すると、再びコマンド「ジャンプ」または「スクリプト」を適用しない限り、元のスクリプトには戻りません
    したがって、章を持つ物語などにおいて章間を移動する場合には適していますが、コンフィグやセーブ・ロード画面用のスクリプトに対して用いる場合にはあまり適していません。

コマンド「スクリプト」でスクリプトを参照させよう Edit

項目参照:スクリプト

  • 読込むスクリプトを移動する方法としては、コマンド「スクリプト」を用いるというものがあります。
    スクリプトの移動そのものや、移動先の指定方法、読込み動作等は、コマンド「ジャンプ」と同様です。
  • このコマンドを用いてスクリプトを移動すると、移動先のスクリプトにおいて「script_fin」と記述された行を読込んだ段階で、元のスクリプトの、コマンド「スクリプト」を適用した行まで戻ってから読込みを再開します
    したがって、画面の状態等を保存しつつ、別のスクリプトによる動作を適用したい場合に適しており、コンフィグやセーブ・ロード画面等のスクリプトへの移動にはコマンド「スクリプト」を用いるほうがよいでしょう。

コマンド「待機」にオプションをつけよう Edit

項目参照:待機

  • コマンド「待機」にはオプションを付与することができ、それによってコマンド「続行」の適用以外の方法を待機状態の解除条件にすることができます。
  • オプションに数値を記述すると、その数値の時間だけ待機をして、時間経過とともに待機状態を解除します。
  • オプションに「一般進入防止」と記述すると、以降の行はコマンド「ジャンプ」等を適用しなければ読込まれなくなります。
    選択肢やボタンの表示後等、プレイヤーがクリック等の入力を行っても待機状態を解除しないようにしたい場合には、このオプションを設定したうえで、以降の行に移動先の栞を設定しておきましょう。
    最も強力な待機状態なので、基本的にはコマンド「待機」を設定すればこのオプションを付与すると考えてもいいかもしれません。

オート進行・スキップ機能を実装しよう Edit

項目参照:文字進行ボタンキートリガー

  • 一般的なノベルゲームで見られるオート進行モードやスキップモードを実装するには、コマンド「文字進行」を用います。
    基本的にはボタンにコマンドとして設定するか、キートリガーとして任意のキーに割り振ります。
  • コマンド「文字進行 1」「文字進行 *1」は、オート進行モードに該当します。
    オート進行モードを適用すると、特定の時間が経過すれば、コマンド「待機」(オプション無し)や、テキスト側から指示される入力待機を自動で解除します。
    したがって、プレイヤーがキーなどを入力しなくてもテキスト表示が進行し、効果や演出も適用されてゆきます。
    待機解除までの時間を変更したい場合には、コンフィグ機能を用いてもらうことになります(項目参照:コンフィグ機能を実装しよう)。
  • コマンド「文字進行 2」「文字進行 *2」は、スキップモードに該当します。
    スキップモードを適用すると、コマンド「待機」(オプション無し・時間指定)や、テキスト側から指示される入力待機を自動で解除しつつ、一部の演出を省略しながら(効果時間の無効化等)、テキスト表示を高速で進行させます。
    スキップモードによる高速進行は、コマンド「待機 一般進入防止」によって一時的に停止できます。スキップモードを解除することなく待機させたい場合にはこのコマンドを用いましょう。

セーブ機能を実装しよう Edit

項目参照:ボタンボタン活性領域待機セーブセーブ削除データページ変更変数

  • ゲーム作品の必須機能とも言える、セーブ・ロード機能。ここでは、そのうちのセーブ機能を実装しましょう。
    なにも無い状態から作るのはかなり複雑になるので、以下では通常版のサンプルスクリプトにある「sys_save.txt」を参考にします。
  • まずは、どのような状況でセーブ画面を表示してもセーブ画面以外のボタンを誤作動させないようにするために、コマンド「ボタン活性領域」を記述しておきます。
    システム系のスクリプトにはほぼ必須となる作業です。
  • 直後の行にある2つの変数は、両方を設定することでデータページ機能を用いることができるようになるものです。
    データページ機能に関しては、今のところは「ひとつぶんのページを作るだけで、いくつものページを作ることができる機能」という認識でいてください。
    上の変数(vn_slotsPerPage)は、「セーブ画面1ページに表示するセーブスロットの数」を決めるものです。ここで決めた数だけ、セーブスロットを設定することになります。
    下の変数(vn_slotPageMax)は、「セーブ画面を何ページ用意するか」を決めるものです。
    どちらも、変更する場合にはスペースを消さないように注意しましょう。
  • コマンド「セーブ」を適用してセーブデータを記録すると、記録時の画面のスクリーンショットを撮り、ボタンの画像素材として用います
    また、画面上に存在する個体の情報を記録し、ロード時に反映します
    ところが、セーブ画面のスクリプトにおいて設定する個体は基本的にスクリーンショットにもセーブデータにも反映させないものですので、個体名を命名する際には先頭に「~」を記述します
    これによって個体はセーブ時のスクリーンショットに記録されず、セーブデータにも記録されなくなります。
  • セーブ画面で設定する個体のレイヤーは基本的に大きくしておきましょう。
  • ボタンに設定するコマンドに、コマンド「セーブ」「セーブ削除」を用いると、ボタンの選択時にダイアログが表示されるようになり、コマンド「セーブ」を設定したボタンはセーブスロットになります。
    便利な機能なので、基本的にこれらのコマンドはボタンの設定コマンドとして用いましょう。
  • 変数「vn_saveinfo」には、末尾に記述した番号のスロットにセーブデータが記録された時点の年月日と時刻が記録されます。
    サンプルスクリプトではコマンド「文字」のテキストとして用いられています。
    コマンド「文字」のテキストに変数を代入値として用いる場合には、コマンド「文字」が設定された時点における変数の値を反映しますが、そこから変数の値が変化しても、表示される文字には反映されません
    したがって、セーブ時・セーブデータ削除時・データページ変更時にコマンド「文字」を更新するようなスクリプトを組む必要があります。
    サンプルスクリプトでは、コマンド「待機 ボタン選択」「ジャンプ display_info」を用いることで対応しています。
  • もし100ページもあるセーブデータ画面を作ろうと思っても、100ページ分のボタン等を設定する必要はありません。どのページにも同じ数のセーブスロットを表示するのならば、データページ機能を用いるとよいでしょう。
    サンプルスクリプトで設定しているセーブスロットはスロット番号1~6の6個ですが、コマンド「データページ変更」を用いると、エンジン側で自動的にスロット番号を変更します
    したがって、冒頭で設定した2つの変数の積の数だけのセーブスロットを、1ページ分のスロットを設定するだけで作ることができます。
    本来は使用に際してかなり複雑なスクリプトを組む必要があるのですが、サンプルスクリプトどおりにすればほぼ問題なく使用できます。ぜひ踏襲しましょう。
  • セーブ画面を表示する際には、コマンド「スクリプト」を用いるようにしましょう。

ロード機能を実装しよう Edit

項目参照:ボタンボタン活性領域待機ロードセーブ削除データページ変更変数

  • ロード機能に関しては、セーブ画面のスクリプトを複製し、コマンド「セーブ」を「ロード」に変えるだけでもスクリプトが完成します。
  • ボタンに設定するコマンドに、コマンド「ロード」を用いると、そのボタンはセーブスロットになり、ボタンの選択時にダイアログが表示されるようになります。
    便利な機能なので、基本的にコマンド「ロード」はボタンの設定コマンドとして用いましょう。
  • ロード画面を表示する際には、コマンド「スクリプト」を用いるようにしましょう。

バックログ機能を実装しよう Edit

項目参照:文字窓バックログ設定イン待機バックログリセット

  • ノベルゲームは基本的にテキストが主役となるゲームなので、プレイヤーが読むテキスト量は多くなります。すると、少し前に読んだはずの文章をうっかり忘れてしまったりすることが起こりえます。
    そんな場合に読んだテキストを振り返ることができる機能がバックログ機能です。
    Light.vnではコマンド「バックログ設定」をすることでバックログ機能を用いることができるようになります。
    以下では通常版のサンプルスクリプトにある「sys_backlog.txt」を参考にします。
  • バックログとは「文字窓上に表示したテキストを記憶し、その記録を表示する機能」のことを指します。
    エンジンがテキストを記録するようにするためには、コマンド「バックログ設定」を設定してバックログ機能の適用開始を指示する必要があります。
    したがって、テキストの表示を開始する時点において必ずバックログの設定が行われるようなスクリプトを作る必要があります
    具体的には、たとえば文字窓用のスクリプトに、コマンド「スクリプト」を用いてバックログ設定用のスクリプトを呼び出すようにするとよいでしょう。
  • バックログを表示するには文字窓を用いることになるので、コマンド「文字窓」で予めバックログ用の文字窓を設定したうえで、コマンド「バックログ設定」を設定するようにしましょう。
    ちなみに、コマンド「バックログ設定」においてバックログ表示用に指定された文字窓は退場しますが、コマンド「イン バックログ」できちんと呼び出せるので心配しないでください。
  • バックログは最下部までスクロールされている状態においてホイールダウンを入力されると、バックログのスクリプトにおけるあらゆる待機状態を解除し、退場します。
    これには「待機 一般進入防止」も含まれるので、注意が必要です。
  • バックログは設定以降に文字窓で表示されるすべてのテキストを記録し続けるので、次第に記録量が増え、表示量も増えます。
    その記録を初期化するには、コマンド「バックログリセット」を用います。
    このコマンドを用いると、バックログとして記録されていたテキストを初期化してから、記録を再開します。バックログ機能そのものを消去するわけではありません。

コンフィグ機能を実装しよう Edit

項目参照:ボタンボタン活性領域待機スクリーン文字スキップ方式トラックバー開く

  • ゲームの動作には、テキストや効果等、表示に速さを持つものがあります。また、画面の大きさや音量もゲームに関係してくるでしょう。
    それらをプレイヤー側で調整してもらう機能がコンフィグ機能です。
    以下では通常版のサンプルスクリプトにある、ファイル名に「sys_config」が付いているスクリプトを参考にします。
  • まずはセーブ・ロード画面のスクリプトと同様に、コマンド「ボタン活性領域」を記述しておきます。
  • 一般にコンフィグ機能で提供する調整項目は、「画面サイズ」「未読部分におけるスキップモードの動作」「テキスト表示速度」「オート進行モード適用時のテキスト表示速度」「オート進行モード適用時の待機時間」「主音量」「BGM音量」「効果音音量」「ボイス音量」です。
    また、各種の情報をコンフィグ画面に表示することもあります。
    これらの中から、作品において必要とされている項目を選んで、コンフィグ画面のスクリプトに追加してゆきましょう。
  • 調整項目「画面サイズ」「未読部分におけるスキップモードの動作」は、それぞれコマンド「スクリーン」「文字スキップ方式」をボタンのコマンドとして設定することで実装します(コマンドの詳細に関しては各項目を参照)。
  • 残る調整項目の実装には、コマンド「トラックバー」を用いましょう。
    トラックバーとは、数値等の大小やその調整を視覚化するためのもので、プレイヤーが直感的に調整することを可能にします。
    調整項目ごとにコマンド「トラックバー」において指定する変数名が異なるので、項目を参照してください。
    • 音声素材に関しては、コマンド「トラックバー」の設定項目「変数名」に「ボイス」と記述する他に、コマンド「ボイス」「背景ボイス」の設定項目「音量数値変数」で設定した変数名を記述することもできます。
      これによって、特定のボイス素材のみを調整対象にすることができます。したがって、たとえば特定の登場人物の音声に対して同じ変数名を設定すると、その登場人物のみを対象とする音量の調整項目を設定することができます。
  • 各種の情報には、コマンド「開く」を用いることでサイト等へのリンクを設定することができます。
    制作者のサイトや、素材元のサイトへのリンクとして用いるとよいでしょう。
  • コンフィグ画面を表示する際には、コマンド「スクリプト」を用いるようにしましょう。


応用的なスクリプトを作ってみよう Edit

条件のある分岐を作ったり、スクリプトを簡略化する方法を知り、制作の幅を広げてみましょう。


変数を知ろう Edit

項目参照:変数保存変数全域変数

  • 「変数」という言葉を目にした瞬間に難しそうだと思うかもしれませんが、変数自体はそこまで難しくはありません。難しいのは、変数を別の場所で利用する場合です。
    というわけで、まずは変数自体を知りましょう。
  • 変数とは、以下の表をモデルとして説明されます。
    変数名hensu
    変数値100
    「数」という単語のとおり、基本的には数値が登場します。
    そして、変数とは「なんらかの名前に数値を持たせることによって、その名前を指定すれば個別に数値の設定や変更ができるようにするもの」と書き表せます。
    上のモデルにおいては、コマンド「変数 hensu = 100」を設定して、「hensu」という名前(変数名)に100という数値を持たせています。
    数値は常に直近のものが適用されるので、たとえばこの次に同じ「hensu」という変数名を用いて、コマンド「変数 hensu = 120」を設定すると、「hensu」が持つ数値は100ではなく120となります。
    変数名hensu
    変数値100
    ↓「変数 hensu = 120」
    変数名hensu
    変数値120
  • では、「数値を変更する」というのがどういうことなのかというと、小学校算数で登場した四則演算をします。
    たとえば、変数名「hensu」の持つ数値が100であるとして、コマンド「変数 hensu += 10」を設定すると、100に10が加算され、変数名「hensu」の持つ数値は110になります。
    変数名hensu
    変数値100
    ↓「変数 hensu += 10」
    変数名hensu
    変数値110
    演算子を変えれば、減算・乗算・除算も可能です。
  • ここまでは変数値に数値を用いてきましたが、実は変数値にテキストを用いることも可能です。
    ただし、この場合には変数値の先頭と末尾に「"」を付与することが必要となり(この場合の「"」はテキストとして扱われません)、四則演算は不可能となります(演算子が「=」に限られるということです)。
    たとえば、コマンド「変数 hensu = "変数でございます"」は、以下のモデルで表されます。
    変数名hensu
    変数値変数でございます
  • 変数は基本的にゲームの起動中に限って記録・保存され、コマンド「ゲームエンド」によってゲームを終了すれば消去されます
    変数を保存したい場合には、コマンド「保存変数」「全域変数」を用います。
  • セーブデータをロードすると、ロードするデータのセーブ時点までにコマンド「保存変数」を用いて設定された変数が再度設定されます

変数を代入しよう Edit

項目参照:変数

  • 変数はただ演算をするだけではなく、スクリプトにおいて利用することもできます。
    以下では、その利用方法のひとつ、「変数の代入」について説明します。
  • 一文で書き表すならば、「変数は代入して用いることができる」となりますが、具体的にどういうことが行われるのかを見てゆきましょう。
    さて、前述のように、変数値には「数値」と「テキスト」があります。そして、いずれの場合でも、変数名が存在します。
    そして、変数名を代入すれば、そこに変数値を置き換えることができるようになります
    では、そもそもどうやって代入するのかといいますと、コマンドでは記号「()」で変数名を囲み、テキストでは「{{}}」で変数名を囲むのです。
    たとえば、変数名「hensu」が数値「100」を持っている場合において、スクリプトのコマンド行に「(hensu)」と記述すると、その記述は「(hensu)」ではなく「100」として扱われるようになります。
    したがって、この場合において、コマンド「文字速度 (hensu)」を設定すれば、それはコマンド「文字速度 100」として扱われます。
    変数名「hensu」がテキスト「変数です」を持っている場合において、スクリプトのテキスト(コマンドの設定項目における「テキスト」も含みます)に「{{hensu}}」と記述すると、その記述は「{{hensu}}」ではなく「変数です」として扱われるようになります。
    したがって、この場合において、コマンド「文字 word1 100 100 100 mojimoji.ttf 40 "{{hensu}}"」を設定すれば、それはコマンド「文字 word1 100 100 100 mojimoji.ttf 40 "変数です"」として扱われます。
  • 代入は、ゲームの進行や状況、設定に応じて変化しうるコマンドの設定項目において用いることが多いです
    ただし、すでに設定を終えているコマンドは、変数値が変更されただけではその変更をコマンドに反映しません。したがって、変更を反映させるためには、そのコマンドを再設定する必要があります
    変数の代入は、あくまでコマンドの設定時において効果を発揮するものであるということに注意しましょう。

変数を要素にして条件分けをしよう Edit

項目参照:もし

  • 条件分岐は、ゲームにおいて一般的に用いられる機能です。ノベルゲームにおいても、進行度によってストーリーや機能の解放を行う作品があります。
    そのような分岐は、変数とコマンド「もし」を併用することで実装できます。
  • 分岐においては変数を用いることになります。
    変数が条件に合致する場合と合致しない場合のそれぞれに対してコマンドを割り振るというのが、コマンド「もし」の動作となります。
    • たとえば、物語のある部分を読めば、その後に隠し選択肢が表示されるようにしたいという場合を想定しましょう。
      まずは、“ある部分”の直後にフラグとして適当な変数を設定します。この説明においては、コマンド「変数 flag1 = 1」と設定しておきます。
      それから、選択肢を表示するスクリプト行に移動し、コマンド「もし (flag1 == 1) ボタン btn3 400 400 80 ジャンプ scenario1c.txt」(コマンド「ボタン基本素材」は設定済としています)と設定します。
      すると、“ある部分”を読んだ直後に変数名「flag1」の変数値は1となり、選択肢のスクリプト行で「flag1 == 1」の条件に合致するため、コマンド「ボタン btn3 400 400 80 ジャンプ scenario1c.txt」が設定されるようになります。
      この場合においては、条件に合致しない場合に設定されるコマンドが指定されていないので、もし変数名「flag1」の変数値が1ではない、または変数名「flag1」を持つ変数が存在しない場合には、特に動作することなく次の行へ移ります。
  • 複雑な分岐を作ろうとすると、条件や分岐先を見失いやすくなります。
    頭の中で考えるだけではなく、時には樹形図等のアナログな方法も用いて、分岐とその条件を把握しておくようにしましょう。

正規表現に触れてみよう Edit

項目参照:命名について
外部参照:正規表現の構文

  • コマンドの対象名を指定する際に、多数の個体を指定しなければならない場合があります。
    たとえば、コンフィグ画面やセーブ・ロード画面では数十個の個体を設定することになるでしょうが、その画面の個体のみをすべて退場させたい場合において、通常はすべての個体名を記述することが必要になります。
    しかし、そのような面倒を解消する方法として、「個体の命名時において、正規表現に適した命名をする」というものがあります。
  • 正規表現とは、ここでは一般法則に基づく正しい表現という意味ではなく、「システムが各種の条件を考慮しつつ文字列を判別できるようにするために、システム上の規則に従う表現」という意味です。
    正規表現を用いることで、「特定の文字や単語を含まないものすべて」「数字を持つ文字列すべて」などの条件を表すことができ、これを対象の複数指定が可能なコマンドの対象名に用いることができます。
    そのような条件に適合させやすいような処理として、個体名に共通部分を持たせておくとよいでしょう(コンフィグ画面の個体の先頭には「c_」を用いる等)。
    以下では、正規表現によって可能な条件付けの一部を紹介します。
    ちなみに、条件付けの表記に用いている記号を普通のテキストとして用いたい場合には、「\」と「/」とで挟んで記述します。
    • 「.*」:すべての文字
      「.*」は、すべての文字を表します。文字の数は指定されないので、0個(つまりそもそも文字が無い場合)も複数個も含みます。
      これを用いれば、「特定の文字や単語を含むすべての個体名」「先頭または末尾に特定の文字や単語を持つすべての個体名」「ある部分のみにあらゆる文字を許容する個体名」を表現できます。
      ちなみに「.」は「改行以外のあらゆる文字」を表し、「*」は「直前の文字の0回以上の繰り返し」を表し、したがって「.*」は「あらゆる文字の0回以上の繰り返し」=「すべての文字」となっています。
      • 「特定の文字や単語を含むすべての個体名」
        これは“特定の文字や単語”の先頭と末尾のそれぞれに「.*」を付与することで表現できます。
        たとえば、「単語『save』を含むすべての個体名」は、「.*save.*」と表現します。
      • 「先頭または末尾に特定の文字や単語を持つすべての個体名」
        これは“特定の文字や単語”の末尾に「.*」を付与すれば「先頭に特定の文字や単語を持つすべての個体名」を、先頭に「.*」を付与すれば「末尾に特定の文字や単語を持つすべての個体名」を表現できます。
        たとえば、「先頭に『c_』を持つすべての個体名」は、「c_.*」と表現します。
      • 「ある部分のみにあらゆる文字を許容する個体名」
        これは“ある部分”に「.*」と記述することで表現できます。
        たとえば、「『ch_』と『_10』との間になんらかの文字があるか、またはそこに文字が存在しないという個体名」は、「ch_.*_10」と表現します。
    • 「(?!)」:除外
      「(?!」のあとに特定の文字や単語を記述し、その末尾を「)」で閉じると、「特定の文字や単語を含まない」という条件を表現できます。
      これと「.*」とを併用すれば、「特定の文字や単語を含まないすべての個体名」「先頭・末尾に特定の文字や単語を含まないすべての個体名」「ある部分のみに特定の文字や単語以外を持つ、あるいはそこに文字を持たない個体名」を表現できます。
      • 「特定の文字や単語を含まないすべての個体名」
        “特定の文字や単語”を「(?!」と「)」とで囲み、先頭と末尾にそれぞれ「.*」を付与すれば、「特定の文字や単語を含まないすべての個体名」を表現できます。
        たとえば、「文字『a』を含まないすべての個体名」は、「.*(?!a).*」と表現します。
      • 「先頭・末尾に特定の文字や単語を含まないすべての個体名」
        “特定の文字や単語”を「(?!」と「)」とで囲み、その直後に「.*」を付与して、それを先頭に記述すれば「先頭に特定の文字や単語を含まないすべての個体名」を表現でき、末尾に記述すれば「末尾に特定の文字や単語を含まないすべての個体名」を表現できます。
        たとえば、「文字『a』を先頭に含まないすべての個体名」は、「(?!a).*」と表現します。
      • 「ある部分のみに特定の文字や単語以外を持つ、あるいはそこに文字を持たない個体名」」
        “特定の文字や単語”を「(?!」と「)」とで囲み、その直後に「.*」を付与して、それを“ある部分”に記述すれば、「ある部分のみに特定の文字や単語以外を持つ、あるいはそこに文字を持たない個体名」を表現できます。
        たとえば、「『title_』と『_01』との間に『end』を持たないすべての個体名」は、「title_(?!end).*_01」と表現します。
  • それでは、コマンドにおける具体的な使用例を挙げるので、理解の確認をしてみましょう。
    • 「セーブ画面の個体のみをすべて退場させる」
      この場合には、個体の個体名を設定する際において、先頭に「~save」と記述するよう統一したうえで、退場させる時のコマンドは「アウト ~save.*」と記述します。
    • 「BGM以外の個体をすべて退場させる」
      コマンド「背景音」には個体名の設定項目がありませんが、エンジン上では「sysBGM」という個体名が与えられます。
      したがって、「BGM以外のすべての個体」は、「(?!sysBGM).*」と表現します(他の個体の個体名に「sysBGM」を用いないよう注意しましょう)。
      そして、BGM以外のすべての個体を退場させるコマンドは「アウト (?!sysBGM).*」となります。
    • 「特定の選択肢のみを残す」
      選択肢のボタンの個体名において、先頭に「optn_」と記述し、直後には1~4の数字を用いて、4つの選択肢を表示しているとしましょう。
      この場合において、たとえば個体名「optn_3」のみを保持して残りを退場させるコマンドは「アウト optn_(?!3).*」となります(コマンド「アウト optn_(?!3)\d」でも可能ですが、これに関しては外部参照をお願いします)。
  • 正規表現の特殊な例として、「あるパターンを記憶し、代入する」というものがあります。
    以下では、通常版のサンプルスクリプトにある「sys_macros.txt」「textbox.txt」を参考にします。
    また、マクロ機能と関数機能とをすでに理解済みであることを前提としています。
    • ある文字列等を「()」で囲む度に、その文字列はエンジンで記憶されてゆきます。
      そして、記憶された文字列は「$x」(xは数値)へ1回限りで代入されます。「x」には、代入したい文字列を記憶した順番を記述します。
    • 「sys_macros.txt」においては、コマンド「~マクロ "【(.*)】" "スクリプト system\textbox.txt name \"$1\""」が設定されています。
      「"【(.*)】"」は、「【】で囲まれているあらゆるテキスト」を表しており、さらに“【】で囲まれているテキスト”を記憶しています。
      そして、「"スクリプト system\textbox.txt name \"$1\""」は、「$1」に“【】で囲まれているテキスト”が代入されます。
      スクリプトファイル「system\textbox.txt」内の栞「name」には、関数名「_name」を持つ関数が存在しています。
      ここで、関数名「_name」への代入値として“【】で囲まれているテキスト”が代入されます。
      このスクリプトの参照によって行われるのは「発言者名の画面への表示」なのですが、さらに【】内にテキストが存在するかどうかで条件分岐が設定されています。
      したがって、スクリプトにおいて発言者名を【】で囲んで先述しておけば、上記のような処理を経て、発言者名がコマンド「文字」へ代入されます。
      発言者が存在しない場合には、スクリプトにおいて【】のみを先述しておけば、上記のような処理を経て発言者名は消去されます。

マクロ機能を使ってスクリプト記述を簡略化しよう Edit

項目参照:マクロ

  • 多くの作品において、スクリプトはシナリオよりもさらに記述量が増えます。
    大量のコマンド、設定項目、テキストを記述するうちに、「まったく同じ記述を何度も行っている」という状況があるかもしれません。
    そのような場合において大いに効果を発揮するのがマクロ機能です。
  • マクロ機能とは、コマンド「マクロ」を用いて、「テキスト・コマンドのいずれであるかには関係無く、スクリプト上に存在する特定のテキストをすべて異なるテキストに置換する」というものです。
    コマンドの設定以降のスクリプト文においては、特定のテキストが登場する度に置換が行われ、その結果がスクリプトとして反映されます。
    したがって、特にコマンドの設定項目において頻繁に用いられる単語や数値にマクロ機能を適用すると、スクリプトの記述量を減らすことができます。
  • コマンド「マクロ」においては、「変換対象」と「変換結果」を設定します。
    • スクリプト上で記述するのは「変換対象」です。
      これにはできるだけ短く、かつスクリプト上において他のどのような文字列とも重複しない文字列を用いるとよいでしょう。
    • スクリプトに反映されるのは「変換結果」です。
      処理としては変数の代入に類似しています。
      変換結果として指定した文字列である限り、コマンドの設定項目の一部に存在しても、テキストの途中に存在しても、すべて変換されます
      変換対象に関する説明はこの無差別な変換に理由があります。
    • 変換対象・変換結果のいずれにおいても、記述には正規表現を用いることができます。
      ただし、繰り返しますが、変換は無差別に行われるので、特に「.*」を用いる際には十分に注意しましょう。
  • マクロ機能の活用例として、「まったく同じ座標・レイヤーに画像を何度も表示する」というものを挙げて説明します。
    たとえば、座標とレイヤーを順に「100 200 50」として、コマンド「絵」を、画像素材を変えつつ何度も設定することにしましょう。
    ここでコマンド「マクロ "dfco" "100 200 50"」を予め設定しておくと、それ以降のスクリプトに「絵 [適当な個体名] [適当な画像素材ファイル名] dfco」と記述すれば、コマンド「絵 [適当な個体名] [適当な画像素材ファイル名] 100 200 50」として処理されます。
    このように、うまく変換対象と変換結果とを記述すれば、スクリプトの記述量が減ります。「()」や「{{}}」の記述を必要とする変数の代入よりも記述がさらに簡潔になるので、ぜひ活用しましょう。

コマンド「スクリプト」に備わる機能「関数」を使おう Edit

項目参照:スクリプト

  • コマンド「スクリプト」は「スクリプトを参照するコマンド」です。
    そして、コマンド「スクリプト」には特殊な参照方法:「関数」が存在します。
  • 関数機能とは、コマンド「栞」において設定する関数名に対して、コマンド「スクリプト」を用いて値を代入し、さらにコマンド「栞」の存在するスクリプトにおいて関数の持つ値を代入値として用いるというものです。
    • 通常のコマンド「スクリプト」では目的スクリプトの目的栞名までを指定します。
      ここで栞名以降にスペースを挿入して設定項目を追加してゆくと、それが順番に「関数の代入値」となってゆきます。
      たとえば、コマンド「スクリプト basis.txt kansu 200 "関数とはこういうことです" usage」を設定すれば、関数の代入値は順に「200」「関数とはこういうものです」「usage」と設定されます。
    • 通常のコマンド「栞」では、栞名のみを設定します。
      ここで栞名以降にスペースを挿入して設定項目を追加してゆくと、それが順番に「関数名」となり、コマンド「スクリプト」で設定した代入値が順に代入されてゆきます。
      たとえば、上記の例を踏襲し、スクリプトファイル「basis.txt」内に、コマンド「栞 kansu _dainyu1 _dainyu2 _dainyu3」を設定しておくものとします。
      この場合において、コマンド「スクリプト basis.txt kansu 200 関数とはこういうことです usage」を設定すると、関数名「_dainyu1」には「200」、「_dainyu2」には「関数とはこういうものです」、「_dainyu3」には「usage」が代入されます。
    • 代入された関数値は、栞以降のスクリプトにおいて関数名を代入値として指定すれば代入することができます。
      たとえば、上記の例を踏襲し、スクリプトファイル「basis.txt」内の、コマンド「栞 kansu _dainyu1 _dainyu2 _dainyu3」を記述してある行以降で、コマンド「文字 (_dainyu3) 100 (_dainyu2) 70 font10.otf 20 "(_dainyu2)"」を設定しておきます。
      この場合において、コマンド「スクリプト basis.txt kansu 200 関数とはこういうことです usage」を設定すると、コマンドは「文字 usage 100 200 70 font10.otf 20 "関数とはこういうものです"」となります。
  • 関数は変数の代入に類似していますが、関数値を代入値できるのは参照先スクリプト上の参照範囲のみであるという違いがあります。
    したがって、「script_fin」と記述されたスクリプト行を読込んで参照元のスクリプトへ戻れば、参照元のスクリプト上で関数名を指定しても代入は行われません。
  • 関数機能は、状況によって設定項目の値が変わるコマンドを繰り返し設定する場合において用いると効果的です。
    また、設定項目の値が変わるコマンドの数が多く、関数値の代入が複数のコマンドに分散しているほど、関数機能の効率は良くなります。


作品を出力・配布しよう Edit


作品のチェックを繰り返そう Edit

作品の完成を宣言する前に、必ずデバッグと呼ばれる不具合検査と修正を行いましょう。


デバッグをしないと…… Edit

  • 長編はもちろん、短編作品であっても、不具合は少なからず存在するものです。
    もしもそれを放置して作品を配布すれば、プレイヤーが困ります
    プレイヤーはプログラムやスクリプトのことをまったく知らない人もいるので、もしもそのような人がプレイ中にエラー表示を出されたらとても驚いてしまいます。
    もちろんそういう事態が発生すれば制作者にも悪影響はありますが、最も困るのはプレイヤーであるということを忘れずにデバッグをするよう心がけましょう

デバッグの方法を知ろう Edit

  • 不具合には「制作者のスクリプトの不備によるもの」と「エンジン処理やコマンド動作自体の誤作動によるもの」があります。
    どちらも原因の把握が簡単ではなく、区別するのも難しいです。
    基本的には、「コマンド単体の動作まで絞って確認して、不具合が発生している場合」は後者である可能性が高く、そうでない場合は前者である可能性が高いでしょう。
    また、エラーウィンドウが出る場合にはコマンドの使用要件を満たしていない場合がほとんどであり、したがって前者である可能性が極めて高いです。
    ほとんどの不具合は前者ですが、もしも後者の可能性が高ければ、エンジン制作者の方に報告しましょう。
  • デバッグの方法としては、まず不具合を発見することから始まります。
    検査の細かさには段階がありますが、できる限り細かいものを選ぶようにしましょう。
    また、不具合の中にはリアルタイムプレビューで確認できないものがあるので、テストプレイで確認するようにしましょう。
    以下では粗いものから順に紹介します。また、「前者」「後者」という表現も踏襲します。
    • スキップモードを適用しながらテキストをすべて表示してゆく
      この方法は前者の発見に一定の効果があります。
    • 通常進行でテキストをすべて表示してゆく
      この方法は両者の発見に一定の効果があります。
    • 通常進行でテキスト・各種画面をすべて表示してゆく
      この方法は特に前者の発見に効果があります。
      各種画面にはスクリプトの不備が発生しやすいので、この方法まではぜひやっておきたいです。
    • オート進行でテキストをすべて表示してゆく
      この方法は特に後者の発見に効果があります。
      ただし、そこまで必要ではないかもしれません。
    • 進行モードをランダムに変え、コマンド「続行」を連続で適用しながらテキスト・各種画面をすべて表示してゆく
      クリックやエンターキーを押しまくり、進行モードも変えまくり、とにかくめちゃくちゃな操作を行います。
      ここで発見した不具合は、発生箇所まで戻り、進行モードごとに確認します。
      両者の発見に十分な効果があるものの、果てが無い検査方法なので、適当な段階で切り上げるようにしましょう。
      また、確認箇所や操作等を把握しておかなければ重複が発生して効率がさらに落ちます。
  • 不具合の箇所を確認し、前者と後者のいずれであるかまで把握できれば、修正を行いましょう。
    • 前者であればコマンドごとの動作を再度確認し、wikiの記述等を参考にして、そのコマンド構成で本当に自分が意図している動作になるのかを順番に確認してゆきます。
      • クリックで勝手に進行してしまう場合には、コマンド「待機」のオプション設定のミスである場合が多いです。
      • 意図しないテキストを表示している場合には、変数の代入値のミスや、マクロ機能の影響が考えられます。
      • 分岐ミスは変数の演算を見直してみましょう。
      • コマンド「ジャンプ」「スクリプト」の失敗は、スクリプトファイル名や栞名のミスを考慮しましょう。
      • コマンドの適用抜けは、対象名の指定ミスが考えられます。
        対象の複数指定時には特に発生しやすいです。スペースの挿入や、「,」の付与、「~」や「~」を先頭に付与している個体名への、先頭に対する「\」の付与等を再確認しましょう。
        スキップモードの仕様である場合もありますが、スキップモードで省略されるのは効果時間なので、設定から行われていない場合には対象名の不備を確認し、それでも確認できない場合には後者である可能性が考えられます。
    • 後者であれば制作者の方に報告し、修正を待ちましょう。
      報告の際には「発生状況」「不具合の内容」「debug.txt」「作品の制作用フォルダと内容物」を揃えて提出します。
  • 「BugTrap」が作動した場合にはエラーが致命的なものであるということなので、この場合にはエンジン制作者の方まで報告しましょう。
    報告の前に、まずBugTrapの画面にあるボタン「More...」を選択します。それによってバグ発生時の記録の一部が表示され、いくつかのボタンが展開されます。
    次に、展開されたボタンのうち、「Save...」と書かれているものを選択します。それによって、バグ発生時の状況を把握するためのファイルを収めたzipファイルが作成されるので、報告時にはそれと使用環境に関する説明文書(自分で作成します)とを併せて送りましょう。

デバッグを行うタイミングとは Edit

  • デバッグを行うタイミングはいくつかあります。
    可能であれば3回程度は行いましょう。
    • 各種画面のスクリプトが完成した段階
      タイトル画面等の各種画面は、スクリプトが完成したタイミングで確認しておきましょう。
      機能が増えるほど不具合が発生しやすくなるので、画面ごとに確認するように決めておけば、不具合を一度に修正しなければならないという事態を防げます。
    • すべてのコマンドを設定した段階
      コマンドが作品を通して意図どおりに動作しているかを確認します。
      コマンドを設定する度に確認するよりも、いくらかまとめて確認することをおすすめします。
    • 完成宣言直前
      作品の完成を宣言する前に、必ずデバッグを行いましょう。
    • 配布開始直前
      配布を開始する前に、仕上げとして不具合の確認をしておくことをおすすめします。
      特にzip化等の圧縮を行う場合には、解凍した作品のほうでも確認を行えば十分でしょう。


作品を出力しよう Edit

完成までもう少しです。ついに作品が形になります。


出力する作品のプログラム形式を知ろう Edit

  • 素材にファイル形式が存在したように、Light.vnで出力する作品にもプログラム形式が存在します。
    形式は、大別すれば2種類、細かく区別すれば5種類の形式を制作者側で選択できます。
    Ver4.5.0現在ではそのうちの4種類がベータ提供(正式には実装が完了していない形式)なので、基本的には「Windows(C++)」で出力することをおすすめします
    • 「C++」というプログラム言語を用いる形式
      これがLight.vnにおける作品出力の基本的な形式になります。
      対応OSは「Windows」で、対応バージョンは「XP」「7」「8」「10」で、「VISTA」は保証外です。
    • 「HTML5」というプログラム言語を用いる形式
      Ver4.5.0現在ではベータ提供となっています。
      対応OSは「Windows」「OS X(Mac系)」「Linux」で、「Browser」はブラウザ(あなたがこのページを閲覧するために用いているものです)での動作に適した形式となっています。
      正式実装となれば、配布形態の多様化が見込めます。

作品を出力して完成させよう Edit

  • 出力作品のプログラム形式を決めたら、いよいよ作品の出力に移りましょう。
    出力には、メニューバーの「ノベル」から「ノベル配布」に移動します。
    • 「ノベル配布経路」では、出力フォルダを作成する場所を指定します。
      手入力も可能ですが、右隣の「Browse(...)」を利用するほうが確実です。
    • 「ノベル配布形式」では、決めておいたプログラム形式を選択します。
      出力は何回でも行えるので、予定外の形式を試してみてもいいかもしれません。
    • 「Safe Modeで配布」とは、出力した作品がウイルス対策ソフト等にウイルスとして誤検出されないような構成の出力フォルダを作成します。
      ウイルス対策ソフトに誤検出されると、最悪の場合には作品のデータを消去されてしまうので、そのような事態を回避したい場合には適用しておくようにしましょう。
  • 項目を設定し終えたら、下部にあるボタン「ノベル配布開始」を押して出力を開始します。
    完了すれば、メッセージの表示とともに、ボタン「Cancel」が「Finish」に変わるので、それを押して配布用画面を閉じましょう。
  • 作品の公開後に「パッチ」と呼ばれる追加修正・コンテンツを作成したいという場合にも、「ノベル配布」でパッチの出力を行います。
    • パッチの作成時には、パッチに用いる素材をフォルダ「Patch」に収めておく必要があります。
      この際には既定のフォルダ内に子フォルダを作っている場合において、それをフォルダ「Patch」内にも再現しておく必要があります
      たとえば、フォルダ「Images」内に子フォルダ「ch」を作っている場合には、フォルダ「Patch」内のフォルダ「Images」にも、子フォルダ「ch」を作成する必要があります。
      ただ、基本的には既定のフォルダをコピーして、フォルダ「Patch」内に貼り付けて上書きすれば済みます。
    • パッチを作成すると、「ノベル配布経路」で指定したフォルダ内に「Patch.vndat」という名前のファイルが作成されます。
      このファイルを配布し、プレイヤーに作品のフォルダ内の最上層(「exe」のある層です)へそれを置くようにしてもらえば、パッチの適用は完了します。


作品の配布準備を整えよう Edit

ついに作品が完成しました……が、配布前にやっておきたい準備がいくつかあります。


配布形態は決めていますか? Edit

  • 作品の配布にはいくつか方法があります。作品に適したものを選びましょう。
    • 無料作品の場合
      フリーゲームとして配布するには、「自分のサイトにダウンロード経路を作る」「公開フォルダサービスを利用する」「外部フリーゲームサイトを利用する」「即売会等のイベントで配布する」等の方法があります。
      「自分のサイトにダウンロード経路を作る」場合には、自他共に安全性の問題を考慮する必要があります。
      「公開フォルダサービスを利用する」場合には、自身の作品が安全であるということを事前に証明していることが必要とされるでしょう。
      「外部フリーゲーム配布サイトを利用する」場合には、サイト側の審査に通る必要はありますが、安全性を保証してもらうことができます。
      「即売会等のイベントで配布する」場合には、実体としてパッケージを作成する必要があります。
      初めての作品である場合には外部のフリーゲーム配布サイトを利用し、問題を解決できるのであれば他の方法に移行するというのが好ましいでしょう。
    • 有料作品の場合
      有料作品として配布するには「自分のサイトにオンラインショップを作る」「有料作品販売用の外部サイトを利用する」「即売会等のイベントで販売する」等の方法があります。
      「自分のサイトにオンラインショップを作る」場合には、おそらくあなたはもはや同人作品制作者ではないはずです。同人活動であれば、この方法はおすすめしません。
      「有料作品販売用の外部サイトを利用する」場合には、サイト側の手数料や制作費用等を考慮して価格を設定しましょう。
      「即売会等のイベントで販売する」場合には、実体としてパッケージを作成する必要があります。
      初めての作品を販売するのはとても挑戦的ではありますが、金銭の取引には、たとえ少額であっても責任が生じるということも考慮しましょう。
      できれば無料作品で実績を重ねてから挑戦することをおすすめします。

お知らせは決して忘れないように Edit

  • すべての素材を自前で用意するというのはかなり難しく、ほとんどの作品には外部の素材が利用されています。
    そして、外部の素材を利用した場合には、可能な限りクレジット表記を行い、完成や配布を開始する際には素材の使用報告を行いましょう
    中には使用報告を不要とする素材制作者の方もいらっしゃいますが、いずれにせよライセンスの確認はどのような素材であっても必ず行うようにしましょう
  • ゲーム作品においては、慣例として「readme.txt」を作成して、作品に同封します
    「readme.txt」とは、最初のプレイ開始前においてプレイヤーに読んでもらう、ゲームの説明書です(実際に読むプレイヤーは少ないですが、決して不必要というわけではありません)。
    内容としては、「インストール方法」「アンインストール方法」「操作方法」「システム要件」「素材元情報」「制作者情報」等を明記します。
    システム要件には「動作を保証しているOS」として「Windows(XP,7,8,10)」と記述する程度でもよいでしょう。グラフィック要件として「OpenGL2.1以上」というのも記述しておけばとりあえず十分でしょう。
    素材元情報には、可能であればリンクとしてURLを併記しておきましょう。素材の制作者だけでなく、他のゲーム制作者にとっても素材探しの助けとなる場合があります。
  • 作品の宣伝は、できればやっておきたいものです。
    あなたも、共同制作者も、フリー素材等の制作者も、作品が世間に広く知られ、プレイされるほどに、知名度という利益を得ます。
    特にフリー素材等の制作者は、知名度の向上による利益が大きく影響します。たとえあなたからは遠い存在であったとしても、そのことを考慮し、宣伝によってまずは作品自体の知名度が少しでも上がるように努力しましょう。
    宣伝方法に関しては説明を省略しますが、過剰な宣伝は逆効果ですので、効果的かつ効率的な宣伝方法を模索してみてください。

公開後の動きを想定しておこう Edit

  • 配布形態を問わず、作品を公開すればなんらかの変化があります。
    感想を頂いたり、バグ報告を受けることもあるでしょう。
    修正対応以外にも、サイドストーリーの追加等、制作者側から動きたい場合もあるはずです。
    そのような変化を場当たり的にこなそうとすると、なんらかの失敗をする可能性が高まります。
    できれば公開前にそれらの変化を想定し、大まかでもいいので対応を考えておきましょう。


作品の配布を始めよう そして…… Edit

完成と配布開始、おめでとうございます!
返ってくるものを眺めながら、これまでを振り返ってみましょう。
そして、もしもまた作りたいと思えたなら……その時にはもう、世界のどこかにあなたの次作を待っている人がきっといますよ。