Twitter @HigenekoTwitter #XNA
浅春のみぎり、時下ますますご清祥の段、お慶び申し上げます。毎々格別のご愛顧を賜り、厚く御礼申し上げます。
………
ダメだぁ、もう丁寧な日本語が書けない体(どんな体よ?)になってる……。個人のブログは家でまったりと、机の上で寝ているねこさん達を撫でながら好好爺然として書いていますが、このブログは会社で書いているせいかテンションが高い?ので、日本のビジネスマナーである丁寧語や美辞麗句、甘言(?)といったもの抜きでサクサクと書いていこうと思います。
XNAフレームワークはゲームを作るのを目的としてデザインされたマネージド・クラスライブラリ群です。DirectXも、元々はゲームを作るためのライブラリとして設計されていたのですが、現在では多岐に渡る機能を詰め込んだ変わりに、非常に複雑化してしまい、遂にはDirectXはゲームエンジン作成者の為のライブラリとまで言われることが多くなりました。
また、DirectXではゲームを実際に実行しているとき(ランタイム)に使うAPIと、ゲーム開発時(オフライン)に使われるAPIの区別が明確ではない場合があり、間違った使い方をしてしまうと、実行速度が本来出せる性能の半分以下の性能しかだせないということがあります。
例えば、ID3DXMeshは手軽にXファイルの読み込みと表示ができるという触れ込みですが、うっかりOptimizeMeshやD3DXWeldVerticesといった関数を呼ぶのを忘れてしまうと、思わぬパフォーマンス低下に繋がります。
XNAチームの目標は、ゲーム製作者がプロジェクトを新規作成してから5分以内でゲームのコードが書けるということです。個人的にはこれを「玄関開けたら、5分でゲーム製作」と呼んでいます。
左図(クリックすると別ウィンドウで開きます)は、XNA Framework 1.0の構造図です。下から順に、プラットフォーム、コア・フレームワーク、拡張フレームワーク、そしてゲームといったレイヤに分かれています。
プラットフォームレイヤはPCやXbox360といったハードを効率よく使うためのネイティブな部分です。Xbox360上からは、セキュリティ上の問題からこの部分には直接アクセスできません。
その上にはXNAフレームワーク最初のレイヤであり各プラットフォームを仮想化するコア・フレームワークがあります。コア・フレームワークでは厳密にはプラットフォーム間での違いがありますが、その差は小さく、殆どの場合はPCとXbox360上で同一のコードで動作させることができます。
続いて拡張フレームワークですが、このレイヤではゲーム開発をより簡単にするための機能が提供てされています。ゲームのメインループを含むアプリケーション・モデルや、コンテント・パイプラインはここに位置します。
最後にゲーム・レイヤになりますが、ここにはゲーム製作者が作るゲームコードやコンテント、またコミュニティによって提供されるコンポーネントなどが位置しています。
以下に、それぞれの機能の概要を記します。
アプリケーション・モデル(Application Model)
ゲーム製作者がゲームを作ることに集中できる環境を提供しています。ウィンドウの初期化やメッセージハンドリング、タイマーの設定、GraphicsDeviceの初期化などをPC/Xbox360の両プラットフォームで同じ扱いができるGameクラス、コミュニティ間でコードの流用がしやすいように設計されているGameComponentなどのクラスがあります。
コンテント・パイプライン(Content Pipeline)
XNA独自の機能のひとつでユーザーの視点からすると、他のWindowsアプリケーション開発と同じ感覚で、テクスチャや3Dモデル、サウンドといったコンテントをプロジェクトに追加するだけでゲーム上で簡単に使えるというものです。表向きの便利さ同様に拡張性にも優れていて、独自のインポーターやプロセッサを用意することで自由にカスタマイズすることができ、PC/Xbox360の両プラットフォームで最適に動作するコンテントを容易に扱うことができます。
グラフィクス(Graphics)
Managed DirectX 2.0 (MDX 2.0)をベースとして、より使いやすく、.Netデザインガイドラインに則したものになりました。大きな変更点としては、固定機能パイプライン(FFP)の機能が外されました。これはFFPとシェーダーモデルでは、プログラミングモデルが大きく異なることと、Xbox360やDirectX10に見られるように将来的にシェーダーモデルが主流となると判断した結果です。
シェーダーモデルプログラミングを最初から組むのは難しいので、2D描画を簡単に行えるSpriteBatchや、3Dモデル描画用のBasicEffect、Modelなどのクラスが用意されています。
オーディオ(Audio)
XNAのオーディオサポートは、XACTというPC/Xbox360両プラットフォームに対応しているサウンドライブラリを使用しています。GSEに付属しているXACTオーサリング���ールで、サウンドバンクやウェーブバンクといったパッケージを作ることができ、そのパッケージを使うことで簡単に効果音やBGMを鳴らすことができます。ウェーブデータの圧縮にはPC上では圧縮率4:1のADPCMが使え、Xbox360上ではWMAをゲーム用にカスタマイズした圧縮率が6:1~12:1のXMAが使えます。
入力(Input)
XNAではXbox360用のコントローラーと、キーボードをPC/Xbox360の両プラットフォームで使うことができ、PC上でマウスを使うことができます。イベント駆動式ではなく、フレーム毎にステートをチェックするという形式になっています。振動機能はGamePad.SetVibration関数でXbox360コントローラーの左右に内蔵されている振動用のモーターを速度を自由に変更できるようになっています。
数学(Math)
Vector2、Vector3、Vector4、Matrix、そしてQuaternionと言った基本的な構造体の他にBoundingBox、BoundingFrustum、BoundingFrustum、Ray、Planeといったプリミティブがあり簡単な衝突判定に使えるようになっています。特にBoundingFrustumはビュー、プロジェクション行列から生成することができるので、オブジェクトの可視判定に最適です。
従来のDirectXやMDXとの最大の違いとして、右手座標のみのサポートがあります。これは、コードを開発者の間で流用する時に右手、左手の両方があると、余計な混乱の元になるとの判断からです。
ストレージ(Storage)
ゲームでのセーブデータの保存、読み込みをサポートするためのもので、PC/Xbox360の両プラットフォームで使用可能です。Xbox360上ではHDD、メモリカードのどちらにもデータを保存することができます。PC上でのセーブデータの上限はOSに依存しますが、Xbox360上では最大2GBまでのデータの保存ができます。
以上がXNAフレームワークの概要です。次回からは、それぞれの機能の詳細を紹介します。
参照リンクXNA Team Blog "What is the XNA Framework"http://blogs.msdn.com/xna/archive/2006/08/25/724607.aspx
私がXNAチームに入ったのは、去年の2月でした。それまでは1993年のボンバーマン'94を初めとして、ブルートフォースといったゲーム開発に15年近く携わってきました。
ゲームをするのも作るのも好きなので、いつも楽しみながらゲーム製作をしてきました。ですが、肥大化する昨今のゲーム製作現場では、ツール製作といったゲームに直接関係の無い作業に長時間掛かることが日常になり、それがあまりに長くなりすぎて自分の本業がゲームを作ることなのか、ツールを作ることなのか判らなくなることが少なからずありました。
昔は、開発チームの人達と「こんなことができたら、面白いよね」、「じぁ、やってみようよ」といった感じで、思いついたアイディアを直ぐに試すことができたのですが、今のゲーム製作現場ではそれは難しいことになってしまいました。ゲームの肥大化に伴い、制作費も大きく膨れ上がり、会社としても危険を冒してまで新作を投入するよりも、既に売れているゲームの続編を出すけど、ユーザーは代わり映えのしないゲームから離れていってしまう。
これは、ちょっとヘンだぞ、なんとかしなければ
と、常に考えるようになったときに偶然出会ったのが、XNAプロジェクトでした。それまではXNAってなんだかよく分からないものだったのですが、プロジェクトリードのBoyd Multerer氏に会って、その構想を聞いたときに「自分が探していた答えはこれだっ!」と確信し、XNAチームに入ることになりました。
個人的にXNAが目指すべき目標は「ゲームを楽しみながら作れる」環境を提供することだと思います。違う言い方をすれば、XNAを使った人達がゲーム作りに集中できるような環境を提供することです。
現段階ではまだまだ足りない部分が多いXNAですが、XNAを使って下さる皆さんが少しでも、ゲームを作るのはたのしいと感じていただければ幸いです。たのしくないぞ、と感じた方には今後の改善のために、お手数でも意見をお聞かせ願えれば幸いです。
XNAのフレームワーク開発に携わっている伊藤雄一です。
日本語での情報が少ない、英語ドキュメント を読むのに時間が掛かる、xnaでどうやってゲーム作るの?と、いった疑問や問題を少しでも少なくする為に微力ながらも力になれればと思い、このブログを開設しました。
しばらくは、XNAでゲーム開発する上での注意点などを載せていこうと思いますが、取り扱ってほしい話題などがあれば、気軽にコメントしてください。
ちなみにブログタイトルの"ひにけにXNA"ですが、ひにけには"日に異に"と書き、日ごとにますます、日ごとに変わっていく、毎日等の意味があります。
XNAが日ごとに進化してほしい、毎日のようにXNAを使ってほしい、という意味を込めて"ひにけにXNA"というタイトルにしました。