Chapter 34

Tutorial 30 | Embedding Resource Files

Ryo Suzuki
Ryo Suzuki
2022.05.08に更新

30. Embedding Resource Files

この章では、アプリケーションの実行ファイルに画像や音声などのファイルを埋め込んで、それをプログラムで読み込む方法を学びます。

30.1 リソースファイル埋め込みの基本

Siv3D では、プログラムで使う画像や音声、テキストなどのリソースファイルを、実行ファイル (.exe や .app) に埋め込み、ユーザから見て単一のファイルになるようにまとめることができます。リソースファイルを実行ファイルに埋め込むと、アプリケーションの配布が簡単になるだけでなく、ファイルがユーザによって削除されたり、変更されたりすることを防ぐことができます。アプリケーションの実行ファイルにリソースファイルを埋め込む手順は次のとおりです。

Windows の場合

App/Resource.rc に、埋め込みファイルのパスを記述します。App/Resource.rc をソリューション エクスプローラー上で右クリックして「コードの表示」で開き、埋め込みたいファイルのパスを、ファイルごとに追記します。

次の画像では、example/windmill.png を埋め込みリソースとして追加しています。

初期状態の App/Resource.rc には、Siv3D の内部処理に必要な engine/ フォルダの各種ファイルが記述されています。それらに続いて、自身の埋め込みファイルを新しく記述します。.rc ファイルを更新したあとにプロジェクトをビルドすると .exe にファイルが埋め込まれます。

Windows 版では、一部の種類のファイルについて、埋め込みをすると正常に読み込めなくなるものがあります(VideoTexture で使う動画ファイルなど)。ワークアラウンドとして、一時ファイルに書き出す方法 があります。

macOS の場合

プロジェクトナビゲータにフォルダをドラッグし「Create folder references」を選択すると、プロジェクトナビゲータ上で青いフォルダアイコンになって表示されます。このフォルダ内のファイルはすべて .app に埋め込まれます。プロジェクトの初期状態では Siv3D の内部処理に必要な engine/ フォルダが青いアイコンになっています。

Linux の場合

Linux 版ではファイルの埋め込み機能はサポートされていません。代わりに、resources/ フォルダに、必要なリソースファイルを格納し、アプリケーションに同梱します。初期状態では、Siv3D の内部処理に必要な engine/ フォルダが resources/ フォルダに格納されています。

30.2 埋め込みリソースファイルを読み込む

埋め込まれたファイルをプログラムで読み込むには、これまでプログラムで U"example/windmill.png" と記述していたファイルパスを Resource() で囲み、Resource(U"example/windmill.png") のように書き換えます(Windows, macOS, Linux 共通)。

# include <Siv3D.hpp>

void Main()
{
	// 埋め込みリソースから読み込み
	const Texture texture{ Resource(U"example/windmill.png") };

	while (System::Update())
	{
		texture.draw();
	}
}

ファイルが正しく埋め込まれ、プログラムから読み込みできるかを確かめるには、ビルドされた実行ファイル単体を別のフォルダに移動させて実行し、埋め込みリソースの画像が表示されるかを調べれば OK です。

30.3 埋め込みリソースファイルの一覧を取得する

埋め込みリソースファイルの一覧を取得したい場合、EnumResourceFiles() を使うと、Array<FilePath> で得られます。ここに含まれるファイルが、Resource(...) によって読み込み可能なファイルです。

# include <Siv3D.hpp>

void Main()
{
	for (const auto& path : EnumResourceFiles())
	{
		Console << path;
	}

	while (System::Update())
	{

	}
}

30.4 埋め込みリソースファイルの制約

  • 埋め込みリソースのファイルは実行時に書き換えできないため、セーブファイル等の用途で使うことはできません
  • 埋め込みリソースのファイルはユーザが特殊な操作をすると抽出できるため、重要なファイルの隠蔽の用途には向きません。必要に応じて、難読化、暗号化などの処理を施してください