XCodeでゲームを作るときは、 OpenGL ES Application のプロジェクトテンプレートを使って作るのだが、最初に作り始めるまで改造するところが結構多い。
プロジェクトテンプレートとはこれのこと。
XCodeで新規プロジェクトの作成を選ぶと出て来る画面。
ここに、自分で作ったファイルやシェーダを持つプロジェクトテンプレートを追加したい。
※googleで調べて出て来る情報は、XCode3 と XCode4 とが混在していて、バージョン違いでいろいろ変わるようなので要注意。
ここではXCode4 でのやり方を示す。
プロジェクトテンプレートが定義されている場所は、
/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/Application
である。
(とても紛らわしいが、/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application というディレクトリもあり、これは今回使わないので要注意)
ここを見ると、プロジェクトテンプレートが全部入っているのが分かる。
ここにある、OpenGL ES Applicationj.xctemplate をコピーして書き換えて作ってみようという話。
中身はこうなっている。
中身は、プロジェクトを作成したときに生成されるファイル群と同じ。プロジェクト名のところが変数っぽくなっているだけが違い。
これをコピーする。
コピー先はこことは全然別の場所で、
ホームディレクトリ/ライブラリ/Developer/XCode/Templates/
である。
とりあえずここに
OpenGL ES Application.xctemplate
をコピーして置く。名前は
fd Application.xctemplat
とする。
この状態でXCodeを開き、プロジェクトの新規追加を行うと、
というふうに反映される。(XCodeの再起動とかも必要ない)
しかしこのままだと、OpenGL ES Application が使えなくなっている。
fd Applicationが上書きしてしまったようだ。
両方を使えるようにする必要がある。どこかにID的なものが記述されているはずで、それを別名に変える必要がある。
fd Application.xctemplate/TemplateInfo.plist
を開く。
OpenGLESで検索。78行目に
com.apple.dt.unit.OpenGLESApplicationという箇所がある。これを適当に
com.apple.dt.unit.fdApplicationとでも書き換える。
すると、OpenGLES Application と fdApplication がそれぞれXCodeで使えるようになる。
ではいよいよテンプレートを記述していく。
すでにあるファイルの中身を書き換えたり、ファイル名を変えたり。
またファイルを新たに追加する。
ファイル名の変更をしたら、TemplateInfo.plist の中で、ファイル名の変更前から変更後に置換する。
例えば、ViewController を .m から .mm に変えた場合、 viewcontroller.m で検索引っかかったところの拡張子を全部 .mm に変える。これをしないでXCodeで作った場合、 .mm 名のファイルが作られるが、中身が空っぽということになる。
また、ファイルを追加した場合は、(12行目以降の)ファイル名とパスの組の部分に記述を追加。
EAGLView.m
Path
EAGLView.m
さらに、(120行目あたり)ノード配列の部分にも記述を追加
EAGLView.mこれで、新たなファイルがテンプレートに追加されるようになる。
(ソースやヘッダだけでなく、jpgも追加できることを確認。)
(ただし、EAGLView.m らと同じディレクトリに置いていないとコピーできなかった。ディレクトリを掘った場所に置いていたら、コピーができなかった。なぜかはよくわからない)
あと、***AppDelegate.m/h だが、これらはなぜかテンプレートディレクトリ内にファイルが置いていない。
TemplateInfo.plist を良く読むと、この中にAppDelegate 内の関数定義などが一部書いてある。
どうやら、大本となる***AppDelegate.m/h の定義はどこか他から取ってきていて、そのうち一部のメソッドやらをTemplateInfo.plist の記述で上書きしているようだ。
この大本がどこにあるのかはまだ不明。
だが、TemplateInfo.plist 内の***AppDelegateのメソッド定義を全部削除し、他のファイルと同様、ファイル名とパスの定義だけのものに差し替えたら、(もちろんテンプレートディレクトリに***AppDelegate.m/hファイルを置く)ちゃんとそちらの定義が上書きされた。
(ただし、***AppDelegate.mm ファイルを使おうとしたら、***AppDelegate.m を上書きしないので、プロジェクトを作成したときに ***AppDelegate.m と ***AppDelegate.mm の両方が作られてしまった。)
PR