アバターを使おう その4:カスタムアニメーション

Creators Club Onlineサイトでアバターのカスタムアニメーション関連のサンプル等が公開されました。内容的には以下の三つになります。いずれもプレミアムコンテントになっているので、ダウンロードするにはCCO会員になっている必要があります。 Custom Avatar Animation Sample(カスタムアニメーションサンプル) Avatar Animation Rig(アバターアニメーション生成用のリグ) Avatar Animation Pack(アバターアニメーションパック) Custom Avatar Animation Sample このサンプルではアバターを自分のゲーム内で自由にアニメーションさせるための有用な情報が提供されています。3Dモデリングツール上でアニメーションリグを使って作ったアニメーションデータを作り、カスタムコンテントプロセッサーを介してFbxファイルから読み込み、CustomAvatarAnimationPlayerを使って任意のアニメーションをゲーム内で再生するという流れになっています。 Avatar Animation Rig キャラクターアニメーションを作るときにひとつひとつのボーンをアニメーションさせるのは非常に面倒で時間の掛かる作業なので、その作業時間を軽減するためにリグ(Rig)と言われるものを使います。ここではMayaとSoftimage Mod Tool用のアニメーションリグをダウンロードすることができます。 Softimage Mod Toolの画面   Maya 2008上での画面 Avatar Animation Pack これはゲームなどでよく使われるアニメーションデータをダウンロードすることができます。アニメーションデータはFbxファイル、Maya、そしてSoftimage Mod Tool用の三種類のファイル形式が用意されています。 アニメーションは21種類あり、歩く、走る、ジャンプといった基本的な移動アニメーションの他にも座る、倒れる、泳ぐといったものがあるので、アニメーションを作るときに参考にしたり、ゲームの雛形を作るときに仮データとして使えます。

0

自動XNBファイルシリアライズ

コンテントタイプライター/リーダーを書くのは面倒 XNA Game Studioのコンテント・パイプラインでのデータの流れは下図のようになっています。オフラインプロセスは開発しているVisual Studio上でビルドしたときにWindows上で処理されるプロセスで、オフラインプロセスはWindows、Xbox 360、Zune上でゲームを実行したときに処理されるプロセスです。 元からサポートされているデータをそのまま扱う場合には良いのですが、カスタムデータを扱う場合に書かないといけないのが、ContentTypeWrite/ContentTypeReaderでした。特に面倒だったのが、読み込みと書き込みという対称的な処理をするのにContentTypeWriterはオフラインプロセス側、ContentTypeReaderはオンラインプロセス側と別々の場所で書かないといけないことでした。 この面倒臭さを解決する為に、XNA GS 3.1では自動XNBシリアライズ機能が追加されました。この機能を使うことで、多くの場面でContentTypeWriter/ContentTypeReaderを書く必要がなくなりました。 自動XNBシリアライズ機能の使い方 自動XNBシリアライズは.Netのリフレクション機能を使って実装されています。ContentTypeWriter/ContentTypeReaderが指定されていない場合、自動XNAシリアライズが発生し、以下のルールに沿って動作します。 公開(public)メンバー、プロパティがシリアライズの対象になる シリアライズしたくないメンバーがある場合は、[ContentSerializerIgnore]属性を指定することで、シリアライズしないように指定できる private, protected, internalなどの非公開メンバーをシリアライズしたい場合は[ContentSerializer]属性を指定する シリアライズしたいデータ構造が再帰的な参照を含む場合は[ContentSerializer(SharedResource = true)]を指定する コンテント・パイプライン内とランタイム時の型が違う場合、[ContentSerializerRuntimeType(“タイプ名”)]を指定する シンプルな例 例えば以下のようなデータをゲームで扱うとします。ゲームとコンテント・パイプラインで共有するデータなので、ゲームプロジェクトの他に共有するデータを入れるためのプロジェクトを作る必要があります。例えばMyDataTypesという名前のプロジェクトです。 // ねこクラス public class Neko { public string Name; // 名前 public float Weight; // 体重 public int Tails; // 尻尾の数 } このデータをコンテント・パイプライン内に読み込むために以下のようなXMLファイル、cats.xmlを書きます。 <?xml version="1.0" encoding="utf-8" ?> <XnaContent> <Asset Type="MyDataTypes.Neko[]"> <Item> <Name>たま</Name>…

3

XNA GS 3.1のコンテント・パイプラインで使われる型

以前、Shawn Hargreaves氏のブログでXNA GS 2.0のコンテント・パイプライン内でデータが変換される過程図が紹介されました。 http://blogs.msdn.com/shawnhar/archive/2007/10/10/content-pipeline-types.aspx XNA GS 3.1がリリースされたので、それに合わせて元の図を翻訳し、SoundEffect、Video等の新しい型を追加した図を作ってみました。アセットファイルがどのようにインポートされ、プロセッサで処理され、ContentTypeWriterからXNBファイルとして書き出されるまに使われる型情報を網羅しているので、カスタムインポータや、カスタムプロセッサを作るときに役立つと思います。 左側の水色の部分はコンテント・パイプライン内で処理される部分で、右側の黄色い部分はゲーム実行時に処理される部分です。

2

Gamefest Japan 2008 デモプログラム

2010/9/17 追記: XNA Game Studio 4.0のサンプルをhttp://higeneko.net/hinikeni/sample/xna40/GamefestJapan2008Demo.zipにアップしました。変更点は「サンプルコードをXNA 4.0向けに更新」に書いてあります。 2010/05/16 追記: マテリアルバッチ描画時のDrawIndexedPrimitiveメソッドへの引数設定が間違っていたのを修正しました。 2009/06/25 追記: XNA GS 3.1用のサンプルを http://higeneko.net/hinikeni/sample/xna31/GamefestJapan2008Demo.zipにアップしました 2008/12/26 追記: デモプログラムの更新、キーボード入力で操作できるようになりました。 やっと終わりました 今年の9月に行われたGamefest Japan 2008のプレゼンテーション資料が先月公開されました。 http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx 私も僭越ながら2つのセッションを担当させて頂き、そのプレゼンテーション資料も公開されています。XNA Game Studioでのゲーム開発においてのパフォーマンス改善について戦略的手法と実践的な手法、主にシステムレベルでの最適化の効果の程を紹介させていただきました。 http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip 本当はプレゼン時にサンプルプログラムの配布したかったのですが、本業の方のXNA Framework作業の方が佳境の最中で、その合間に書いたコードだったので非常に汚いコードであったのと、先月のXNA Game Studio 3.0のリリースまでその忙しさが続いたので、なかなか公開することができませんでした。っていうか、コメントを追加するのは当然として、他にも3.0対応にしたり、再利用可能なコンポーネントを使いやすく書き換えたりして、発表時のコードよりも4,000行近く増えてしまったのも、今まで時間が掛かった原因でした。 ともかく、なんとか人に見せられる程度の体裁は整えたので、デモプログラムを公開します。 http://higeneko.net/hinikeni/sample/GamefestJapan2008Demo.zip 解凍したフォルダの中には以下の3つのソリューションファイルがあるので、好きなソリューションファイルを使ってください。いずれのプロジェクトを開くのにもXNA Game Studio 3.0が必要です。また、Windowsで実行するにはシェーダーモデル2.0以上のビデオカードが必須になります。 DemoWin.sln Windows用のソリューションファイル DemoXbox.sln Xbox 360用のソリューションファイル Demo.sln Windows/Xbox 360の両方のプロジェクトが入ったソリューションファイル フォントは私がプログラムする時に使っている等幅フォントのConsolasを使用しています。Consolasフォントが無い場合はビルドエラーになるので、以下のURLからConsolasフォントをダウンロードするか、フォント名を変更するようにしてください。 https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&displaylang=en このサンプルプロジェクトのコード、アセットは非商用、商用に関わらず、自由に使ってかまいません。ただし、一部のコードはクリエータークラブオンラインのMesh Instancingのコードを流用、または変更しているので、それらのコードのライセンスについては付属されるMicrosoft Permissive License.rtfに沿います。 http://creators.xna.com/en-US/sample/meshinstancing で、お約束ですが、このサンプルコードやアセットを使用したことで発生したいかなる問題にも当方は責任を負いません。…

9

簡単(かもしれない)日本語表示

2010/09/17 XNA Game Studio 4.0用サンプルをhttp://higeneko.net/hinikeni/sample/xna40/SimpleMessage.zipにアップしました。詳細は「サンプルコードをXNA 4.0向けに更新」を見てください。 2009/06/25 XNA GS 3.1用のサンプルをhttp://higeneko.net/hinikeni/sample/xna31/SimpleMessage.zipにアップしました。 以前紹介した英数字以外の文字列表示方法はコンテントパイプラインの全体の流れを説明するという目的もあったので複雑なつくりになっていました。RPGやテキストベースのアドベンチャーゲームなどの大量のテキストデータを扱う場合は、こういったものは必須になってきますが、今回はXNA 2.0から導入されたプロセッサパラメーターを使ってのシンプルな日本語を含む多言語文字列表示方法を紹介します。 とりあえず、前回のサンプルを2.0用に書き直しておきました。 MessageTextSample 2.0 なぜSpriteFontなのか? Windowsアプリケーションプログラミングを経験した人達にとってXNAに同様の文字列描画APIがないというのは疑問に思うかも知れません。なぜ、普通のWindowsのアプリケーションのようにOSにインストールされたフォントを指定して文字列を簡単にかけないのでしょうか?それには主に以下の理由があります。 容量: 日本語のフォントファイルのサイズは大きくて再配布が難しい 速度: テクスチャ形式のフォントに比べて描画処理に時間が掛かる 法律: 面倒だから放っておくと、後でさらに面倒なことになる罠のこと 娯楽: OSにインストールされいるフォントを使うと事務的な印象を受けてしまう 1については、日本語フォントの殆どは約7,000文字近くのデータを持っています。私のマシンにインストールされているMSゴシックのファイルサイズは8MB近くあります。殆どのゲームでは500~1,500文字程度の文字しか使わないので7,000文字のデータを持つのは効率的ではありません。更に、キャラクターや状況によって複数のフォントを使い分けるのでファイルサイズが大きいというの問題になります。 2は、通常のフォントはTrueTypeと呼ばれるデータ形式で、これは一文字一文字のポリゴンデータを持っているようなものでテクスチャにあらかじめ描画された文字をひとつの四角形ポリゴンで表示するより処理するのに時間が掛かります。また、フォントデータは必要になったときにHDDから読み込むのでリアルタイム性の高いゲームを作ってるときにはその遅延時間を考慮しなければいけないという問題もあります。 3は面倒な問題で、フォントには著作権があり、その使用許諾の形式もフォントを作っている会社によってさまざまなものがありますが、その多くはテクスチャとして文字を使うのは良くてもフォントファイル自体の再配布を禁じているものがあります。それ以外にもいろんなライセンス契約形式があることに注意してください。 4については、フォントと言うのはゲームの雰囲気を伝えるために重要なもので、キャラクターやその場の雰囲気によって複数のフォントを使うことが多いです。例えばおどろどろしい雰囲気を出すために古印体というフォントを使ったりしますが、そういった特徴的なフォントがOSにインストールされていることは殆どありません。また、テクスチャにすることで のように普通の文字列の間にビットマップで描いた絵を文字として組み合わせることもできます。 以上の理由からXNAではSpriteFontを採用しています。 簡単メッセージプロセッサ 今回のサンプルの基本アイディアは FontDescriptionProcessorから派生したMessageProcessorを作る MessageProcessor.Processメソッド内で任意の文字列をFontDescriptionに追加する 追加する文字はMessageFilenameプロパティに指定されたファイルから読み込む と、シンプルなものです。カスタムプロセッサのプロセスメソッドは以下のようになっています。 public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context) { // MessageFilenameで指定されたファイル内の文字を追加する AppendCharacters(input, context); // 文字列を追加した後は単純にFontDescriptionProcessorのプロセスを呼ぶだけ return base.Process(input, context); }…

1

XNA 2.0のコンテントパイプライン~その弐~

プロセッサパラメーター 上の画面はテクスチャのプロパティ画面です。Content Processorの脇に+のついた四角いマークに気づいたでしょうか? クリックすると複数のパラメーターが表示されます。これがXNA GS 2.0の新機能の一つであるプロセッサパラメーターです。XNA GSE 1.0では複数の複数のプロセッサを書く必要がありましたが、XNA GS 2.0ではひとつのパラメーターつきのプロセッサを書くだけで、どのようにコンテントがプロセスされるかを指定できるようになりました。 Textureプロセッサには以下のパラメーターが設定できます。 パラメーター名 用途 Color Key Color カラーキーの指定 Color Key Enabled この値がTrueの時にColor Key Colorと同じピクセルのアルファ値が0に変換される Generate Mipmaps ミップマップ生成のコントロール Resize to Power of Two 元のイメージを最も近い2の乗数のサイズにリサイズするかしないか Texture Format 出力するテクスチャのフォーマット NoChange(変換なし)、Color(32ビットRGBA)、DxtCompressed(DXT圧縮形式) Modelプロセッサでは以下のパラメータが設定できます。 パラメーター名 用途 Color Key Color カラーキーの指定 Color Key Enabled この値がTrueの時にColor Key Colorと同じピクセルのアルファ値が0に変換される Generate Mipmaps ミップマップ生成のコントロール Generate Tangent Frames…

3

カスタムエフェクト

フォーラムの質問を見て、今まで書いていなかったことに気づいたので遅ればせながらカスタムエフェクトの使い方を説明します。 例によって例の如く、コピー元はShawn Hargreaves氏の投稿からです。 独自に作ったエフェクトを使うには2つの方法があります。ひとつはコンテント・パイプラインが処理したエフェクトをゲーム実行時に切り替える方法。そしてふたつ目はカスタムプロセッサを書くことで、コンテントパイプライン内でコンテントビルド時に独自のエフェクトに切り替える方法です。 後者の方法の方が自由度が高く、ゲーム実行時に余計な処理をしなくて済むようになるので、ここではこの方法を紹介します。 まず最初にModelProcessorから派生したプロセッサーを作り、ConvertMaterialメソッドをオーバーライドします。/// <summary> /// ModelProcessorから派生したプロセッサー /// </summary> [ContentProcessor(DisplayName = “MyModelProcessor”)] public class MyModelProcessor : ModelProcessor { // ConvertMaterialをオーバーライドして、マテリアル変換時に自分のマテリアルに差し替える protected override MaterialContent ConvertMaterial(MaterialContent material, ContentProcessorContext context) { // エフェクトを含むことのできるEffectMaterialContentを使う EffectMaterialContent myMaterial = new EffectMaterialContent(); // 使いたいエフェクトファイルを外部参照として指定する string effectPath = Path.GetFullPath(“MyEffect.fx”); myMaterial.Effect = new ExternalReference<EffectContent>(effectPath); // 引数で渡されたmaterialの代わりに、ここで作ったmyMaterialを渡す return base.ConvertMaterial(myMaterial, context); } } ここで指定しているMyEffect.fxファイルは直接読み込んでいるので、Visual…

1

XNA 2.0のコンテントパイプライン~その壱~

コンテントプロジェクト XNA 2.0のプロジェクジェクトをソリューションエクスプローラで見ると以下のようになっています。 参照設定の項目が二つあることに気づいたでしょうか?これはContentがWindowsGame1のサブプロジェクトになっているからです。XNA 2.0では、このサブプロジェクト内にコンテントを追加します。その他にも、以前まではメインプロジェクトに記述されていたコンテントに関する情報、例えばコンテントがどのようにインポートされプロセスされるかの情報、カスタマイズされたコンテントパイプラインアセンブリの参照などが含まれます。 以前はWindows、Xbox 360の両対応のゲームを開発している時に、XNA 1.0ではそれぞれのプロジェクトに同じコンテントを追加しないといけませんでした。それだけでもコンテントの管理が面倒だったのですが、XNA 2.0になってプロセッサプロパティ対応になったので、細かいパラメーター設定まで両方のプラットフォームのプロジェクトで設定しないというのは面倒であり、エラーの原因にもなります。 そこで、XNA 2.0ではWindows、Xbox 360の両プラットフォームでコンテント情報を共有するための仕組みとしてできたのがコンテントサブプロジェクトです。 XNA 2.0ではWindowsプロジェクトを作ったときにプロジェクトの右クリックメニューで「Create Copy of Project for Xbox 360…」を選択すると、Windosプロジェクトを元にしてXbox 360用のプロジェクトを作ることができます。この時、両方のプロジェクトにコンテントプロジェクトが存在しますが実際には同じサブプロジェクトを参照しているだけです。 コンテントプロジェクトを共有している訳ですから、Windowsのコンテントプロジェクトにコンテントを追加すると、同じコンテントがXbox 360側のコンテントプロジェクトにも追加されるようになっています。これでWindows、Xbox 360両対応のゲームを作る時の手間が大幅に減ることになります。 コンテントプロジェクトの実体 このコンテントプロジェクト、テンプレートを使ってゲームプロジェクトを作った場合、「プロジェクトフォルダ\Content」フォルダ内にContent.contentprojというファイル名で作られます。 このファイル中身は知らない人には単なるXMLファイルのように見えますが、Visual Studio 2005から採用された新しいビルトツールであるMSBuildのプロジェクトになっています。Visual Studio 2005やVisual C# Express上でビルドした場合、裏ではMSBuildがビルドする仕事を担っています。 実は普段目にしている.csprojファイルもMSBuild用のプロジェクトファイルになっているのでパスの通っている状態でコマンドラインから msbuild.exe myproject.csproj と、タイプするとC#のプロジェクトをビルドすることができます。もちろん、Content.contentprojファイルも単独でビルドすることができます。つまり、コンテントビルドだけを単独で行うことができるわけです。 「コマンドラインなんて普段使わないから、関係ないのでは」と思う人もいるかもしれませんが、この仕組みを利用して以前紹介したコンテントパイプラインのデバッグをする第3の方法に使える訳です。 この方法はVisual Studio 2005上でしか使えませんが、コンテントパイプライン拡張用のプロジェクトのプロパティ画面のデバッグ設定を以下のように変更することでコードに変更を加えることなくデバッグすることができます。 外部プログラムの開始にMSBuild.exeを指定する。(私の環境ではC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exeとなっていました) コマンドライン引数にデバッグ対象となるContent.cotentprojファイルをフルパスで指定する コンテントパイプライン拡張用のプロジェクトを実行する(右クリック/デバック/新しいインスタンスを開始) これで、カスタムプロセッサのデバッグなどを普通のプロジェクトをデバッグする時と同じようにデバッグすることができます。デバッグ設定は一度設定すれば後は変更する頻度は少ないので、コードを変更する必要のある他の手法に比べるとお手軽かもしれません。 デフォルトではプラットフォームはWindows、Debug状態の設定でビルトが行われます。プラットフォームを変更したい場合はコマンドライン引数でファイル名を指定する前にWindowsならば /p:XnaPlatform=Windows Xbox 360の場合は /p:XnaPlatform=”Xbox 360″ と、指定することで異なるプラットフォームでのコンテントビルドをすることができます。 デバッグ、リリースの変更は /p:BuildConfiguration=Debug または…

0

コンテントパイプラインで使われる型

Shawn Hargreaves氏のブログに、コンテントパイプラインで使われるタイプがどのように使われるかを表した図が記載されています。   図の左側から、ソースアセットからどのインポーターを使ってContent DOM形に変換され、どのプロセッサーがどんな型のデータを出力し、TypeWriterによってXNBファイルに書き込まれ、最後にランタイム時にTypeReaderによってどの型に読み込まれるかというのを網羅しているので、非常に有益な情報です。 何も問題がなければ、この情報は次のXNA Frameworkのドキュメントに記載される予定です。

1

Content Pipeline その4 そのデバッグ

コンテント・パイプラインのデバッグ 前回は、実際のコードを見ながらコンテント・パイプラインのカスタマイズの方法を紹介しました。前回のように、ロジック自体が簡単な場合は良いのですが、もう少し複雑なプログラムをコーディングしている時に必要になるのが、インポーターやプロセッサのコードをデバッグすることです。 ここで問題なのは、ゲーム本体をデバッグする感覚でブレークポイントをコンテント・パイプラインのコード部分に設定してビルドしたとしても、何事も無かったかのようにビルトが終了してしまうということです。コンテント・ビルドは普通にアプリケーションを走らせるのと違い、GSEが水面下でMSBuildを実行しているので、GSE上で走らせるアプリケーション用のブレークポイントを設定しても意味がないからです。   コンテント・パイプライン用に書いたコードをデバッグする方法としては、JIT(Just-In-Time)デバッガをつかう方法とCLRデバッガをアタッチする二種類の方法があります。   JITデバッガを使う Visual Studio 2005をインストールしているか、.Net Framework 2.0 SDK(無償)をインストールしたときに使えるようになるCLRデバッガがあるWindows XP環境なら、コード部分に System.Diagnostics.Debugger.Launch(); と、書くことで、ビルド実行時に以下のようなJITデバッガ選択ダイアログが開きます。 このダイアログから、CLRデバッガ、またはVisual Studio 2005をデバッガとして起動することで、コンテント・パイプライン用コードのデバッグができます。   CLRデバッガをアタッチして使う 残念ながら、現状では、前述のJITデバッガ機能はWindows Vista上では動作しません。そこでWindows Vista上でコンテント・パイプラインをデバッグするにはCLRデバッガ(Visual Studio 2005でも可)をVisual Studio C# Expressにアタッチしてデバッグする方法を紹介します。CLRデバッガは、.Net Framework 2.0 SDK(無償)をインストールすることで使えます。 まずは、以下のコードのように、デバッガがアタッチしている時にのみ中断するようにします。 if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();   次にVisual Studio C# Expressを実行した状態で、CLRデバッガ(スタートメニューから、Microsoft .Net Framework SDK v2.0/Tools/Microsoft CLR Debuggerを選択)を別に実行し、CLRデバッガ上で「Tools/プロセスにアタッチ」を選択すると以下のようなダイアログボックスが開きます。 この選択可能なプロセスのリストの中から、VCSExpress.exeを選択してから、アタッチボタンを押します。これで、CLRデバッガがVisual Studio C# Expressをデバッグしている状態になります。 この状態で、Visual Studio C# Express上でビルドを実行すると、先に書いたコード部分で実行が中断し、後はCLRデバッガ上でVisual…

1