ぼく用あれこれまとめ
プロジェクトのディレクトリ構成
最終更新:
bokuyo
-
view
プロジェクトのディレクトリ構成
- ゲームを作り慣れていないぼくは普段ディレクトリ構成について何も考えません.
- しかし、ゲームが完成にせまるにつれて、ちょっとしたミニゲームでさえ、ファイルの管理が面倒になってきます。
- VC++のデフォルトのソリューション/プロジェクトディレクトリの構成はとても見にくいです。
- ファイルがどこにあるのかわけがわからなくなるのを防ぐために、ぼく用ディレクトリ構成のルールをまとめていきたいと思います。
- このことについて指摘している本は「ゲームコーディング・コンプリート(著: マイク・マクシャフリー)」(pp.87-90)です。
- 本の中で紹介されている内容をもとに小・中規模ゲームで使いやすそうな感じで考察してみます。
- なおwikiの都合上、「\」が「円マーク」ではなく、「バックスラッシュ」で表示されてるかもしれません。
- Windows 環境を想定して書いているので円マークでおっけーです。Mac OSX, Linux 環境でもディレクトリ構成はそのまま適用できるかと思います。
- Visual C++ 2010 Express 対象のページです。
- 追記:今見返すと、このページの内容は古いですね…。機会を見て新しく書き直します。(2013/03/26)
- Data じゃなくて Assets ディレクトリとかどうでしょう?
- (Source ディレクトリに Obj があるのもなんだか気持ち悪いですね。ごめんなさい。)
マイク・マクシャフリーさんが提案するディレクトリ構成
- Docs
- Media
- Source
- Obj
- Debug
- Releace
- Bin
- Data
- Test
- Data
それぞれディレクトリの中身の説明
Docs
- 仕様書・設計書
- 参考資料
Media
- 未加工のグラフィックス・オーディオ・サウンドファイル
Source
- ソリューションファイル
- ソースコード
Obj
- Debugビルド・Releaseビルド
- VC++のdefaultの設定だとプロジェクトファイル内に含まれてるので変更する必要あり。
Bin
- ゲームデータ、構成ファイル全て。
- Releaseビルドと.DLLを入れ、Dataディレクトリ以下にスクリプトからグラフィックス・サウンドまでを入れる。
- これを配布すればいい。
Test
- テスト用のBinディレクトリ。
- テストデータやログ、動作を見てない生まれたてのReleaseビルドもすべてここにいれてテストを行う。
じゃあ実際に、Visual C++ 2010でゲームを作るときのディレクトリ構成って?
- 日本語版ゲームコーディング・コンプリートでは、Visual Studio 2005 環境となってる。
- ぼくは「Visual C++ 2010 Express」を使ってるので、その環境で実際にディレクトリ構成を考えるなら?…ということで。
ゲームを作る人(プログラマ・グラフィッカ・その他もろもろ)にとって理想的な共有ディレクトリとは?
- Sourceディレクトリをコピペですぐに移動できる。ソースファイルを移動してもたいして問題ない。
- VC++2010にとって、便利だけどくそみたいにデカブツなインテリセンスデータベースをSourceディレクトリ外に置く。
- ソリューションはSourceディレクトリ内にあるべきか、ルートディレクトリに置くべきか。
- プロジェクトファイルを頻繁に入れ替えたりすることはめったにない。
- ルートディレクトリに置いておくと、すぐにソースを開ける。
- ソリューション自体はそこまで重要じゃない。基本プロジェクトファイルが全権握ってるようなもの。気にしなくていい気がする。
- ってことはやっぱりルートディレクトリ?
- うーん、でも、グラフィッカがソリューションを開くことはないから、普通にSourceで良い気がする。
- Sourceディレクトリをコピペしただけでプログラムを移動できるんだから、ソリューションファイルもSourceディレクトリ内に。
- インテリセンスデータベースはルートディレクトリ?Sourceディレクトリ?それともルートディレクトリ外に置くべき?
- Sourceディレクトリに置くと、Sourceディレクトリをコピペしたりするのが厄介になる。
- ルートディレクトリ外に置くと、管理がめんどくさくなるかも?
- ルートディレクトリに、Intellisenseディレクトリを作って、そこに置くようにするとか。共有するときは、Intellisenseディレクトリを削除すればいい。
- .objファイルは誰が持つの?
- プロジェクトファイルが複数なることも予想すると。Source>Project名>Debug/Releaseでもたせておいたほうがいいかも。
で、ぼくの結論!Visual C++ 2010 でゲームを作るときのディレクトリ構成!
(太字はディレクトリ名, 斜体はファイル名, 括弧内はディレクトリ内の説明)
- Bin
- Data
- (Binディレクトリごと配布する. )
- Docs
- (設定資料とか仕様書とか)
- Media
- (未加工のリソースファイル)
- Obj
- Debug
- Releace
- (ビルドした実行ファイルはここに生成される. ここが出力ディレクトリとなる. )
- Source
- <SolutionName>.sln
- <ProjectName>
- <ProjectName>.vcxproj
- Obj
- Debug
- Release
- (中間コードは各<ProjectName>ディレクトリ内のObjディレクトリが持つ. ここが中間ディレクトリとなる. )
- Test
- Data
- (デバッグはここで行う. ここが作業ディレクトリとなる. )
Visual C++ 2010 上で実際に設定してみる
プロジェクトファイルの各ディレクトリのパスを設定
出力ディレクトリ | $(SolutionDir)..\Obj\$(Configuration)\ |
中間ディレクトリ | $(ProjectDir)Obj\$(Configuration)\ |
作業ディレクトリ | $(SolutionDir)..\Test\ |
- これでビルドのパスはおっけー。
ソリューションのインテリセンス周りを設定
- ちなみにインテリセンスの設定はソリューションごとの設定ではなくVisual C++の環境設定みたいです。
- 詳しく知らないのであとで調べときます。
- VC++2010のインテリセンス周りのデータはでかいので、マイドキュメント内にあるVC++2010のデフォルトフォルダにでも置くことにします。
イメージ図
- My Documents
- Visual Studio 2010
- IntelliSense
- <SolutionName>-(16進数が8つ)
- <SolutionName>.sdf
- ipch
- <ProjectName>.ipch
- (VC++2010の入力補完機能「インテリセンス」関連のデータベースはここに置きます. )
- <SolutionName>-(16進数が8つ)
- IntelliSense
- Visual Studio 2010
具体的な設定手順
- ツール>オプション>テキストエディタ>C/C++>詳細>フォールバック位置
常にフォールバック位置を使用 | Trueを選択 |
フォールバック位置の使用を警告しない | Trueを選択 |
フォールバック位置 | C:\Users\Owner\Documents\Visual Studio 2010\IntelliSense\ |
- Visual Studio 2010のデフォルトフォルダ内に
- わざわざフォルダを作らずとも、指定しておけば勝手にVC++さんがフォルダを作ってくれるので場所だけ指定でおっけー。
- 毎回ソリューションを開くたびに「適切なフォールバック位置使っちゃうよ」ってVC++さんが訊いてくるようになるから、「警告しない」をTrueにする.
- 以下のような感じで、マクロと、相対パスは上手く使えるかちょっと不明。
フォールバック位置 | $(SolutionDir)..\Intellisense\ |
- 相対パス使えない??もしくはマクロ使えない??
- ソリューションごとではなく、VisualStudioのエディタさんごとの環境設定だから??
- 相対パス使えない??もしくはマクロ使えない??
- ちなみに、フォールバック位置が不適切だったら、VC++さんが上手くしてくれる。
- 基本は指定したフォールバック位置のディレクトリ内にちゃんとしたディレクトリを作ってくれる.
- 指定したフォールバック位置が正しくなかったら、C:\user名\AppData\Local\Temp\VC++\内にインテリセンスデータベースが作られる
ディレクトリのパスの設定をして以下の警告が出たら
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(298,5): warning MSB8004: Intermediate ディレクトリの末尾がスラッシュではありません。Intermediate ディレクトリが適切に評価されるようにするために、このビルド インスタンスによってスラッシュが追加されます。 1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(299,5): warning MSB8004: Output ディレクトリの末尾がスラッシュではありません。Output ディレクトリが適切に評価されるようにするために、このビルド インスタンスによってスラッシュが追加されます。
- 出力ディレクトリ・中間ディレクトリの設定の場合、ディレクトリパスの最後に「\(円マーク)」をつけなければならない。
- 例:「..\Bin」ではなく「..\Bin\」
- 余談ですが、ゲームコーディング・コンプリート p.92では、末尾に「\(円マークもしくはバックスラッシュ)」が入ってません。
- VC++2005の仕様かな?
Visual C++ 2010 (ちなみにぼくが使ってるのは"Express")の設定関連について。
VC++2010で設定できるディレクトリ
ディレクトリ名 | どこのこと言ってるの? | デフォルト設定 |
出力ディレクトリ | 実行ファイル(.exe)を出力する場所 | $(SolutionDir)$(Configuration)\ |
中間ディレクトリ | 中間ファイル(.obj)を出力するところ | $(Configuration)\ |
作業ディレクトリ | VC++内でデバッグするときに、リソースをどこから読み込んでくるか? | $(ProjectDir) |
- それぞれの設定方法は、プロジェクトのプロパティ>構成プロパティ>全般orデバッグ
- 作業ディレクトリの設定だけ、「プロジェクトのプロパティ>構成プロパティ>デバッグ」
- プロパティシートで作業ディレクトリの設定とかできるのかな?
Visual C++ ディレクトリ設定マクロ
$(SolutionDir) | .slnファイルが置いてるところに~ |
$(Configuration) | "Debug"もしくは"Release"という名前のフォルダ。ビルド時の構成で切り替えてくれる。 |
$(ProjectDir) | .vcxprojファイルが置いてるところに~ |
インテリセンス(IntelliSense)
- クラス名やメソッド名、メンバ変数などの候補を即座に出してくれるのは、この機能のおかげ。
- .sdf形式のやつがそれ。
- VC++2010ではインテリセンス機能がかなり進化して、今までよりも補完がかなり利くようになったらしい。
- ヘッダをプロジェクト読み込んだ瞬間に解析してるため、作業中スムーズに補完が行われる。
- GUIの下部で「インクルードファイルを解析しています。」と出ているのがそれ。
- ただしそのせいで、インテリセンスのデータベースはサイズがでかくなっている。
- 余裕で50MBは超えるという恐ろしい時代。
- ヘッダをプロジェクト読み込んだ瞬間に解析してるため、作業中スムーズに補完が行われる。
インテリセンス関連のファイルを別に保存させる
- ツール>オプション>テキストエディタ>C/C++>詳細>フォールバック位置
ソリューションを開いたときに警告が出る
参照データベースと IntelliSense ファイルに適切な場所が見つかりました Visual C++ でソリューション "C:\[Solution名]\Source\○○.sln" の参照データベースおよび IntelliSense ファイルを格納する適切な場所が見つかりました。 C++ 詳細オプションで 'フォールバック位置' が指定されなかったため、Visual C++ は一時ディレクトリの使用を試みています。 Visual C++ でフォルダー "C:\Users\Owner\AppData\Local\Temp\VC++\○○-4efddb37" が検証されました。以下の理由により、このフォルダーは適切です: ディレクトリがローカル ドライブ上にあります。 'フォールバック位置' は C++ 詳細オプションで構成できます。 この場所を使用するには、[OK] をクリックします。 このセッションで C++ 参照情報と IntelliSense を無効にするには、[キャンセル] をクリックします。
- ツール>オプション>テキストエディタ>C/C++>詳細
フォールバック位置の使用を警告しない | TRUE |
- 以上の設定で警告は出なくなります。ですが根本的な解決にはなってないような…。どうなんでしょう?
Visual C++ 2010 的な関係図
ファイル構成
- ソリューション(.sln)
- プロジェクト(.vcxproj)
- プロジェクト(.vcxproj)
- …
具体的なディレクトリ構成
- ソリューション(.sln)
- プロジェクトAディレクトリ
- A.vcxproj
- プロジェクトBディレクトリ
- B.vcxproj
- …
Ogre 3D を参考にしてみる
- CMake
- Docs
- api
- licenses
- manual
- src
- Components
- PlugIns
- Main
- include
- src
- obj
- Debug
- Release
- RenderSystems
- Direct3D9
- include
- src
- Direct3D10
- Direct3D11
- GL
- GLES
- Direct3D9
- Samples
- サンプルの数々とその実装コード
- Tests
- 単体テスト用コードはここに入れる
- Main
- include
- src
- Tools
- Maya, 3dsmax, Blender 間のファイルのエクスポート用ツール、あるいはXMLコンバータなど入れておくとこ、
- ReadMe
いろいろメモ書き
- include と src でヘッダとインプリメントファイルを分けている。(src には.cppファイルが、include には.hファイルが)
- Main (Ogre3D では OgreMain ディレクトリとなっている)のほうには数学ライブラリから例外処理、メッシュからライティングまでいろいろ入ってる。
- それに対して、RenderSystems のほうで実際に使用するデバイス周りのクラスが定義されてる。
参考文献
- ゲームコーディング・コンプリート(著: マイク・マクシャフリー)(pp.87-90)
- 大変参考になります。おすすめの一冊です。
- MSDN Advanced, C/C++, Text Editor, Options Dialog Box