<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ひにけにXNA : コンテント・パイプライン</title><link>http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx</link><description>Tags: コンテント・パイプライン</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>アバターを使おう その4:カスタムアニメーション</title><link>http://blogs.msdn.com/ito/archive/2009/07/21/avatar-4.aspx</link><pubDate>Wed, 22 Jul 2009 04:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9844163</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ito/comments/9844163.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9844163</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://creators.xna.com/en-US" target=_blank mce_href="http://creators.xna.com/en-US"&gt;Creators Club Onlineサイト&lt;/A&gt;でアバターの&lt;A href="http://creators.xna.com/en-US/news/customavataranimations" target=_blank mce_href="http://creators.xna.com/en-US/news/customavataranimations"&gt;カスタムアニメーション関連のサンプル等が公開&lt;/A&gt;されました。内容的には以下の三つになります。いずれもプレミアムコンテントになっているので、ダウンロードするにはCCO会員になっている必要があります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://creators.xna.com/en-US/sample/customavataranimation" target=_blank mce_href="http://creators.xna.com/en-US/sample/customavataranimation"&gt;Custom Avatar Animation Sample(カスタムアニメーションサンプル)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://creators.xna.com/en-US/utility/avataranimationrig" target=_blank mce_href="http://creators.xna.com/en-US/utility/avataranimationrig"&gt;Avatar Animation Rig(アバターアニメーション生成用のリグ)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://creators.xna.com/en-US/utility/avataranimationpack" target=_blank mce_href="http://creators.xna.com/en-US/utility/avataranimationpack"&gt;Avatar Animation Pack(アバターアニメーションパック)&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Custom Avatar Animation Sample&lt;/H3&gt;
&lt;P&gt;このサンプルではアバターを自分のゲーム内で自由にアニメーションさせるための有用な情報が提供されています。3Dモデリングツール上でアニメーションリグを使って作ったアニメーションデータを作り、カスタムコンテントプロセッサーを介してFbxファイルから読み込み、CustomAvatarAnimationPlayerを使って任意のアニメーションをゲーム内で再生するという流れになっています。&lt;/P&gt;
&lt;H3&gt;&lt;/H3&gt;
&lt;H3&gt;Avatar Animation Rig&lt;/H3&gt;
&lt;P&gt;キャラクターアニメーションを作るときにひとつひとつのボーンをアニメーションさせるのは非常に面倒で時間の掛かる作業なので、その作業時間を軽減するためにリグ(Rig)と言われるものを使います。ここでは&lt;A href="http://usa.autodesk.com/adsk/servlet/index?id=7635018&amp;amp;siteID=123112" target=_blank mce_href="http://usa.autodesk.com/adsk/servlet/index?id=7635018&amp;amp;siteID=123112"&gt;Maya&lt;/A&gt;と&lt;A href="http://www.softimage.com/products/modtool/" target=_blank mce_href="http://www.softimage.com/products/modtool/"&gt;Softimage Mod Tool&lt;/A&gt;用のアニメーションリグをダウンロードすることができます。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_2.png" target=_blank mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=avatar-rig02 border=0 alt=avatar-rig02 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_thumb.png" width=643 height=484 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_thumb.png"&gt;&lt;/A&gt; &lt;BR&gt;Softimage Mod Toolの画面&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_2.png" target=_blank mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=avatar-rig border=0 alt=avatar-rig src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_thumb.png" width=581 height=484 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_thumb.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;BR&gt;Maya 2008上での画面&lt;/P&gt;
&lt;H3&gt;Avatar Animation Pack&lt;/H3&gt;
&lt;P&gt;これはゲームなどでよく使われるアニメーションデータをダウンロードすることができます。アニメーションデータはFbxファイル、Maya、そしてSoftimage Mod Tool用の三種類のファイル形式が用意されています。&lt;/P&gt;
&lt;P&gt;アニメーションは21種類あり、歩く、走る、ジャンプといった基本的な移動アニメーションの他にも座る、倒れる、泳ぐといったものがあるので、アニメーションを作るときに参考にしたり、ゲームの雛形を作るときに仮データとして使えます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9844163" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_397DCB4E_/default.aspx">紹介</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/Xbox360/default.aspx">Xbox360</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.1/default.aspx">XNA 3.1</category></item><item><title>自動XNBファイルシリアライズ</title><link>http://blogs.msdn.com/ito/archive/2009/06/15/automatic-xnb-serialization.aspx</link><pubDate>Tue, 16 Jun 2009 05:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9757683</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/ito/comments/9757683.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9757683</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;コンテントタイプライター/リーダーを書くのは面倒&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;XNA Game Studioのコンテント・パイプラインでのデータの流れは下図のようになっています。オフラインプロセスは開発しているVisual Studio上でビルドしたときにWindows上で処理されるプロセスで、オフラインプロセスはWindows、Xbox 360、Zune上でゲームを実行したときに処理されるプロセスです。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/automaticXNBserialization_D3C8/cp-001_1.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/automaticXNBserialization_D3C8/cp-001_1.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="cp-001" border="0" alt="cp-001" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/automaticXNBserialization_D3C8/cp-001_thumb_1.png" width="552" height="772" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/automaticXNBserialization_D3C8/cp-001_thumb_1.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;元からサポートされているデータをそのまま扱う場合には良いのですが、カスタムデータを扱う場合に書かないといけないのが、ContentTypeWrite/ContentTypeReaderでした。特に面倒だったのが、読み込みと書き込みという対称的な処理をするのにContentTypeWriterはオフラインプロセス側、ContentTypeReaderはオンラインプロセス側と別々の場所で書かないといけないことでした。&lt;/p&gt;  &lt;p&gt;この面倒臭さを解決する為に、XNA GS 3.1では自動XNBシリアライズ機能が追加されました。この機能を使うことで、多くの場面でContentTypeWriter/ContentTypeReaderを書く必要がなくなりました。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;自動XNBシリアライズ機能の使い方&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;自動XNBシリアライズは.Netのリフレクション機能を使って実装されています。ContentTypeWriter/ContentTypeReaderが指定されていない場合、自動XNAシリアライズが発生し、以下のルールに沿って動作します。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;公開(public)メンバー、プロパティがシリアライズの対象になる &lt;/li&gt;    &lt;li&gt;シリアライズしたくないメンバーがある場合は、&lt;strong&gt;[ContentSerializerIgnore]&lt;/strong&gt;属性を指定することで、シリアライズしないように指定できる &lt;/li&gt;    &lt;li&gt;private, protected, internalなどの非公開メンバーをシリアライズしたい場合は&lt;strong&gt;[ContentSerializer]&lt;/strong&gt;属性を指定する &lt;/li&gt;    &lt;li&gt;シリアライズしたいデータ構造が再帰的な参照を含む場合は&lt;strong&gt;[ContentSerializer(SharedResource = true)]&lt;/strong&gt;を指定する &lt;/li&gt;    &lt;li&gt;コンテント・パイプライン内とランタイム時の型が違う場合、&lt;strong&gt;[ContentSerializerRuntimeType(“タイプ名”)]&lt;/strong&gt;を指定する &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;シンプルな例&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;例えば以下のようなデータをゲームで扱うとします。ゲームとコンテント・パイプラインで共有するデータなので、ゲームプロジェクトの他に共有するデータを入れるためのプロジェクトを作る必要があります。例えばMyDataTypesという名前のプロジェクトです。&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: green"&gt;// ねこクラス
&lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Neko
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Name;     &lt;span style="color: green"&gt;// 名前
    &lt;/span&gt;&lt;span style="color: blue"&gt;public float &lt;/span&gt;Weight;    &lt;span style="color: green"&gt;// 体重
    &lt;/span&gt;&lt;span style="color: blue"&gt;public int &lt;/span&gt;Tails;       &lt;span style="color: green"&gt;// 尻尾の数
&lt;/span&gt;}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;このデータをコンテント・パイプライン内に読み込むために以下のようなXMLファイル、cats.xmlを書きます。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;XnaContent&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Asset &lt;/span&gt;&lt;span style="color: red"&gt;Type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;MyDataTypes.Neko[]&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Item&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;たま&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Weight&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;8&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Weight&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Tails&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Tails&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Item&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Item&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;ねこまた&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Weight&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;12&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Weight&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Tails&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;2&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Tails&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Item&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Asset&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;XnaContent&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;

&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;作ったXMLファイルをコンテントとして追加した後に、そのデータを読み込むコードをゲーム側のコード(LoadContentメソッド内など)に以下のコードを追加します。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;Neko&lt;/span&gt;[] cats = Content.Load&amp;lt;&lt;span style="color: #2b91af"&gt;Neko[]&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;&amp;quot;cats&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;後は、F5を押すだけで変数catsには必要なデータが読み込まれます。3.0以前のようにContentTypeReader/ContentTypeReaderを書かなくても良いので、データ構造の宣言、データファイルの生成、読み込み部分のコードをゲーム内に追加という単純な作業でカスタムデータをゲーム内で読み込むことができます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;オフラインとランタイムで型が違う場合&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/ito/archive/2009/06/12/content-pipeline-types-31.aspx" target="_blank" mce_href="http://blogs.msdn.com/ito/archive/2009/06/12/content-pipeline-types-31.aspx"&gt;XNA GS 3.1のコンテント・パイプライン内で使われる型&lt;/a&gt;の図を見ると、コンテント・パイプライン内ではTexture2DContentだけど、ゲーム内ではTexture2Dのように、オフライン時とランタイム時では型が異なるケースがあります。例えば、ゲーム内では以下のデータ構造にしたい場合があるとします。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// ねこクラス
&lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Neko
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Name;         &lt;span style="color: green"&gt;// 名前
    &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Texture2D &lt;/span&gt;Texture;   &lt;span style="color: green"&gt;// テクスチャ
&lt;/span&gt;}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;この場合、Textureはコンテント・パイプライン内で使う型がTexture2DContentとなるので、以下のようにContentSerializerRuntimeType属性を使ってランタイム時の型を指定します。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;// ねこコンテント
&lt;/span&gt;[&lt;span style="color: #2b91af"&gt;ContentSerializerRuntimeType&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;MyGame.Neko, MyGame&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NekoContent
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Name;         &lt;span style="color: green"&gt;// 名前
    &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Texture2DContent &lt;/span&gt;Texture;   &lt;span style="color: green"&gt;// テクスチャ
&lt;/span&gt;}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;strong&gt;パフォーマンス&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;以上のように自動XNBシリアライズ機能は非常に便利な機能ですが、前述のようにデータの書き込みと読み込み時にリフレクション機能を使用するのでContentTypeWriter/ContentTypeReaderに比べると不必要なメモリ確保や、ボクシングなどが発生し、処理時間も多く掛かるので理論的にはロード時間が以前より長くなります。&lt;/p&gt;

&lt;p&gt;ですが、現実的にはカスタムデータの多くがゲーム内のパラメーターなど、他のコンテントに比べると数は少ないものなので、ロード時間が長くなるといっても無視できる範囲のことが多いと思われます。&lt;/p&gt;

&lt;p&gt;ただし、カスタムデータを数百、数千の配列で持つようなケースでは極端にロード時間が長くなる場合もあります。その場合は、今までどおりContentTypeWriter/ContentTypeReaderを使うことによってリフレクションによる速度低下を防ぐことができます。便利さを優先するには自動XNBシリアライズ、速度を優先するならContentTypeWriter/ContentTypeReaderといった感じに上手に使い分けましょう。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;サンプル・コード&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;自動XNBシリアライズ機能を使って&lt;a href="http://blogs.msdn.com/ito/archive/2007/05/02/content-pipeline-part3.aspx" target="_blank" mce_href="http://blogs.msdn.com/ito/archive/2007/05/02/content-pipeline-part3.aspx"&gt;コンテント・パイプラインの紹介の時&lt;/a&gt;に作った日本語表示のサンプルを3.1用に書き換えてみました。元のサンプルと比べると、共有するデータ型を記述するプロジェクト自体を書く必要がなくなり、ContentTypeWriter/ContentTypeReaderを書く必要が無くなったのでシンプルになっています。&lt;/p&gt;

&lt;p&gt;&lt;a title="http://higeneko.net/hinikeni/sample/TextMessageSample31.zip" href="http://higeneko.net/hinikeni/sample/TextMessageSample31.zip" mce_href="http://higeneko.net/hinikeni/sample/TextMessageSample31.zip"&gt;http://higeneko.net/hinikeni/sample/TextMessageSample31.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;元ネタ:&lt;a title="http://blogs.msdn.com/shawnhar/archive/2009/03/25/automatic-xnb-serialization-in-xna-game-studio-3-1.aspx" href="http://blogs.msdn.com/shawnhar/archive/2009/03/25/automatic-xnb-serialization-in-xna-game-studio-3-1.aspx" mce_href="http://blogs.msdn.com/shawnhar/archive/2009/03/25/automatic-xnb-serialization-in-xna-game-studio-3-1.aspx"&gt;http://blogs.msdn.com/shawnhar/archive/2009/03/25/automatic-xnb-serialization-in-xna-game-studio-3-1.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9757683" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.1/default.aspx">XNA 3.1</category></item><item><title>XNA GS 3.1のコンテント・パイプラインで使われる型</title><link>http://blogs.msdn.com/ito/archive/2009/06/12/content-pipeline-types-31.aspx</link><pubDate>Sat, 13 Jun 2009 05:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9741379</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/ito/comments/9741379.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9741379</wfw:commentRss><description>&lt;P&gt;以前、&lt;A href="http://blogs.msdn.com/shawnhar/default.aspx" target=_blank mce_href="http://blogs.msdn.com/shawnhar/default.aspx"&gt;Shawn Hargreaves氏のブログ&lt;/A&gt;でXNA GS 2.0のコンテント・パイプライン内でデータが変換される過程図が紹介されました。&lt;/P&gt;
&lt;P&gt;&lt;A title=http://blogs.msdn.com/shawnhar/archive/2007/10/10/content-pipeline-types.aspx href="http://blogs.msdn.com/shawnhar/archive/2007/10/10/content-pipeline-types.aspx" mce_href="http://blogs.msdn.com/shawnhar/archive/2007/10/10/content-pipeline-types.aspx"&gt;http://blogs.msdn.com/shawnhar/archive/2007/10/10/content-pipeline-types.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;XNA GS 3.1がリリースされたので、それに合わせて元の図を翻訳し、SoundEffect、Video等の新しい型を追加した図を作ってみました。アセットファイルがどのようにインポートされ、プロセッサで処理され、ContentTypeWriterからXNBファイルとして書き出されるまに使われる型情報を網羅しているので、カスタムインポータや、カスタムプロセッサを作るときに役立つと思います。&lt;/P&gt;
&lt;P&gt;左側の水色の部分はコンテント・パイプライン内で処理される部分で、右側の黄色い部分はゲーム実行時に処理される部分です。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinetypes31_1120B/ContentPipelineTypes_4.png" target=_blank mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinetypes31_1120B/ContentPipelineTypes_4.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=ContentPipelineTypes border=0 alt=ContentPipelineTypes src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinetypes31_1120B/ContentPipelineTypes_thumb_1.png" width=1247 height=1288 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinetypes31_1120B/ContentPipelineTypes_thumb_1.png"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9741379" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.1/default.aspx">XNA 3.1</category></item><item><title>Gamefest Japan 2008 デモプログラム</title><link>http://blogs.msdn.com/ito/archive/2008/12/12/gamefest-japan-2008-demo.aspx</link><pubDate>Fri, 12 Dec 2008 15:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9201966</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/ito/comments/9201966.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9201966</wfw:commentRss><description>&lt;p&gt;2009/06/25 追記: XNA GS 3.1用のサンプルを &lt;a href="http://higeneko.net/hinikeni/sample/xna31/GamefestJapan2008Demo.zip"&gt;http://higeneko.net/hinikeni/sample/xna31/GamefestJapan2008Demo.zip&lt;/a&gt;にアップしました&lt;/p&gt;  &lt;p&gt;2008/12/26 追記: デモプログラムの更新、キーボード入力で操作できるようになりました。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;やっと終わりました&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;今年の９月に行われたGamefest Japan 2008のプレゼンテーション資料が先月公開されました。&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx" href="http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx" target="_blank" mce_href="http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx"&gt;http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;私も僭越ながら２つのセッションを担当させて頂き、そのプレゼンテーション資料も公開されています。XNA Game Studioでのゲーム開発においてのパフォーマンス改善について戦略的手法と実践的な手法、主にシステムレベルでの最適化の効果の程を紹介させていただきました。&lt;/p&gt;  &lt;p&gt;&lt;a title="http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip" href="http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip" mce_href="http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip"&gt;http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;本当はプレゼン時にサンプルプログラムの配布したかったのですが、本業の方のXNA Framework作業の方が佳境の最中で、その合間に書いたコードだったので非常に汚いコードであったのと、先月のXNA Game Studio 3.0のリリースまでその忙しさが続いたので、なかなか公開することができませんでした。っていうか、コメントを追加するのは当然として、他にも3.0対応にしたり、再利用可能なコンポーネントを使いやすく書き換えたりして、発表時のコードよりも4,000行近く増えてしまったのも、今まで時間が掛かった原因でした。&lt;/p&gt;  &lt;p&gt;ともかく、なんとか人に見せられる程度の体裁は整えたので、デモプログラムを公開します。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://higeneko.net/hinikeni/sample/GamefestJapan2008Demo.zip" mce_href="http://higeneko.net/hinikeni/sample/GamefestJapan2008Demo.zip"&gt;http://higeneko.net/hinikeni/sample/GamefestJapan2008Demo.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;解凍したフォルダの中には以下の３つのソリューションファイルがあるので、好きなソリューションファイルを使ってください。いずれのプロジェクトを開くのにもXNA Game Studio 3.0が必要です。また、Windowsで実行するにはシェーダーモデル2.0以上のビデオカードが必須になります。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;DemoWin.sln      &lt;ul&gt;       &lt;li&gt;Windows用のソリューションファイル &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;DemoXbox.sln      &lt;ul&gt;       &lt;li&gt;Xbox 360用のソリューションファイル &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Demo.sln      &lt;ul&gt;       &lt;li&gt;Windows/Xbox 360の両方のプロジェクトが入ったソリューションファイル &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;フォントは私がプログラムする時に使っている等幅フォントのConsolasを使用しています。Consolasフォントが無い場合はビルドエラーになるので、以下のURLからConsolasフォントをダウンロードするか、フォント名を変更するようにしてください。&lt;/p&gt;  &lt;p&gt;&lt;a title="https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en" href="https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en" target="_blank" mce_href="https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en"&gt;https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;このサンプルプロジェクトのコード、アセットは非商用、商用に関わらず、自由に使ってかまいません。ただし、一部のコードはクリエータークラブオンラインのMesh Instancingのコードを流用、または変更しているので、それらのコードのライセンスについては付属されるMicrosoft Permissive License.rtfに沿います。&lt;/p&gt;  &lt;p&gt;&lt;a title="http://creators.xna.com/en-US/sample/meshinstancing" href="http://creators.xna.com/en-US/sample/meshinstancing" target="_blank" mce_href="http://creators.xna.com/en-US/sample/meshinstancing"&gt;http://creators.xna.com/en-US/sample/meshinstancing&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;で、お約束ですが、このサンプルコードやアセットを使用したことで発生したいかなる問題にも当方は責任を負いません。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;デモの内容&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;デモを起動すると、おなじみのCornflowerBlueが表示されます。ここでコントローラーのスタートボタンで４種類のデモの切り替えをし、Aボタンで手法の切り替えをします。また、デモによっては左右のトリガで表示オブジェクト数の増減ができます。以下に紹介する測定結果は全てXbox 360上で測定したものです。パフォーマンス測定をする時にはビルド設定をリリースにし、デバッグにアタッチしていない状態(Ctrl+F5)で実行することを忘れないでください。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;操作方法&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;デモの切り替え      &lt;ul&gt;       &lt;li&gt;スタートボタン、またはEnterキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;手法の切り替え      &lt;ul&gt;       &lt;li&gt;Aボタン、またはスペースキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;オブジェクト数の増減      &lt;ul&gt;       &lt;li&gt;左右のトリガ、またはUp/Downキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;デモの終了      &lt;ul&gt;       &lt;li&gt;Backボタン、またはEscapeキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;配列デモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;.Netには様々な配列のタイプがあり、慣れていないとどれを使ったら良いのか悩むと思います。このデモでは、様々な配列を使って5,000個のスプライトの移動させるときに掛かる時間を測定しています。画面左下にある青いバーが更新時間に掛かった時間でログ表示中の&amp;quot;Update&amp;quot;です。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-2" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;この配列デモの結果を見るとArrayListを使うのは避けるべきで、それ以外の手法による速度差は30~40%程度なので、後に続くデモの効果に比べると少ないものなので、用途に合わせて使いやすい配列を使いましょうということになります。&lt;/p&gt;  &lt;p&gt;このデモのソースコードは&lt;strong&gt;Demo/ArrayDemo&lt;/strong&gt;フォルダの中にあります。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;strong&gt;動的頂点バッファデモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;動的頂点バッファの扱いはXNA GSでは簡単になっているものの、CPUの書き込みとGPUの読み込みがどんなタイミングで衝突するのかを理解して正しく使わないと思わぬパフォーマンス低下の原因になります。また、2Dゲームのパフォーマンス問題として頂点変換をはじめとするシェーダーでするべき仕事もCPUでしてしまい、CPU速度の遅いXbox 360では速度が出ないという問題があります。&lt;/p&gt;  &lt;p&gt;このデモでは、動的頂点バッファの使い方と、シェーダーを使った場合の効果を紹介しています。スケール、回転といった基本的なパラメーターを持ったパーティクルを3,000個描画したときに掛かる時間を測定しています。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-3" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;CPUで頂点変換処理をした時に比べて、単純なシェーダー処理をするだけで8.5倍、vfetchを活用すると30倍、更にDirectMappingを使うと142倍という桁違いな速度アップになります。ただし、比較対象のCPUで頂点変換するコードは全く最適化されていないので、実際にはそこまで大きな数字は出なくとも0.09ミリ秒で3,000個のパーティクルの描画命令を発行できるというのは大きいと思います。&lt;/p&gt;  &lt;p&gt;世の中ではマルチコア、マルチスレッドが騒がれているので、どうしてもマルチスレッドプログラミングに手を出したくなってしまいますが、Xbox 360上でXNA GSが使えるHWスレッド数は４つまでなので、どんなにうまくプログラムしたとしても元の４倍以下の速度にしかならないことを考えるとシェーダーの活用がいかに効果的な手法なのかが判ると思います。&lt;/p&gt;  &lt;p&gt;このデモのソースコードは&lt;strong&gt;Demo/GameVertex&lt;/strong&gt;フォルダの中にあり、シェーダーコードは&lt;strong&gt;Demo/Content/GameVertex&lt;/strong&gt;の中にあります。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;インスタンスモデルデモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Xbox 360上で数万ポリゴンのモデルが数十個描画できるなら、数百ポリゴンのモデルを数千個描画できるはずと思って試してみると、数百個も描画すると処理落ちしてしまうという問題を何度か聞いたことがあります。これは、XNA GSというより、Direct X、というよりも昨今のGPUで共通の問題で、この問題を解決する為の手法がインスタンス(Instancing)です。Xbox 360はもちろん、Windowsでも非常に効果的な手法の一つです。&lt;/p&gt;  &lt;p&gt;インスタンスモデルのサンプルはクリエータークラブオンラインにもありますが、このデモではWindowsで使えるHWインスタンスをXbox 360でvfetchを使って実装していて、InstancedModelクラスを介してWindowsとXbox 360の両方で全く同じゲームコードを記述することができるようになっています。ただし、シェーダーコードのフェッチ部分はXbox 360用のコードが必要になりますが、フェッチ部分のみなので他のシェーダー処理部分は共通で使えます。&lt;/p&gt;  &lt;p&gt;このデモでは、３つのスペキュラ付き平行光源処理をした、12ポリゴン、24頂点のモデルを500個描画したときの時間を測定しています。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-4" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;最適化されていない状態とHWインスタンスを使った場合で50倍、DirectMappingを使うと115倍の速度になっています。このデモでは3万６千個のボックスを描画した時点で60fpsを切りますが、これはボックスを移動する更新部分がネックになりGPUにはまだ余裕があります。そこで、試しに1,245ポリゴンのモデルを表示してみたのですが、その場合は最大3,440個のモデルが表示できました。これは１フレームあたり428万ポリゴン、秒間で２億5千万ポリゴンを描画できることになります。&lt;/p&gt;  &lt;p&gt;このデモのソースコードは&lt;strong&gt;Demo/GameModel&lt;/strong&gt;フォルダの中にあり、インスタンスモデルクラスの実装はDemoTypesフォルダの中にあり、シェーダーコードは&lt;strong&gt;Demo/Content/GameModel&lt;/strong&gt;の中にあります。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;インスタンスモデルアニメーションデモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;シェーダーモデル 3.0の機能として浮動小数点テクスチャと頂点シェーダーからテクスチャを読み込む頂点テクスチャがあります。このデモでは、アニメーションデータを浮動小数点テクスチャに格納し、アニメーション処理をCPUではなくGPUでしています。CPU側の処理としてはオブジェクトの移動と、アニメーションフレームの更新です。それぞれのオブジェクトのアニメーションスピードはランダムです。&lt;/p&gt;  &lt;p&gt;このデモでは、３つのスペキュラ付き平行光源処理をした、84ポリゴン、186頂点のモデルを500個描画したときの時間を測定しています。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-6" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Xbox 360上では大体16,000個のオブジェクトを描画することができます。&lt;/p&gt;  &lt;p&gt;ソースコードは&lt;strong&gt;Demo/GameAnime&lt;/strong&gt;フォルダの中にあり、シェーダーコードは&lt;strong&gt;Demo/Content/GameAnime&lt;/strong&gt;の中にあります。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;他にも役に立ちそうなもの&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;４種類のデモの紹介をしましたが、このデモコードの中には他にも役立ちそうなものがあります。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;TimeRuler (Demo/GameDebug/TimeRuler.cs) &lt;/li&gt;    &lt;li&gt;Fpsカウンター (Demo/GameDebug/FpsCounter.cs) &lt;/li&gt;    &lt;li&gt;デバッグコマンド (Demo/GameDebug/DebugCommandUI.cs) &lt;/li&gt;    &lt;li&gt;Layout (Demo/Utils/Layout.cs) &lt;/li&gt;    &lt;li&gt;StringBuilder拡張メソッド (Demo/Utils/StringBuilderExtensions.cs) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;これらについては追々紹介していきます。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9201966" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B730A730FC30C030FC30E230C730EB30_+3.0/default.aspx">シェーダーモデル 3.0</category></item><item><title>簡単(かもしれない)日本語表示</title><link>http://blogs.msdn.com/ito/archive/2008/02/22/simple-japanese-message.aspx</link><pubDate>Fri, 22 Feb 2008 16:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7847692</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/7847692.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=7847692</wfw:commentRss><description>&lt;p&gt;2009/06/25 XNA GS 3.1用のサンプルを&lt;a href="http://higeneko.net/hinikeni/sample/xna31/SimpleMessage.zip"&gt;http://higeneko.net/hinikeni/sample/xna31/SimpleMessage.zip&lt;/a&gt;にアップしました。&lt;/p&gt;  &lt;p&gt;以前紹介した&lt;a href="http://blogs.msdn.com/ito/archive/2007/05/02/content-pipeline-part3.aspx" target="_blank" mce_href="http://blogs.msdn.com/ito/archive/2007/05/02/content-pipeline-part3.aspx"&gt;英数字以外の文字列表示方法&lt;/a&gt;はコンテントパイプラインの全体の流れを説明するという目的もあったので複雑なつくりになっていました。RPGやテキストベースのアドベンチャーゲームなどの大量のテキストデータを扱う場合は、こういったものは必須になってきますが、今回はXNA 2.0から導入された&lt;a href="http://blogs.msdn.com/ito/archive/2007/12/21/xna20-content-pipeline-2-aspx.aspx" target="_blank" mce_href="http://blogs.msdn.com/ito/archive/2007/12/21/xna20-content-pipeline-2-aspx.aspx"&gt;プロセッサパラメーター&lt;/a&gt;を使ってのシンプルな日本語を含む多言語文字列表示方法を紹介します。&lt;/p&gt;  &lt;p&gt;とりあえず、前回のサンプルを2.0用に書き直しておきました。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://higeneko.net/hinikeni/sample/TextMessagesample.zip" mce_href="http://higeneko.net/hinikeni/sample/TextMessagesample.zip"&gt;MessageTextSample 2.0&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;なぜSpriteFontなのか？&lt;/h3&gt;  &lt;p&gt;Windowsアプリケーションプログラミングを経験した人達にとってXNAに同様の文字列描画APIがないというのは疑問に思うかも知れません。なぜ、普通のWindowsのアプリケーションのようにOSにインストールされたフォントを指定して文字列を簡単にかけないのでしょうか？それには主に以下の理由があります。&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;容量: 日本語のフォントファイルのサイズは大きくて再配布が難しい &lt;/li&gt;    &lt;li&gt;速度: テクスチャ形式のフォントに比べて描画処理に時間が掛かる &lt;/li&gt;    &lt;li&gt;法律: 面倒だから放っておくと、後でさらに面倒なことになる罠のこと &lt;/li&gt;    &lt;li&gt;娯楽: OSにインストールされいるフォントを使うと事務的な印象を受けてしまう &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;1については、日本語フォントの殆どは約7,000文字近くのデータを持っています。私のマシンにインストールされているMSゴシックのファイルサイズは８MB近くあります。殆どのゲームでは500～1,500文字程度の文字しか使わないので7,000文字のデータを持つのは効率的ではありません。更に、キャラクターや状況によって複数のフォントを使い分けるのでファイルサイズが大きいというの問題になります。&lt;/p&gt;  &lt;p&gt;2は、通常のフォントはTrueTypeと呼ばれるデータ形式で、これは一文字一文字のポリゴンデータを持っているようなものでテクスチャにあらかじめ描画された文字をひとつの四角形ポリゴンで表示するより処理するのに時間が掛かります。また、フォントデータは必要になったときにHDDから読み込むのでリアルタイム性の高いゲームを作ってるときにはその遅延時間を考慮しなければいけないという問題もあります。&lt;/p&gt;  &lt;p&gt;3は面倒な問題で、フォントには著作権があり、その使用許諾の形式もフォントを作っている会社によってさまざまなものがありますが、その多くはテクスチャとして文字を使うのは良くてもフォントファイル自体の再配布を禁じているものがあります。それ以外にもいろんなライセンス契約形式があることに注意してください。&lt;/p&gt;  &lt;p&gt;4については、フォントと言うのはゲームの雰囲気を伝えるために重要なもので、キャラクターやその場の雰囲気によって複数のフォントを使うことが多いです。例えばおどろどろしい雰囲気を出すために&lt;a href="http://ohkadesign.cool.ne.jp/wabunfont/category/kointai.html" target="_blank" mce_href="http://ohkadesign.cool.ne.jp/wabunfont/category/kointai.html"&gt;古印体&lt;/a&gt;というフォントを使ったりしますが、そういった特徴的なフォントがOSにインストールされていることは殆どありません。また、テクスチャにすることで&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="xboxControllerButtonA" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/f5a55666538c_2924/xboxControllerButtonA_1.png" width="244" height="34" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/f5a55666538c_2924/xboxControllerButtonA_thumb_4.png" /&gt; &lt;/p&gt;  &lt;p&gt;のように普通の文字列の間にビットマップで描いた絵を文字として組み合わせることもできます。&lt;/p&gt;  &lt;p&gt;以上の理由からXNAではSpriteFontを採用しています。&lt;/p&gt;  &lt;h3&gt;簡単メッセージプロセッサ&lt;/h3&gt;  &lt;p&gt;今回のサンプルの基本アイディアは&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;FontDescriptionProcessorから派生したMessageProcessorを作る &lt;/li&gt;    &lt;li&gt;MessageProcessor.Processメソッド内で任意の文字列をFontDescriptionに追加する &lt;/li&gt;    &lt;li&gt;追加する文字はMessageFilenameプロパティに指定されたファイルから読み込む &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;と、シンプルなものです。カスタムプロセッサのプロセスメソッドは以下のようになっています。&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public override &lt;/span&gt;SpriteFontContent Process(FontDescription input,
                                            ContentProcessorContext context)
{
    &lt;span style="color: green"&gt;// MessageFilenameで指定されたファイル内の文字を追加する
    &lt;/span&gt;AppendCharacters(input, context);

    &lt;span style="color: green"&gt;// 文字列を追加した後は単純にFontDescriptionProcessorのプロセスを呼ぶだけ
    &lt;/span&gt;&lt;span style="color: blue"&gt;return base&lt;/span&gt;.Process(input, context);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&amp;#160; MessageFilenameをプロセッサ・パラメーターとして以下のように宣言しています。詳細は&lt;a href="http://blogs.msdn.com/ito/archive/2007/12/21/xna20-content-pipeline-2-aspx.aspx" target="_blank" mce_href="http://blogs.msdn.com/ito/archive/2007/12/21/xna20-content-pipeline-2-aspx.aspx"&gt;この記事&lt;/a&gt;が参考になると思います。ここではプロパティ画面上で読みやすいようにDisplayNameとDescriptionアトリビュートを使っています。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color: green"&gt;プロセッサーパラメーター
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;ここに読み込むメッセージファイル名を指定する
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color: green"&gt;// プロパティ画面で表示される文字列の指定
&lt;/span&gt;[DisplayName(&lt;span style="color: #a31515"&gt;&amp;quot;メッセージファイル名&amp;quot;&lt;/span&gt;)]
&lt;span style="color: green"&gt;// プロパティ画面でのパラメーターの説明
&lt;/span&gt;[Description(&lt;span style="color: #a31515"&gt;&amp;quot;メッセージテキストが含まれているテキストファイル名&amp;quot;&lt;/span&gt;)]
&lt;span style="color: blue"&gt;public string &lt;/span&gt;MessageFilename
{
    &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;messageFilename; }
    &lt;span style="color: blue"&gt;set &lt;/span&gt;{ messageFilename = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }
}

&lt;span style="color: blue"&gt;string &lt;/span&gt;messageFilename;&lt;/pre&gt;

&lt;p&gt;Processメソッドから呼んでいるAppendCharactersメソッド内では単にファイルから文字列を読み込み、FontDescription.Characters.Addメソッドを使って使用する文字を追加しています。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/span&gt;&lt;span style="color: green"&gt;FontDescriptionにMessageFilenameで指定されたファイル内の文字を追加する
&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color: blue"&gt;void &lt;/span&gt;AppendCharacters(FontDescription input, ContentProcessorContext context)
{
    &lt;span style="color: green"&gt;// MessageFilenameは有効な文字列か？
    &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.IsNullOrEmpty(MessageFilename))
        &lt;span style="color: blue"&gt;return&lt;/span&gt;;

    &lt;span style="color: blue"&gt;if &lt;/span&gt;(!&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Exists(MessageFilename))
    {
        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FileNotFoundException&lt;/span&gt;(
            &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format( &lt;span style="color: #a31515"&gt;&amp;quot;MessageFilenameで指定されたファイル[{0}]が存在しません&amp;quot;&lt;/span&gt;,
                            &lt;span style="color: #2b91af"&gt;Path&lt;/span&gt;.GetFullPath(MessageFilename)));
    }

    &lt;span style="color: green"&gt;// 指定されたファイルから文字列を読み込み、
    // FontDescription.Charctarsに追加する
    &lt;/span&gt;&lt;span style="color: blue"&gt;try
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;int &lt;/span&gt;totalCharacterCount = 0;

        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;StreamReader &lt;/span&gt;sr = &lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.OpenText(MessageFilename))
        {
            &lt;span style="color: blue"&gt;string &lt;/span&gt;line;
            &lt;span style="color: blue"&gt;while &lt;/span&gt;( ( line = sr.ReadLine() ) != &lt;span style="color: blue"&gt;null &lt;/span&gt;)
            {
                totalCharacterCount += line.Length;

                &lt;span style="color: blue"&gt;foreach&lt;/span&gt;( &lt;span style="color: blue"&gt;char &lt;/span&gt;c &lt;span style="color: blue"&gt;in &lt;/span&gt;line )
                    input.Characters.Add( c );
            }
        }

        context.Logger.LogImportantMessage(&lt;span style="color: #a31515"&gt;&amp;quot;使用文字数{0}, 総文字数:{1}&amp;quot;&lt;/span&gt;,
            input.Characters.Count, totalCharacterCount);

        &lt;span style="color: green"&gt;// CPにファイル依存していることを教える
        &lt;/span&gt;context.AddDependency(&lt;span style="color: #2b91af"&gt;Path&lt;/span&gt;.GetFullPath(MessageFilename));
    }
    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;e)
    {
        &lt;span style="color: green"&gt;// 予期しない例外が発生
        &lt;/span&gt;context.Logger.LogImportantMessage(&lt;span style="color: #a31515"&gt;&amp;quot;例外発生!! {0}&amp;quot;&lt;/span&gt;, e.Message);
        &lt;span style="color: blue"&gt;throw &lt;/span&gt;e;
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;このカスタムプロセッサをコンパイルすると、以下のようにプロパティ画面上でメッセージプロセッサという名前のプロセッサが追加され、そこにメッセージファイル名というプロセッサ・パラメーターが表示されます。&lt;/p&gt;

&lt;p align="center"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="SimpleMessage" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/f5a55666538c_2924/SimpleMessage_3.png" width="449" height="265" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/f5a55666538c_2924/SimpleMessage_3.png" /&gt; &lt;/p&gt;

&lt;p&gt;ここにはテキストファイルであればどんなファイル名でも指定できますが、使っている環境に依存しないように相対パスを指定するようにしましょう。通常、コンテントパイプライン実行時のルートパスはContentフォルダになっています。また、多言語が指定できるようにファイルのエンコーディングはUTF-8を指定します。&lt;/p&gt;

&lt;p&gt;さて、どんなファイルでも指定できるわけですが、前回の時にも書いたように私がプログラムするときには&lt;strong&gt;「エラーが起きにくく、起きたとしても直ぐにエラーの原因が特定、修正ができる」&lt;/strong&gt;ということを心がけています。ですから、メッセージファイルと実際にランタイム時に使う文字列を別のファイルであるソースコードと別々にすると問題が起きやすく、見つけづらいという状態になってしまいます。&lt;/p&gt;

&lt;p&gt;じゃあどうすればいいのか？また前回のように面倒なコーディングをしないといけないのか？と思ってしまいますが、今回はシンプルな解決方法をとります。それは&lt;strong&gt;ソースコードをメッセージファイルとして指定する&lt;/strong&gt;というものです。&lt;/p&gt;

&lt;p&gt;ソースコードも立派なテキストファイル。そこに使われる文字は殆どが英数字なので日本語のメッセージに使われる文字数に比べると少ないし、既に英数字を使用する文字に指定しているのであれば無駄はありません。気をつけるとすれば、メッセージファイルが更新する度にコンテントビルドが行われるので、頻繁に書き換えるソースコードをメッセージファイルとして指定しないということです。&lt;/p&gt;

&lt;p&gt;そこで、今回はサンプル内で使う文字列をまとめたMessageTable.csというソースコードを指定しています。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;SimpleMessage
{
    &lt;span style="color: blue"&gt;static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageTable
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public static string&lt;/span&gt;[] Messages = {
            &lt;span style="color: #a31515"&gt;&amp;quot;日本語メッセージテスト\n&amp;quot;&lt;/span&gt;+
            &lt;span style="color: #a31515"&gt;&amp;quot;キーボードのEnterキー、コントローラーのＡボタンで\n&amp;quot;&lt;/span&gt;+
            &lt;span style="color: #a31515"&gt;&amp;quot;次のメッセージを表示します。&amp;quot;&lt;/span&gt;,

            ...

            &lt;span style="color: #a31515"&gt;&amp;quot;最初のメッセージに戻ります。&amp;quot;&lt;/span&gt;,
        };
    }
}&lt;/pre&gt;

&lt;p&gt;カスタムプロセッサは100行程度のプログラム。ランタイム側は特別なデータタイプを持つことなく、SpriteFontを追加し、そのプロセッサを変更してパラメーターを設定するだけなので、簡単に日本語メッセージを表示できるのではないでしょうか？&lt;/p&gt;

&lt;p&gt;&lt;a href="http://higeneko.net/hinikeni/sample/SimpleMessage.zip" mce_href="http://higeneko.net/hinikeni/sample/SimpleMessage.zip"&gt;簡単(かもしれない)日本語表示サンプル&lt;/a&gt;&lt;/p&gt;

&lt;p mce_keep="true"&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;冒頭で紹介したサンプルも、このサンプルもXNA 2.0用です。XNA 2.0のプロジェクトファイルはC# Express 2005、Visual Studio 2005のどちらでも使えるようになっています。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7847692" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category></item><item><title>XNA 2.0のコンテントパイプライン～その弐～</title><link>http://blogs.msdn.com/ito/archive/2007/12/21/xna20-content-pipeline-2-aspx.aspx</link><pubDate>Sat, 22 Dec 2007 04:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6831520</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/ito/comments/6831520.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=6831520</wfw:commentRss><description>&lt;H2&gt;プロセッサパラメーター&lt;/H2&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=228 alt=processor01 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/processor01_3.png" width=501 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/processor01_3.png"&gt; &lt;/P&gt;
&lt;P&gt;上の画面はテクスチャのプロパティ画面です。Content Processorの脇に+のついた四角いマークに気づいたでしょうか？&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=336 alt=processor02 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/processor02_3.png" width=502 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/processor02_3.png"&gt; &lt;/P&gt;
&lt;P&gt;クリックすると複数のパラメーターが表示されます。これがXNA GS 2.0の新機能の一つであるプロセッサパラメーターです。XNA GSE 1.0では複数の複数のプロセッサを書く必要がありましたが、XNA GS 2.0ではひとつのパラメーターつきのプロセッサを書くだけで、どのようにコンテントがプロセスされるかを指定できるようになりました。&lt;/P&gt;
&lt;P&gt;Textureプロセッサには以下のパラメーターが設定できます。&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2 width=660 align=center border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=165&gt;
&lt;P align=center&gt;パラメーター名&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=493&gt;
&lt;P align=center&gt;用途&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=168&gt;Color Key Color&lt;/TD&gt;
&lt;TD class="" vAlign=top width=491&gt;カラーキーの指定&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=170&gt;Color Key Enabled&lt;/TD&gt;
&lt;TD class="" vAlign=top width=489&gt;この値がTrueの時にColor Key Colorと同じピクセルのアルファ値が0に変換される&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=172&gt;Generate Mipmaps&lt;/TD&gt;
&lt;TD class="" vAlign=top width=488&gt;ミップマップ生成のコントロール&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=173&gt;Resize to Power of Two&lt;/TD&gt;
&lt;TD class="" vAlign=top width=487&gt;元のイメージを最も近い2の乗数のサイズにリサイズするかしないか&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=174&gt;Texture Format&lt;/TD&gt;
&lt;TD class="" vAlign=top width=487&gt;出力するテクスチャのフォーマット &lt;BR&gt;NoChange(変換なし)、Color(32ビットRGBA)、DxtCompressed(DXT圧縮形式)&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Modelプロセッサでは以下のパラメータが設定できます。&lt;/P&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2 width=659 align=center border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=202&gt;
&lt;P align=center&gt;パラメーター名&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=455&gt;
&lt;P align=center&gt;用途&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=204&gt;Color Key Color&lt;/TD&gt;
&lt;TD class="" vAlign=top width=454&gt;カラーキーの指定&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=205&gt;Color Key Enabled&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;この値がTrueの時にColor Key Colorと同じピクセルのアルファ値が0に変換される&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Generate Mipmaps&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;ミップマップ生成のコントロール&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Generate Tangent Frames&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;タンジェントフレーム、つまりBiNormalとTangenチャンネルを頂点バッファに生成のコントロール&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Resize Textures to Power of Two&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;全てのテクスチャイメージを最も近い2の乗数のサイズにリサイズするかしないか&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Scale&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;モデルのスケール変換&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Swap Winding Order&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;ポリゴンの右回り、左回りの頂点順番の反転&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Texture Format&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;出力するテクスチャのフォーマット &lt;BR&gt;NoChange(変換なし)、Color(32ビットRGBA)、DxtCompressed(DXT圧縮形式)&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;X Axis Rotation&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;出力するモデルをX軸に沿って回転させる&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Y Axis Rotation&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;出力するモデルをY軸に沿って回転させる&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=206&gt;Z Axis Rotation&lt;/TD&gt;
&lt;TD class="" vAlign=top width=453&gt;出力するモデルをZ軸に沿って回転させる&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;プロセッサパラメーターは自分で作ったプロセッサでも簡単に使えるようになっています。ちなみにコンテントパイプラインを拡張するのに便利な&lt;STRONG&gt;"Content Pipeline Extension Library (2.0)"&lt;/STRONG&gt;テンプレートがXNA GS 2.0では追加されました。またカスタムプロセッサや、カスタムインポーターの雛形となるContent Processor、Content Importerテンプレートをソースコード追加時に指定できるようになりました。&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=613 alt=cpextension src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/cpextension_3.png" width=808 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/cpextension_3.png"&gt; &lt;/P&gt;
&lt;H2&gt;カスタムプロセッサーにパラメーターを付ける&lt;/H2&gt;
&lt;P&gt;プロセッサパラメーターをカスタムプロセッサへ追加するのは簡単でプロパティを宣言するだけです。&lt;/P&gt;&lt;PRE class=code&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;ContentProcessor&lt;/SPAN&gt;(DisplayName = &lt;SPAN style="COLOR: #a31515"&gt;"ねこプロセッサ"&lt;/SPAN&gt;)]
&lt;SPAN style="COLOR: blue"&gt;public class &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;NekoProcessor &lt;/SPAN&gt;: &lt;SPAN style="COLOR: #2b91af"&gt;ContentProcessor&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;TInput&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;TOutput&lt;/SPAN&gt;&amp;gt;
{
    &lt;SPAN style="COLOR: green"&gt;// プロセッサパラメーター
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public bool &lt;/SPAN&gt;NekoMode
    {
        &lt;SPAN style="COLOR: blue"&gt;get &lt;/SPAN&gt;{ &lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;nekoMode; }
        &lt;SPAN style="COLOR: blue"&gt;set &lt;/SPAN&gt;{ &lt;SPAN style="COLOR: blue"&gt;return &lt;/SPAN&gt;nekoMode = &lt;SPAN style="COLOR: blue"&gt;value&lt;/SPAN&gt;; }
    }

    &lt;SPAN style="COLOR: blue"&gt;bool &lt;/SPAN&gt;nekoMode = &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;このままでは味気ないので、以下のようにアトリビュートを指定することによってプロパティ画面でより読みやすい状態にすることができます。これらのアトリビュートはSystem.ComponentModel内で宣言されています。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// 規定値の指定
&lt;/SPAN&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;DefaultValue&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;)]

&lt;SPAN style="COLOR: green"&gt;// 表示される文字列の指定
&lt;/SPAN&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;DisplayName&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"ねこモード"&lt;/SPAN&gt;)]

&lt;SPAN style="COLOR: green"&gt;// パラメーターの説明
&lt;/SPAN&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;Description&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"Trueにすると、なんとなくねこっぽくなります"&lt;/SPAN&gt;)]
&lt;SPAN style="COLOR: blue"&gt;public bool &lt;/SPAN&gt;NekoMode
{&lt;/PRE&gt;
&lt;P&gt;このプロセッサをコンパイルすると、プロパティ画面では以下のようにパラメーターの説明つきで分かりやすい表示になります(説明自体が分かりやすいかどうかは別問題ですが…)。&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=317 alt=processor04 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/processor04_3.png" width=501 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline2.aspx_E0A6/processor04_3.png"&gt;&lt;/P&gt;
&lt;P&gt;今まではどんなに小さなパラメーターでも直接コードで変更するか、インポーターを介して読まないといけなかったのですが、プロセッサパラメータを使うことでそういった煩雑な作業をする必要が大幅に減ることになるでしょう。&lt;/P&gt;
&lt;P&gt;原文URL&lt;/P&gt;
&lt;P&gt;&lt;A title=http://blogs.msdn.com/shawnhar/archive/2007/11/26/content-processor-parameters-in-xna-game-studio-2-0.aspx href="http://blogs.msdn.com/shawnhar/archive/2007/11/26/content-processor-parameters-in-xna-game-studio-2-0.aspx" mce_href="http://blogs.msdn.com/shawnhar/archive/2007/11/26/content-processor-parameters-in-xna-game-studio-2-0.aspx"&gt;http://blogs.msdn.com/shawnhar/archive/2007/11/26/content-processor-parameters-in-xna-game-studio-2-0.aspx&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6831520" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+2.0/default.aspx">XNA 2.0</category></item><item><title>カスタムエフェクト</title><link>http://blogs.msdn.com/ito/archive/2007/12/21/rendering-a-model-with-a-custom-effect.aspx</link><pubDate>Sat, 22 Dec 2007 02:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6830864</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/6830864.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=6830864</wfw:commentRss><description>&lt;P&gt;フォーラムの質問を見て、今まで書いていなかったことに気づいたので遅ればせながらカスタムエフェクトの使い方を説明します。&lt;/P&gt;
&lt;P&gt;例によって例の如く、コピー元は&lt;A href="http://blogs.msdn.com/shawnhar/archive/2006/12/07/rendering-a-model-with-a-custom-effect.aspx" target=_blank mce_href="http://blogs.msdn.com/shawnhar/archive/2006/12/07/rendering-a-model-with-a-custom-effect.aspx"&gt;Shawn Hargreaves氏の投稿&lt;/A&gt;からです。&lt;/P&gt;
&lt;P&gt;独自に作ったエフェクトを使うには２つの方法があります。ひとつはコンテント・パイプラインが処理したエフェクトをゲーム実行時に切り替える方法。そしてふたつ目はカスタムプロセッサを書くことで、コンテントパイプライン内でコンテントビルド時に独自のエフェクトに切り替える方法です。&lt;/P&gt;
&lt;P&gt;後者の方法の方が自由度が高く、ゲーム実行時に余計な処理をしなくて済むようになるので、ここではこの方法を紹介します。&lt;/P&gt;
&lt;P&gt;まず最初にModelProcessorから派生したプロセッサーを作り、&lt;STRONG&gt;ConvertMaterial&lt;/STRONG&gt;メソッドをオーバーライドします。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: gray"&gt;/// &amp;lt;summary&amp;gt;
/// &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;ModelProcessorから派生したプロセッサー
&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;/// &amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;ContentProcessor&lt;/SPAN&gt;(DisplayName = &lt;SPAN style="COLOR: #a31515"&gt;"MyModelProcessor"&lt;/SPAN&gt;)]
&lt;SPAN style="COLOR: blue"&gt;public class &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;MyModelProcessor &lt;/SPAN&gt;: &lt;SPAN style="COLOR: #2b91af"&gt;ModelProcessor
&lt;/SPAN&gt;{
    &lt;SPAN style="COLOR: green"&gt;// ConvertMaterialをオーバーライドして、マテリアル変換時に自分のマテリアルに差し替える
     &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;protected override &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;MaterialContent &lt;/SPAN&gt;ConvertMaterial(&lt;SPAN style="COLOR: #2b91af"&gt;MaterialContent &lt;/SPAN&gt;material, &lt;SPAN style="COLOR: #2b91af"&gt;ContentProcessorContext &lt;/SPAN&gt;context)
    {
       &lt;SPAN style="COLOR: green"&gt;// エフェクトを含むことのできるEffectMaterialContentを使う
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;EffectMaterialContent &lt;/SPAN&gt;myMaterial = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;EffectMaterialContent&lt;/SPAN&gt;();

       &lt;SPAN style="COLOR: green"&gt;// 使いたいエフェクトファイルを外部参照として指定する
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;effectPath = &lt;SPAN style="COLOR: #2b91af"&gt;Path&lt;/SPAN&gt;.GetFullPath(&lt;SPAN style="COLOR: #a31515"&gt;"MyEffect.fx"&lt;/SPAN&gt;);
       myMaterial.Effect = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;ExternalReference&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: #2b91af"&gt;EffectContent&lt;/SPAN&gt;&amp;gt;(effectPath);

       &lt;SPAN style="COLOR: green"&gt;// 引数で渡されたmaterialの代わりに、ここで作ったmyMaterialを渡す
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return base&lt;/SPAN&gt;.ConvertMaterial(myMaterial, context);
    }
}&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;ここで指定しているMyEffect.fxファイルは直接読み込んでいるので、Visual Studioのプロジェクトに追加する必要はありません。また、複数のモデルやメッシュから参照されている場合でもこのマテリアルの実体は一度しか作られません。&lt;/P&gt;
&lt;P&gt;このサンプルコードでは直接ファイル名を指定していますが、渡されたマテリアル名(material.Name)や、material.OpaqueDataからファイル名を取得したり、ProcessメソッドをオーバーライドしてNodeContentの情報を保持しておいて、以下のコードのようにしてモデルファイルからの相対パスでファイル名を指定することもできます。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;directory = &lt;SPAN style="COLOR: #2b91af"&gt;Path&lt;/SPAN&gt;.GetDirectoryName(rootNode.Identity.SourceFilename);
&lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;effectPath = &lt;SPAN style="COLOR: #2b91af"&gt;Path&lt;/SPAN&gt;.Combine(directory, &lt;SPAN style="COLOR: #a31515"&gt;"MyEffect.fx"&lt;/SPAN&gt;);&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;これでエフェクトが使えますが、エフェクトにはパラメーターを設定するのが普通です。また、基本的なマテリアル情報は渡されたマテリアルから取得できるので、以下のようなコードを書くことができます。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(material &lt;SPAN style="COLOR: blue"&gt;is &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;BasicMaterialContent&lt;/SPAN&gt;)
{
    &lt;SPAN style="COLOR: #2b91af"&gt;BasicMaterialContent &lt;/SPAN&gt;basicMaterial = (&lt;SPAN style="COLOR: #2b91af"&gt;BasicMaterialContent&lt;/SPAN&gt;)material;

    &lt;SPAN style="COLOR: green"&gt;// エフェクトで使うテクスチャを設定する
     &lt;/SPAN&gt;myMaterial.Textures.Add(&lt;SPAN style="COLOR: #a31515"&gt;"DiffuseTexture"&lt;/SPAN&gt;, basicMaterial.Texture);

    &lt;SPAN style="COLOR: green"&gt;// ここで任意のエフェクトパラメーターの設定もできる
     &lt;/SPAN&gt;myMaterial.OpaqueData.Add(&lt;SPAN style="COLOR: #a31515"&gt;"Shininess"&lt;/SPAN&gt;, basicMaterial.SpecularPower * 10);
    myMaterial.OpaqueData.Add(&lt;SPAN style="COLOR: #a31515"&gt;"BumpSize"&lt;/SPAN&gt;, 42);
}
&lt;SPAN style="COLOR: blue"&gt;else if &lt;/SPAN&gt;(material &lt;SPAN style="COLOR: blue"&gt;is &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;EffectMaterialContent&lt;/SPAN&gt;)
{
    &lt;SPAN style="COLOR: #2b91af"&gt;EffectMaterialContent &lt;/SPAN&gt;effectMaterial = (&lt;SPAN style="COLOR: #2b91af"&gt;EffectMaterialContent&lt;/SPAN&gt;)material;

    &lt;SPAN style="COLOR: green"&gt;// TODO: 渡されたマテリアルがEffectMaterialContentだった
     // 時の処理をここでする(必要ならば)
&lt;/SPAN&gt;}
&lt;SPAN style="COLOR: blue"&gt;else
    throw new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Exception&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"なんじゃこりぁ？"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;ここで設定したエフェクトやそのパラメーターは実行時に自動的に読み込まれ、設定されます。これで実行時の特別な処理いらずで通常のModelを描画するようにして独自のエフェクトが適用されたモデルを描画することができます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6830864" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category></item><item><title>XNA 2.0のコンテントパイプライン～その壱～</title><link>http://blogs.msdn.com/ito/archive/2007/12/20/xna20-content-pipeline-0.aspx</link><pubDate>Fri, 21 Dec 2007 04:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6822815</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ito/comments/6822815.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=6822815</wfw:commentRss><description>&lt;H2&gt;コンテントプロジェクト&lt;/H2&gt;
&lt;P&gt;XNA 2.0のプロジェクジェクトをソリューションエクスプローラで見ると以下のようになっています。&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=291 alt=subproject src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline0_F543/subproject_3.png" width=488 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline0_F543/subproject_3.png"&gt;&lt;/P&gt;
&lt;P&gt;参照設定の項目が二つあることに気づいたでしょうか？これは&lt;STRONG&gt;Content&lt;/STRONG&gt;がWindowsGame1のサブプロジェクトになっているからです。XNA 2.0では、このサブプロジェクト内にコンテントを追加します。その他にも、以前まではメインプロジェクトに記述されていたコンテントに関する情報、例えばコンテントがどのようにインポートされプロセスされるかの情報、カスタマイズされたコンテントパイプラインアセンブリの参照などが含まれます。&lt;/P&gt;
&lt;P&gt;以前はWindows、Xbox 360の両対応のゲームを開発している時に、XNA 1.0ではそれぞれのプロジェクトに同じコンテントを追加しないといけませんでした。それだけでもコンテントの管理が面倒だったのですが、XNA 2.0になってプロセッサプロパティ対応になったので、細かいパラメーター設定まで両方のプラットフォームのプロジェクトで設定しないというのは面倒であり、エラーの原因にもなります。&lt;/P&gt;
&lt;P&gt;そこで、XNA 2.0ではWindows、Xbox 360の両プラットフォームでコンテント情報を共有するための仕組みとしてできたのがコンテントサブプロジェクトです。&lt;/P&gt;
&lt;P&gt;XNA 2.0ではWindowsプロジェクトを作ったときにプロジェクトの右クリックメニューで&lt;STRONG&gt;「Create Copy of Project for Xbox 360...」&lt;/STRONG&gt;を選択すると、Windosプロジェクトを元にしてXbox 360用のプロジェクトを作ることができます。この時、両方のプロジェクトにコンテントプロジェクトが存在しますが実際には同じサブプロジェクトを参照しているだけです。&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=294 alt=untitled src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline0_F543/untitled_3.png" width=400 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline0_F543/untitled_3.png"&gt;&lt;/P&gt;
&lt;P&gt;コンテントプロジェクトを共有している訳ですから、Windowsのコンテントプロジェクトにコンテントを追加すると、同じコンテントがXbox 360側のコンテントプロジェクトにも追加されるようになっています。これでWindows、Xbox 360両対応のゲームを作る時の手間が大幅に減ることになります。&lt;/P&gt;
&lt;H2&gt;コンテントプロジェクトの実体&lt;/H2&gt;
&lt;P&gt;このコンテントプロジェクト、テンプレートを使ってゲームプロジェクトを作った場合、&lt;STRONG&gt;「プロジェクトフォルダ\Content」&lt;/STRONG&gt;フォルダ内に&lt;STRONG&gt;Content.contentproj&lt;/STRONG&gt;というファイル名で作られます。&lt;/P&gt;
&lt;P&gt;このファイル中身は知らない人には単なるXMLファイルのように見えますが、Visual Studio 2005から採用された新しいビルトツールであるMSBuildのプロジェクトになっています。Visual Studio 2005やVisual C# Express上でビルドした場合、裏ではMSBuildがビルドする仕事を担っています。&lt;/P&gt;
&lt;P&gt;実は普段目にしている&lt;STRONG&gt;.csproj&lt;/STRONG&gt;ファイルもMSBuild用のプロジェクトファイルになっているのでパスの通っている状態でコマンドラインから&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;msbuild.exe myproject.csproj&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;と、タイプするとC#のプロジェクトをビルドすることができます。もちろん、Content.contentprojファイルも単独でビルドすることができます。つまり、コンテントビルドだけを単独で行うことができるわけです。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;「コマンドラインなんて普段使わないから、関係ないのでは」&lt;/STRONG&gt;と思う人もいるかもしれませんが、この仕組みを利用して以前紹介した&lt;A href="http://blogs.msdn.com/ito/archive/2007/05/07/content-pipeline-part4.aspx" target=_blank mce_href="http://blogs.msdn.com/ito/archive/2007/05/07/content-pipeline-part4.aspx"&gt;コンテントパイプラインのデバッグ&lt;/A&gt;をする第3の方法に使える訳です。&lt;/P&gt;
&lt;P&gt;この方法はVisual Studio 2005上でしか使えませんが、コンテントパイプライン拡張用のプロジェクトのプロパティ画面のデバッグ設定を以下のように変更することでコードに変更を加えることなくデバッグすることができます。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;外部プログラムの開始にMSBuild.exeを指定する。(私の環境では&lt;STRONG&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe&lt;/STRONG&gt;となっていました)&lt;/LI&gt;
&lt;LI&gt;コマンドライン引数にデバッグ対象となるContent.cotentprojファイルをフルパスで指定する&lt;/LI&gt;
&lt;LI&gt;コンテントパイプライン拡張用のプロジェクトを実行する(右クリック/デバック/新しいインスタンスを開始) &lt;BR&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=483 alt=debugProcessor src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline0_F543/debugProcessor_3.png" width=741 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/xna20contentpipeline0_F543/debugProcessor_3.png"&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;これで、カスタムプロセッサのデバッグなどを普通のプロジェクトをデバッグする時と同じようにデバッグすることができます。デバッグ設定は一度設定すれば後は変更する頻度は少ないので、コードを変更する必要のある他の手法に比べるとお手軽かもしれません。&lt;/P&gt;
&lt;P&gt;デフォルトではプラットフォームはWindows、Debug状態の設定でビルトが行われます。プラットフォームを変更したい場合はコマンドライン引数でファイル名を指定する前にWindowsならば&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/p:XnaPlatform=Windows&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Xbox 360の場合は&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/p:XnaPlatform="Xbox 360"&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;と、指定することで異なるプラットフォームでのコンテントビルドをすることができます。&lt;/P&gt;
&lt;P&gt;デバッグ、リリースの変更は&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/p:BuildConfiguration=Debug&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;または&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/p:BuildConfiguration=Release&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;と、することで変更することができます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6822815" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+2.0/default.aspx">XNA 2.0</category></item><item><title>コンテントパイプラインで使われる型</title><link>http://blogs.msdn.com/ito/archive/2007/10/10/content-pipeline-types.aspx</link><pubDate>Wed, 10 Oct 2007 21:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5392982</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/5392982.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=5392982</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://blogs.msdn.com/shawnhar/default.aspx" target=_blank mce_href="http://blogs.msdn.com/shawnhar/default.aspx"&gt;Shawn Hargreaves氏のブログ&lt;/A&gt;に、コンテントパイプラインで使われるタイプがどのように使われるかを表した&lt;A href="http://blogs.msdn.com/shawnhar/archive/2007/10/10/content-pipeline-types.aspx" target=_blank mce_href="http://blogs.msdn.com/shawnhar/archive/2007/10/10/content-pipeline-types.aspx"&gt;図が記載&lt;/A&gt;されています。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;図の左側から、ソースアセットからどのインポーターを使ってContent DOM形に変換され、どのプロセッサーがどんな型のデータを出力し、TypeWriterによってXNBファイルに書き込まれ、最後にランタイム時にTypeReaderによってどの型に読み込まれるかというのを網羅しているので、非常に有益な情報です。&lt;/P&gt;
&lt;P&gt;何も問題がなければ、この情報は次のXNA Frameworkのドキュメントに記載される予定です。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5392982" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_397DCB4E_/default.aspx">紹介</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category></item><item><title>Content Pipeline その４ そのデバッグ</title><link>http://blogs.msdn.com/ito/archive/2007/05/07/content-pipeline-part4.aspx</link><pubDate>Tue, 08 May 2007 07:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2473831</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/2473831.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=2473831</wfw:commentRss><description>&lt;H3&gt;コンテント・パイプラインのデバッグ&lt;/H3&gt;
&lt;P&gt;前回は、実際のコードを見ながらコンテント・パイプラインのカスタマイズの方法を紹介しました。前回のように、ロジック自体が簡単な場合は良いのですが、もう少し複雑なプログラムをコーディングしている時に必要になるのが、インポーターやプロセッサのコードをデバッグすることです。&lt;/P&gt;
&lt;P&gt;ここで問題なのは、ゲーム本体をデバッグする感覚でブレークポイントをコンテント・パイプラインのコード部分に設定してビルドしたとしても、何事も無かったかのようにビルトが終了してしまうということです。コンテント・ビルドは普通にアプリケーションを走らせるのと違い、GSEが水面下でMSBuildを実行しているので、GSE上で走らせるアプリケーション用のブレークポイントを設定しても意味がないからです。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;コンテント・パイプライン用に書いたコードをデバッグする方法としては、JIT(Just-In-Time)デバッガをつかう方法とCLRデバッガをアタッチする二種類の方法があります。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;JITデバッガを使う&lt;/H3&gt;
&lt;P&gt;Visual Studio 2005をインストールしているか、&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=ja" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=ja"&gt;.Net Framework 2.0 SDK(無償)&lt;/A&gt;をインストールしたときに使えるようになるCLRデバッガがあるWindows XP環境なら、コード部分に&lt;/P&gt;&lt;PRE class=code&gt;    System.Diagnostics.&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Debugger&lt;/SPAN&gt;.Launch();
&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;と、書くことで、ビルド実行時に以下のようなJITデバッガ選択ダイアログが開きます。&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinepart4_10E2F/JITDialog%5B4%5D.png" border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinepart4_10E2F/JITDialog%5B4%5D.png"&gt; &lt;/P&gt;
&lt;P&gt;このダイアログから、CLRデバッガ、またはVisual Studio 2005をデバッガとして起動することで、コンテント・パイプライン用コードのデバッグができます。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;CLRデバッガをアタッチして使う&lt;/H3&gt;
&lt;P&gt;残念ながら、現状では、前述のJITデバッガ機能はWindows Vista上では動作しません。そこでWindows Vista上でコンテント・パイプラインをデバッグするにはCLRデバッガ(Visual Studio 2005でも可)をVisual Studio C# Expressにアタッチしてデバッグする方法を紹介します。CLRデバッガは、&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=ja" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=ja"&gt;.Net Framework 2.0 SDK(無償)&lt;/A&gt;をインストールすることで使えます。&lt;/P&gt;
&lt;P&gt;まずは、以下のコードのように、デバッガがアタッチしている時にのみ中断するようにします。&lt;/P&gt;&lt;PRE class=code&gt;    &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;if&lt;/SPAN&gt; (System.Diagnostics.&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Debugger&lt;/SPAN&gt;.IsAttached)
        System.Diagnostics.&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Debugger&lt;/SPAN&gt;.Break();
&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;次にVisual Studio C# Expressを実行した状態で、CLRデバッガ(スタートメニューから、Microsoft .Net Framework SDK v2.0/Tools/Microsoft CLR Debuggerを選択)を別に実行し、CLRデバッガ上で&lt;STRONG&gt;「Tools/プロセスにアタッチ」&lt;/STRONG&gt;を選択すると以下のようなダイアログボックスが開きます。&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinepart4_10E2F/attach.png" border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinepart4_10E2F/attach.png"&gt; &lt;/P&gt;
&lt;P&gt;この選択可能なプロセスのリストの中から、&lt;STRONG&gt;VCSExpress.exe&lt;/STRONG&gt;を選択してから、アタッチボタンを押します。これで、CLRデバッガがVisual Studio C# Expressをデバッグしている状態になります。&lt;/P&gt;
&lt;P&gt;この状態で、Visual Studio C# Express上でビルドを実行すると、先に書いたコード部分で実行が中断し、後はCLRデバッガ上でVisual Stuidio C# Express上と同じようにデバッグができます。実行中断したときに逆アセンブルが表示されいる場合がありますが、逆アセンブルウィンドウ上から右クリックして&lt;STRONG&gt;「ソースコードへ移動」&lt;/STRONG&gt;を選択することで、C#のソースコードが表示されます。&lt;/P&gt;
&lt;P&gt;また、デバッグした後にCLRデバッガ上で続行を選択すると、ビルド作業が続行されるので、一度アタッチしてしまえば何度でも簡単にデバッグすることができます。但し、インクリメンタルビルドが働いているので、単にビルドを複数回実行すると二回目以降は実際にビルド作業が入らないのでデバッグすることができません。コンテントの量が少ない場合はリビルドし、コンテントの量が多い場合はデバッグしたいコンテントファイルを更新してからビルドするのが効率的です。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;まとめ&lt;/H3&gt;
&lt;P&gt;今までは、私もJITデバッガを使っていたのですが、この方法だと常にデバッガを起動しようとするので、急いでいるときにコンテント・パイプラインのデバッグを終えてコードを戻すのを忘れて、他人にコードを渡してしまうなんてことも考えられます。それに対して、CLRデバッガをアタッチする手間はあるものの、逆に言えばデバッガをアタッチしない限りは、普通に動作するのでJITデバッガを使うときの問題は起きませんし、特定の例外が発生したときに中断するようにCLRデバッガ上から設定(Debug/例外メニューを使う)できるという利点があります。欠点を強いていうなら、中断するコードを大量に残したままに…なんてことがあるくらいでしょうか？&lt;/P&gt;
&lt;P&gt;以上をまとめると、&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Windows Vista上で開発してる場合はCLRデバッガ(Visual Studio 2005でも可)をアタッチして使う&lt;/LI&gt;
&lt;LI&gt;Windows XP上で開発している場合は好みによって使い分ける&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;と、いった感じになります。&lt;/P&gt;
&lt;P&gt;プログラムが思い通りに動かない時にデバッガを使うことで、問題点を直ぐに見つけることができることが多いので、カスタムインポーターや、カスタムプロセッサが期待通りに動かない時には、今回の方法でデバッグして効率的に問題を解決しましょう。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2473831" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category></item><item><title>Content Pipeline その２ その流れ</title><link>http://blogs.msdn.com/ito/archive/2007/04/17/content-pipeline-part2.aspx</link><pubDate>Wed, 18 Apr 2007 06:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2169071</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ito/comments/2169071.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=2169071</wfw:commentRss><description>&lt;H3&gt;コンテントの流れ&lt;/H3&gt;
&lt;P&gt;前回は、コンテントマネージメントに関する問題の複雑さについて書きました。今回から、その問題を解決する為に設計されたXNAのコンテント・パイプラインの仕組みを紹介していきます。下図は、XNAのコンテント・パイプラインの概念図です。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=600 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinepart2_1147B/ContentPipeline2.png" width=579 border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/contentpipelinepart2_1147B/ContentPipeline2.png"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;パイプラインの名から判るように、コンテントが上から下へ流れるように処理され、アセットとしてできあがったものをゲームで使うようになっています。コンテントを川の水、アセットを水道水として考えると、コンテント・パイプラインは、浄水場と配水管に例えることができます。&lt;/P&gt;
&lt;P&gt;コンテント・パイプラインは2つのプロセスに分けることができ、ビルド時にコンテントをアセットに変換する&lt;STRONG&gt;オフライン・プロセス&lt;/STRONG&gt;、ゲーム実行時にアセットを読み込む&lt;STRONG&gt;オンライン・プロセス&lt;/STRONG&gt;となります。この2つのプロセスは設計目的も明確に分かれていて、オフライン・プロセスではメモリ使用量や実行速度よりも、簡単にコンテントを加工できるように設計されているのに対して、オフライン・プロセスではアセットに対する処理のし易さよりも、メモリ使用量や実行速度重視で設計されています。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;オフライン・プロセス&lt;/H3&gt;
&lt;P&gt;オフライン・プロセスの中心となるのは、データを加工しやすい構造で保持する&lt;STRONG&gt;コンテント(Content)&lt;/STRONG&gt;です。XNAフレームワークには標準でMeshContent、AnimationContnet、TextureContnet等のコンテントがあります。コンテントは、その型に対応するTypeWriterとTypeReaderを記述することによって、どんな型でもコンテントとして扱うことができます。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;次にコンテントファイルからコンテントにデータを読み込む役割をするのが&lt;STRONG&gt;インポーター(Importer)&lt;/STRONG&gt;です。XNAフレームワークには標準でFbxImporter、XImporter、TextureImporter等のインポーターがあります。3Dモデルファイルなどからのインポートの場合、NodeContentやMeshContentに変換する為の処理が入るので、単なるファイルからの読み込みよりも複雑な処理になりますが、前述のようにNodeContentやMeshContent自体がデータ加工がしやすいように設計されているのに加え、&lt;STRONG&gt;MeshHelper&lt;/STRONG&gt;や&lt;STRONG&gt;MeshBuilder&lt;/STRONG&gt;といった補助クラスを使うことで、独自インポーター製作の労力を軽減できます。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;そして、コンテントに対して様々な処理をしたり、ゲームに最適なデータフォーマット変換するのが&lt;STRONG&gt;プロセッサ(Processor)&lt;/STRONG&gt;です。XNAフレームワークには標準でModelProcessor、MaterialProcessor、TextureProcessor等のプロセッサがあります。例えばModelProcessorはNodeContentからModelContentに変換するプロセッサで、実行時のパフォーマンス効率が良いようにマテリアル順に並び替えたり、頂点キャッシャの効率化のための頂点データの並び替えや、Windows/Xbox360のプラットフォームの違いによるデータ変換等が行われます。基本的にプロセッサはコンテントからコンテントへの加工をするのですが、XNAフレームワークでは処理前と処理後のコンテントを区別する為にプロセッサ処理後のコンテントは&lt;STRONG&gt;Microsoft.Xna.Framework.Content.Pipeline.Processors&lt;/STRONG&gt;内で宣言されています。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;最後に、コンテント、インポーター、そしてプロセッサの管理をするのが、コンテント・コンパイラ(ContentCompiler)です。主な仕事は、指定されたアセットを生成する為に指定されたインポーターとプロセッサを呼び、最後にTypeWriterを使ってXNBファイルへの書き出しをすることです。その他にも、時間節約の為にビルドや配置(Deploy)を必要なアセットのみだけに対して行うなどの処理もします。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;オンライン・プロセス&lt;/H3&gt;
&lt;P&gt;オフライン・プロセスで殆どの処理がすでに終わっているので、オンライン・プロセスではコンテント・マネージャー(ContentManager)を使い、TypeReaderを介してXNBファイルからのアセットを読み込むだけと、非常に単純なものになっています。ContentManagerは読み込んだアセットを保持しているので、既に読み込まれているアセットを読み込もうとした場合は、保持されているアセットを返すキャッシャ機能があります。読み込んだアセットは&lt;STRONG&gt;ContentManager.Unload&lt;/STRONG&gt;メソッドで一括して消去することができるので、システム用、ステージ用といった複数のContentManagerのインスタンスを持つことでアセットのライフサイクルの管理をすることができます。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;そしてカスタマイズへ&lt;/H3&gt;
&lt;P&gt;以上がコンテント・パイプラインの大まかな仕組みです。インポーターやプロセッサは独自のものが作れるように設計されているので、FBXやXファイル以外のモデルデータを読み込むインポーター、単純なパラメーターからフラクタルを使ってテクスチャや地形を生成するインポーター、ModelContentから当たり判定データに変換したりするプロセッサを作ったりということができます。&lt;/P&gt;
&lt;P&gt;最大の利点はインポーターやプロセッサはモジュール化しやすいので、作ったものを簡単に皆に使ってもらえる、使えるということではないでしょうか？&lt;/P&gt;
&lt;P&gt;次からは、実際にインポーターや、プロセッサの作り方の紹介をしていきます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2169071" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category></item><item><title>Content Pipeline その１ その問題点</title><link>http://blogs.msdn.com/ito/archive/2007/04/16/content-pipeline-part1.aspx</link><pubDate>Tue, 17 Apr 2007 05:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2159375</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ito/comments/2159375.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=2159375</wfw:commentRss><description>&lt;H3&gt;ゲームにはコンテントが必要&lt;/H3&gt;
&lt;P&gt;ゲーム製作で欠かせない要素として、プログラミングの他にコンテント作成があります。コンテントとは、3Dモデル、テクスチャ、フォント、サウンド、ゲームのパラメーターといったものの総称です。このコンテントを作るツール、例えばテクスチャならフォトショップ、3DモデルならMayaなどといったツールをDCC(Digital Content Creation)ツールと呼びます。DCCツールというと、高いお金を払って買うものと思われがちですが、自分で撮ったお気に入りの写真をゲームで使えば、その写真を撮るのに使ったデジカメはある意味DCCツールといえる訳です。さらに言えば、ゲームで使われるメッセージなどをWindowsに付いてくるメモ帳を使えば、それも立派なDCCツールとなるわけです。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;コンテントは必要だけど管理が面倒&lt;/H3&gt;
&lt;P&gt;次に、作ったコンテントをゲームで実際に使います。DirectXやMDXではテクスチャやXファイルをファイルから直接読み込むことができ、XNAでもWindows版ではテクスチャをファイルから読み込むことができますが、モデルに関してはXファイルを直接読み込むことはできません。今までDirectX等でゲームを作っていた人の中には&lt;STRONG&gt;「なんでTexture.LoadFromFileメソッドがXbox360上で使えないの？」&lt;/STRONG&gt;といった疑問を抱く人もいると思います。XNAでコンテントファイルから直接読み込めないようになっているのには以下の理由があります。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;拡張性がない&lt;/LI&gt;
&lt;LI&gt;コンテントファイルにはゲームに不必要なデータが含まれている&lt;/LI&gt;
&lt;LI&gt;読み込み時に余分なリソースを必要とする&lt;/LI&gt;
&lt;LI&gt;コンテント・マネージメント&lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1つ目の拡張性については、ファイルからの読み込みの場合、決められたファイルフォーマットから、決められたデータフォーマットへの読み込みしかできません。ですから、サポートされていないファイルフォーマットをゲーム上で使うには、ファイルフォーマット変換するツールを作る必要があります。ゲーム製作ではDCCファイルにゲーム独自のメタデータを追加することが良くあるので、仮にフォーマット変換ツールを作ったとしても、このメタデータが使えない場合もあります。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2つ目については、コンテントファイルフォーマットはコンテントを作りやすいように設計されていて、画像ファイルでは&lt;A href="http://ja.wikipedia.org/wiki/Exif" target=_blank mce_href="http://ja.wikipedia.org/wiki/Exif"&gt;EXIF&lt;/A&gt;、3Dモデルファイルなどではツールの環境データなどのゲームに不必要なデータが含まれていたりします。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;3つ目は、2つ目と同じように、ゲームで使うデータフォーマットはコンテントファイルフォーマットと違って、各プラットフォームで最適に動作するように設計されています。ですから、ファイル読み込み時にゲームに適したデータフォーマットへの変換が発生するので、その処理に時間が掛かるのと、変換用のメモリを必要とします。また、ゲーム用のデータフォーマットはプラットフォームの違いによっても変わってきます(例えばWindowsとXbox360では&lt;A href="http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3" target=_blank mce_href="http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3"&gt;エンディアン&lt;/A&gt;の違いなど)。これらの変換処理が複雑化するほど、読み込み時間も長くなる、つまり、ロード時間が長くなるのでゲームを快適に遊べなくなってしまいます。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;そして4つ目は、たとえファイルからデータを直接読めたとしても、開発環境を含めたコンテント・マネージメントのしくみ無しでは快適なゲーム開発環境が実現できないということです。例えば、Xbox360上でゲームを作っている場合、必要なファイルはネットワークを介してファイル転送する必要がありますが、コンテント・マネージメントがない場合、ファイル転送を手作業でしなければいけません。手作業だとファイルを転送し忘れたり、転送場所を間違ったりと、人為的ミスが発生してしまいます。また、大量のコンテントファイルがある場合、全てのファイルを転送したりすると時間の無駄にもなります。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;以上のように、ゲームでコンテントを使用するには様々な問題があり、これらの問題を解決し、XNAの目標である&lt;STRONG&gt;ゲーム開発者がゲーム開発に集中できる環境の提供&lt;/STRONG&gt;を実現するために設計されたのが&lt;STRONG&gt;コンテント・パイプライン&lt;/STRONG&gt;です。&lt;/P&gt;
&lt;P&gt;次回からは、数回に渡ってコンテント・パイプラインの仕組みを紹介していきます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2159375" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category></item><item><title>ゲームプログラミング開始</title><link>http://blogs.msdn.com/ito/archive/2007/03/06/1824882.aspx</link><pubDate>Wed, 07 Mar 2007 08:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1824882</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ito/comments/1824882.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=1824882</wfw:commentRss><description>&lt;P&gt;前回は、XNA Game Studio Expressでゲームプロジェクトを新規作成したときに生成されるテンプレートコードの中身の説明をしました。今回は、ゲームプログラムの基本となる以下のものを実装、つまりコーディングをします。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;コンテントの読み込み 
&lt;LI&gt;&lt;STRONG&gt;SpriteBatch&lt;/STRONG&gt;を使ったスプライト表示 
&lt;LI&gt;コントローラーによる移動&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;今回は、簡単な説明に留めますが、次回からはそれぞれについて詳しく説明していきます。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;コンテントの読み込み&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;XNAにはビットマップ、3Dモデル、オーディオといったゲームを作る上で必要なコンテントを簡単に、効率よく使うための&lt;STRONG&gt;コンテント・パイプライン&lt;/STRONG&gt;というものがあります。全てのコンテントは、プロジェクトをビルドした時に、コンテント・パイプラインによって処理され、Windows/Xbox360上で効率良く使えるデータ形式に変換されるようになっています。また、それぞれのゲームで独自形式のフォーマットを取り扱えるようにカスタマイズできる機能を持っています。&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=64 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/3c74cae540bf_1073C/air-plane%5B3%5D.png" width=128 align=left border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/3c74cae540bf_1073C/air-plane%5B3%5D.png"&gt;&lt;/P&gt;
&lt;P&gt;今回使うコンテントは、左の飛行機の絵が一枚だけです。XNAでは全ての画像データはテクスチャとして変換されます。コンテントのプロジェクトへの追加はソートコードの追加と同じで、ソリューション エクスプローラからコンテントを追加するプロジェクトを右クリックしてメニューを開き、その中の&lt;STRONG&gt;追加/既存の項目&lt;/STRONG&gt;を選びます。&amp;nbsp;ダイアログボックスが開いたら、ファイルの種類を&lt;STRONG&gt;Content Pipeline Files&lt;/STRONG&gt;にしてから追加したいコンテントを選びます。&lt;/P&gt;
&lt;P&gt;GSE 1.0では以下のファイルフォーマット形式がサポートされています。&lt;/P&gt;
&lt;P align=center&gt;
&lt;TABLE class="" cellSpacing=0 cellPadding=2 width=399 border=1 unselectable="on"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=98&gt;3Dモデル&lt;/TD&gt;
&lt;TD class="" vAlign=top width=102&gt;2D画像&lt;BR&gt;&lt;/TD&gt;
&lt;TD class="" vAlign=top width=97&gt;マテリアル&lt;/TD&gt;
&lt;TD class="" vAlign=top width=100&gt;オーディオ&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width=97&gt;.FBX&lt;BR&gt;.X&lt;/TD&gt;
&lt;TD class="" vAlign=top width=104&gt;.DDS .BMP&lt;BR&gt;.JPG .PNG&lt;BR&gt;.TGA&lt;/TD&gt;
&lt;TD class="" vAlign=top width=97&gt;.FX&lt;/TD&gt;
&lt;TD class="" vAlign=top width=100&gt;.XAP(XACT)&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;プロジェクトディレクトリ直下に直接コンテントを追加してもいいのですが、コンテントとコードの区別がつくようにプロジェクトディレクトリの下に&lt;STRONG&gt;Content&lt;/STRONG&gt;というディレクトリを作っておくと便利です。また、この場合、ContentManagerの初期化の時(&lt;STRONG&gt;Initialize&lt;/STRONG&gt;メソッド内)にコンテントのルートディレクトリを指定しておくと、コンテントの読み込みの時に&lt;STRONG&gt;"Content/アセット名"&lt;/STRONG&gt;と書かずに済みます。&lt;/P&gt;&lt;PRE class=code&gt;        &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// コンテントのルートディレクトリを"Content"に設定する
&lt;/SPAN&gt;        content = &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ContentManager&lt;/SPAN&gt;(Services, &lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Content"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;実際のコンテントの読み込みをする為には以下のようなコードを&lt;STRONG&gt;LoadGraphicsContent&lt;/STRONG&gt;メソッド内に書きます。&lt;/P&gt;&lt;PRE class=code&gt;        &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// 飛行機用のテクスチャを読み込む
&lt;/SPAN&gt;        airPlaneTexture = content.Load&amp;lt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Texture2D&lt;/SPAN&gt;&amp;gt;(&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"air-plane"&lt;/SPAN&gt;);

&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;ContentManager&lt;/STRONG&gt;クラスには&lt;STRONG&gt;Load&amp;lt;T&amp;gt;&lt;/STRONG&gt;という、ジェネリクスメソッドがあり、どのような型のコンテントでも同じようにして読み込むことができます。.Net 2.0ならではの機能であるジェネリクスを使うことによって、今までのように&lt;STRONG&gt;LoadTexture2D&lt;/STRONG&gt;、&lt;STRONG&gt;LoadMeshFromFile&lt;/STRONG&gt;といった、長い関数名を覚える必要もなく簡単にコンテントを読み込むことができます。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;スプライトの描画&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;XNAでは簡単にテクスチャイメージを描画する為の&lt;STRONG&gt;SpriteBatch&lt;/STRONG&gt;というクラスがあります。なぜ単に&lt;STRONG&gt;Sprite&lt;/STRONG&gt;ではなく、&lt;STRONG&gt;SpriteBatch&lt;/STRONG&gt;という名前になっているかというと、このクラスは複数のスプライトをまとめて処理(バッチ処理)する機能をもっているからです。詳細については別の投稿で説明しますが、簡単に言うとWindows/Xbox360の違いを気にせずに、高パフォーマンスを実現しながらも、簡単に使える便利なものといった感じです。&lt;/P&gt;&lt;PRE class=code&gt;        &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// SpriteBatchに描画開始を伝える
&lt;/SPAN&gt;        spriteBatch.Begin();

        &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// 飛行機のテクスチャを指定した座標に表示する
&lt;/SPAN&gt;        spriteBatch.Draw(airPlaneTexture, airPlanePos, &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Color&lt;/SPAN&gt;.White);

        &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// SpriteBatchに描画終了を伝える
&lt;/SPAN&gt;        spriteBatch.End();

&lt;/PRE&gt;
&lt;P&gt;以上のコードを&lt;STRONG&gt;Draw&lt;/STRONG&gt;メソッド内に書き加えます。&lt;STRONG&gt;SpriteBatch.Begin&lt;/STRONG&gt;と&lt;STRONG&gt;SpriteBatch.End&lt;/STRONG&gt;の間に&lt;STRONG&gt;SpriteBatch.Draw&lt;/STRONG&gt;メソッドを書くようにします。&lt;STRONG&gt;Begin&lt;/STRONG&gt;と&lt;STRONG&gt;End&lt;/STRONG&gt;の間には何回でも&lt;STRONG&gt;Draw&lt;/STRONG&gt;を呼ぶことができます。&lt;STRONG&gt;SpriteBatch.Begin&lt;/STRONG&gt;を呼ぶ前にDrawを呼んだり、&lt;STRONG&gt;SpriteBatch.Begin&lt;/STRONG&gt;を続けて呼んだりすると、実行時に例外が発生します。&lt;/P&gt;
&lt;P&gt;スプライトは回転、スケールといった機能もサポートしていますが、ここでは単にテクスチャを指定した座標に描画しています。座標を表すのが&lt;STRONG&gt;Vector2&lt;/STRONG&gt;構造体なので、2D描画に浮動小数点を使って大丈夫なの？と思う人もいるかもしれませんが、最近のGPUの殆どがピクセル以下の描画をサポートしていて、画面をゆっくりとスクロールさせる時などの滑らかさに違いが現れます。&lt;/P&gt;
&lt;P&gt;ですから、XNAでゲームを作った場合は、昔の日本製パソコンで出てたシューティングゲームのように&lt;STRONG&gt;「脅威の0.5ドットスクロール」&lt;/STRONG&gt;と宣伝することが奨励されています(ウソです)。&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;コントローラーによる移動&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ここまでで、画面には飛行機が表示されるようになっていますが、ここではその飛行機をコントローラーによって動かすコードを実装します。&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;PRE class=code&gt;    &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// 飛行機の座標をコントローラー及び、キーボードの入力によって変更する
&lt;/SPAN&gt;    &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Vector2&lt;/SPAN&gt; dir;
    &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;if&lt;/SPAN&gt; (ProcessKeyboardInput(&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;out&lt;/SPAN&gt; dir) == &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;false&lt;/SPAN&gt;)
    {
        &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// キー入力が無かったので、コントローラーの左スティックの状態を取得する
&lt;/SPAN&gt;        dir = &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;GamePad&lt;/SPAN&gt;.GetState(&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;PlayerIndex&lt;/SPAN&gt;.One).ThumbSticks.Left;
    }

    dir.Y = -dir.Y; &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// スクリーン座標のY方向とキー入力の上下を合わせる

&lt;/SPAN&gt;    &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;const&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;float&lt;/SPAN&gt; speed = 400.0f; &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// ピクセル/秒の速度
&lt;/SPAN&gt;    airPlanePos += dir * (&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;float&lt;/SPAN&gt;)gameTime.ElapsedGameTime.TotalSeconds * speed;

&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;&amp;nbsp;上のコードを&lt;STRONG&gt;Update&lt;/STRONG&gt;メソッド内に書き加えます。日本では北米程にXbox360が普及していない、つまりXbox360コントローラーを持っている人が少ないと思われるので、&lt;STRONG&gt;ProcessKeyboardInput&lt;/STRONG&gt;というメソッドでキーボード入力をサポートしましたが、ここでは割愛します。&lt;/P&gt;
&lt;P&gt;ゲームコントローラーの入力は、自由な時に&lt;STRONG&gt;GamePad.GeState&lt;/STRONG&gt;を使うことによって、その状態を知ることができます。コントローラーが繋がっていない場合でも、プログラム自体は問題なく動作するので上のように非常に簡単にコントローラーの入力を処理することができます。&lt;/P&gt;
&lt;P&gt;ここでは&lt;STRONG&gt;ThumbSticks.Left&lt;/STRONG&gt;という、コントローラーの左スティックの状態を取得しています。&lt;STRONG&gt;ThumbSticks.Left&lt;/STRONG&gt;は&lt;STRONG&gt;Vector2&lt;/STRONG&gt;構造体で、スティックの左右は&lt;STRONG&gt;Vector2.X&lt;/STRONG&gt;に格納され、左が-1、右の状態が1の値を示し、スティックの上下は&lt;STRONG&gt;Vector2.Y&lt;/STRONG&gt;に格納され、上が1、下が-1の値を示します。アナログスティックなので傾け方によって、-1から1までの値に変化します。&lt;/P&gt;
&lt;P&gt;コントローラーから、移動したい方向を取得した後は、その方向への移動量を現在の座標に加えることによって移動します。ここでは単に一定量の速度で移動させるのではなく、&lt;STRONG&gt;GameTime.ElapsedGameTime&lt;/STRONG&gt;を使うことで、&lt;STRONG&gt;Game.IsFixedTimeStep&lt;/STRONG&gt;が&lt;STRONG&gt;false&lt;/STRONG&gt;の時にフレームレートが変化した場合でも、飛行機が同じ速度で移動するようになっています。&lt;STRONG&gt;Game.IsFixedTimeStep&lt;/STRONG&gt;によるゲーム更新の仕方の違いは次の投稿で詳しく説明します。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;ゲームの基本ができた&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/3c74cae540bf_1073C/Sample01-screenshot%5B8%5D.jpg" target=_blank mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/3c74cae540bf_1073C/Sample01-screenshot%5B8%5D.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=187 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/3c74cae540bf_1073C/Sample01-screenshot_thumb%5B8%5D.jpg" width=240 align=left border=0 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/3c74cae540bf_1073C/Sample01-screenshot_thumb%5B8%5D.jpg"&gt;&lt;/A&gt;ここまででゲーム製作の基本である、コンテントの読み込み、メインループでの更新、描画、そしてコントローラーの入力といった処理のXNA上でのやり方を紹介してきました。これだけでも、簡単な2Dベースのゲームを作る下地はできたのではないでしょうか？&lt;/P&gt;
&lt;P&gt;今回、実装したコードをアップしておきます。下に表示されている&lt;STRONG&gt;Attachment&lt;/STRONG&gt;のSample01.zipをクリックすることでダウンロードできます。Windows用とXbox360用のソリューションファイルが入っているので、どちらのプラットフォームでも動作します。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1824882" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/ito/attachment/1824882.ashx" length="12957" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/Xbox360/default.aspx">Xbox360</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category></item></channel></rss>