回答:
商用のコンソールゲーム開発では、ビルドシステムを360、PC、PS3を同時に対象とするように設定することは苛立たしいことですが、それほど難しくはありません。360開発キットは、Visual Studioといくつかのツールの新しい新しいターゲットであり、標準のWindows MSVC ++コンパイラと非常によく似たコンパイラを使用しています。PS3はGCCコンパイラのバックエンドを使用しますが、ビジュアルスタジオのフロントエンドに簡単に接続できます。ゲームプレイと一般的なユーティリティコードの場合、3つのプラットフォーム間で99%同一のコードを使用できる可能性があります。GCCとMSVC ++の間にはいくつかの非互換性がありますが、幸運なことに、それらをLinuxで動作させた場合(PS3に近いgccバージョンを使用していると仮定した場合)は、その上、それほど問題にはなりません。通常、コードの最後の1%はkludgy #definesで修正できます。
基本的なビルド手順を過ぎると、大きなハードルはゲームのグラフィックスシステムと高性能要素です。これらの要素については、実際にはプラットフォームのカスタムコードを作成するか、既存のエンジンを使用することになります。メモリは大きな問題になりますが、それは別の質問です。私が取り組んだ商用プロジェクトでは、元のPCソースのコンソールバージョンをかなり簡単に作成できましたが、実際にうまく機能させることは、まったく別の問題でした。
iPhoneも統合したい場合は、何らかの既存のエンジン/ミドルウェアソリューションを使用することをお勧めします。iPhoneでのopenGL +目標Cのセットアップは、他のどのプラットフォームともあまりうまく適合しません。これはApple側の選択であり、iPhoneアプリケーションでインタープリットされたミドルウェアの使用を非常に妨げているためです。
ほとんどのプラットフォームでは、実行しているプラットフォームから情報を呼び出して取得するために使用される特定のAPIから抽象化するサブシステムを作成できます。通常、IO APIは抽象化が最も簡単です。すべてのファイルシステムは、非同期呼び出しを考慮した場合でも、ファイルのオープン、クローズ、および読み取りに関するかなり基本的な仮定に基づいて動作します。次に、コントローラ入力の読み取り、時間のクエリ、メモリとスレッドプリミティブへのアクセスなどのコアシステムがあり、それらのほとんどは同じように動作します。
グラフィックでさえ、大部分を抽象化することができ、実際、ほとんどの優れたエンジンでは抽象化できます。しかし、「レンダリング可能な」ものをブラックボックスにパッケージ化して、それらの内部で何が行われているのかを知ることができないようにする必要があります。あなたはあなたが世界の特定の位置にレンダリングする「もの」を持っていることを知っています。それがどのようにレンダリングされるかはわかりません。また、グラフィックス抽象化レイヤーは、画面上に表示するすべての詳細を処理します。プラットフォーム固有のビルドパイプラインは、内部での表現方法を実際に知らなくても、エンジンから参照できるようにグラフィックデータをパッケージ化します。
ただし、実際にゲームを出荷する場合は、抽象化できない部分があります。入力メカニズム、基本的な操作方法、プラットフォーム機能があまりにも異なるため、iPhoneでも360またはPS3と同じコードを出荷できると考えるのはばかげています。360でiPhoneサイズのタイトルを作成することもできますが、360がサポートできるものだけに入力メカニズムを制限する必要があります。したがって、指をシミュレートする画面上の仮想カーソル、およびおそらく3D加速度計入力が使用されるジョイスティックを使用します。
より賢明なことに、タイトルの大部分が異なっていても、ゲームの一部を再利用可能な方法で記述でき、個々のコードモジュールをプラットフォーム間で移植できます。たとえば、AIステートマシンがある場合、それが360、PC、iPhoneのいずれで実行されているかは問題ではありません。ゲームはそのようなコンポーネントを多く使用し、それらが明確に定義された入力と出力を取得するように適切に設計されている限り、プラットフォームに関係なく、ゲームの残りの部分をそれらの周りにラップして、それらを書き直す必要を回避できます。コンポーネント。
この再利用性は、すべてのプラットフォームで機能する万能のエンジンを探すのではなく、クロスプラットフォーム開発の鍵です。そのようなことが存在していたとしても、最低限の共通点に取り組む必要があるので、それはとても不自由になり、ゲームを作るのにあまり役に立ちません。