パッケージのロードとロード解除

現在、リソース パッケージをロードおよびロード解除するには、Lua スクリプト API を使用する必要があります。必要なほとんどの関数は、stingray.ResourcePackage オブジェクトを通して取得できます。

注: 次に示すコードを使用してリソース パッケージ内で定義されたリソースをロードする前に、.package ファイル自体をメモリにロードする必要があります。.package リソースをブート パッケージ、またはブート パッケージによってロードされる別のリソース パッケージに含めます。「ブート パッケージについて」を参照してください。

瞬時のロード

ゲームを動かしたり、何か他のことを実行したりするために、リソース パッケージをすぐに利用できるようにする必要がある場合は、次の一連の呼び出しを使用します。

-- Create a resource package object from a package file named "levels/city_resources.package"...
local city_package = stingray.Application.resource_package("levels/city_resources")

-- Initiate loading the package...
stingray.ResourcePackage.load(city_package)

-- Make the package contents available in the game,
-- blocking the current thread until the package is fully loaded...
stingray.ResourcePackage.flush(city_package)

スプラッシュ画面やロード中の画面など、ゲームで表示される最初のデータのリソースをロードするには、この瞬時のロード方式を使用しなければならない可能性があります。ただし、これらのリソースがブート パッケージに既に含まれている場合は除きます。

非同期ロード

ResourcePackage.flush() の呼び出しを後のフレームまで遅らせると、バックグラウンドでリソース パッケージのロードを継続しながら、ゲーム内で他のタスクを引き続き行うことができます。こうすると、コンテンツをロードするときにゲームがフリーズすることなく、ゲームプレイ中にコンテンツをメモリにスムーズにストリーミングできます。

ResourcePackage.has_loaded() を呼び出して、フレームごとにパッケージのロードが完了しているかどうかを確認します。この関数が true を返した場合は、ResourcePackage.flush() を呼び出して、リソース パッケージをゲームに取り込みます。たとえば、次のようになります。

-- Create a resource package object from its resource name...
local city_package = stingray.Application.resource_package("levels/city_resources")

-- Initiate loading the package...
stingray.ResourcePackage.load(city_package)

...

function update()
    if stingray.ResourcePackage.has_loaded(city_package) then
        stingray.ResourcePackage.flush(city_package)

        -- Create the level and continue the gameplay
        ...
end

stingray.Application.resource_package() の代わりに、stingray.Application.resource_package_from_url() を使用してインターネット上の場所からバンドル パッケージ コンテンツをダウンロードすることもできます。この場合、ダウンロード時間が予測できないこともあるため、バンドルのダウンロード中にゲームが反応しなくなる問題を回避するために、この非同期ロード方法を常に使用する必要があります。

ロード解除

リソース パッケージをロード解除する前に、このパッケージに含まれているリソースがゲーム内で使用されなくなっていることを確認します。たとえば、パッケージに含まれているユニット リソースに基づいてスポーンされたユニットは、破壊する必要があります。

パッケージをロード解除するには、ResourcePackage.unload() 関数を呼び出して、ロード解除するパッケージ オブジェクトを指定します。常に、パッケージが不要になったことを確認してから、ゲームをシャットダウンするまでの間に Application.release_resource_package() を呼び出してください。

たとえば、次のようになります。

stingray.ResourcePackage.unload(city_package)
stingray.Application.release_resource_package(city_package)