ユーザ独自のスクリプト ファイルをロードして実行する

小さなプロジェクトであっても、通常、必要なすべてのゲームプレイのコードを維持するために複数の Lua スクリプト ファイルが必要になります。たとえば、Appkit にはブート スクリプトがあり、さらにブート スクリプトで必要となるいくつかの追加のスクリプト モジュールがあります。

このページでは、ユーザ独自のスクリプト ファイルをゲームに確実に組み込み、そのファイル内のコードにブート スクリプトとカスタム フロー ノードの両方からアクセスできるようにするために必要な事項を説明します。

手順 1. リソース パッケージにスクリプトを追加する

Stingray エンジンは Lua スクリプトを他のデータ ファイルとまったく同じように処理します。使用する他のリソースと同様に、スクリプトをリソース パッケージに追加して、ゲームのランタイムでメモリにロードできるようにする必要があります。

パッケージの定義の詳細については、「ランタイムでコンテンツをロードおよびロード解除する」を参照してください。

手順 2. スクリプト パッケージをロードする

定義したリソース パッケージにスクリプトを追加したら、パッケージをどの時点でゲームプレイ コードにロードするかをエンジンで指定する必要があります。

通常、Lua スクリプトは小さく、ゲーム全体を通して活用することが多いため、1 つのパッケージにすべての Lua スクリプトをまとめて、初期化時にロードすることが必要になる場合があります。これを実行するには、次の操作を行います。

ただし、ゲーム内の異なる時点でメモリに異なるスクリプトをロードする場合は、複数のリソース パッケージに分けて、ロードとロード解除を別々に行います。重要なのは、Lua 環境にロードされた時点で既にメモリに格納されているという点です(次の手順を参照してください)。

手順 3. Lua ファイルを要求またはロードする

Lua ファイルがあるリソース パッケージをメモリにロードした後は、ゲームの Lua 環境に実装するまでこれらの Lua ファイル内の関数とデータを使用できません。

この処理を行うには、require()dofile() などのファイル解釈のための標準 Lua 関数を呼び出します。Lua スクリプト ファイルは Stingray リソース ID を使用して識別してください。これはデータ ディレクトリのルートを基準としたファイルの相対パスで、スラッシュが区切り記号であり、ファイル拡張子は使用しません

この処理は通常、初期化時に行われます。たとえば、カスタム ブート スクリプトを使用している場合、この処理はブート スクリプト内、またはブート スクリプトで要求された別のスクリプト内で実行します。Appkit を使用している場合は、project.lua スクリプト ファイルで実行することができます。ただし、必要に応じて、新しい Lua スクリプトのコンテンツを任意の時点でロードすることもできます。

次のスニペットは、パッケージをロードし、スクリプト ファイルのコンテンツを読み込み、最終的にシャットダウン時にパッケージをロード解除する方法を示します。

package = nil
...
function init()
    ...
    package = stingray.Application.resource_package("packages/myScripts")
    stingray.ResourcePackage.load(package)
    stingray.ResourcePackage.flush(package)
    require "main/scripts/gameplay"
    ...
end
...
function shutdown()
    ...
    stingray.ResourcePackage.unload(package)
    stingray.Application.release_resource_package(package)
    ...
end