Twitter @HigenekoTwitter #XNA
アバターをゲームt画面内に表示するには以下の三つのクラスが重要な役割を果たします。
AvatarDescriptionはアバターの性別、容姿、服装といった情報を保持しています。AvatarDescriptionのプロパティには男性(Male)、女性(Female)を表すBodyType、メートル単位の身長を表すHeightがあります。AvatarDescriptionを得るには以下の三つの方法があります。
1はゲーマータグに関連付けられたらアバター情報をSignedInGamer.AvatarからAvatarDescriptionを取得して使う方法で、自分のアバターをゲーム内で使う方法です。
2の手法は、自分のアバター以外をゲーム内で使ったり、複数の違った体形のアバターを自分のゲーム内で表示しても問題がないようにテスト目的として使う方法です。
3の方法は、アバター情報をネットワークを介して転送する時に使用します。実際にはByte[]型であるAvatarDesciprion.Descriptionプロパティの情報をネットワークを介して転送し、転送されたデータをAvatarDescription(byte[])コンストラクタに渡すことで同じアバターを生成することができます。
また、2の方法ではランダムにアバターを生成しますが、ゲームの雰囲気にあったアバターを自由に作りたいという時があります。この場合、ダッシュボード上で仮のゲーマープロファイルを生成、好きなアバターを編集します。そして、作ったアバターでサインインした状態でXNA Game Studioを起動、デバッガ上で該当するアバターのAvatarDescription.Descriptionプロパティの値を保存しておくことで自分の好きなタイプのアバターをゲーム内で使うことができます。
XNA GS 3.1ではアバター用に31種類のアニメーションが用意されています。このアニメーションを再生する為に使うのがAvatarAnimationクラスです。AvatarAnimationクラスには現在のアニメーション再生位置、ボーン情報、表情(Expression)などの情報などが含まれます。AvatarAnimationクラスはAvatarAnimationPreset列挙型を指定して生成、通常はAvatarAnimation.Updateメソッドを使用してアニメーション再生をすることができます。
また、AvatarAnimation.CurrentPositionプロパティは現在のアニメーション再生位置を取得することに使いますが、任意の再生位置を設定することで自由にアニメーションすることもできます。
アバターをゲーム画面に描画するにはAvatarRendererクラスを使用します。AvatarRendererクラスはBasicEffectクラスとや同じように描画するアバターのWorld、View、Projection行列や、環境光源(AmbientLightColor)や平行光源(LightDirection, LightColor)を指定することができます。BasicEffectと違うところは描画するときにアバターのボーン情報や表情を指定できることです。通常はAvatarAnimationのBoneTransforms、Expresssionプロパティを指定します。
また、指定するボーン情報はIList<Matrix>型なので、自分で作った自由なアニメーションを設定することができます。アバターのボーン数は71あり、これ以外の数のボーンを指定すると例外が発生することに気をつけてください。カスタムアニメーションサンプルは近日中にクリエーターズ・クラブのサイトで公開予定です。
アバターはGamerServicesを利用するので、アバター機能を使うときにはGamerServiceComponentを追加するのを忘れないようにしましょう。忘れた場合はGamerService機能を初期化することを促す例外が発生します。
Components.Add(new GamerServicesComponent(this));
次にアバターを使うのに必要なオブジェクトを生成します。
// アバター情報をランダムに生成する avatarDescription = AvatarDescription.CreateRandom(); // アバターアニメーションの生成 avatarAnimation = new AvatarAnimation(AvatarAnimationPreset.Celebrate); // アバター描画用のオブジェクトの生成 avatarRenderer = new AvatarRenderer(avatarDescription);
次にゲームのアップデート内でアニメーションを以下のようにして更新します。
avatarAnimation.Update(gameTime.ElapsedGameTime, true);
最後にAvatarRendererにアバターを描画するのに必要な行列を設定し、ボーンと表情を指定することでアバターをゲーム画面内に描画することができます。
// アバター描画に必要な行列の設定 avatarRenderer.World = Matrix.CreateRotationY(MathHelper.ToRadians(180.0f)); avatarRenderer.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(30.0f), GraphicsDevice.Viewport.AspectRatio, 1, 1000); avatarRenderer.View = Matrix.CreateLookAt( new Vector3(0, 1, 4), new Vector3(0, 0.7f, 0), Vector3.Up); // ボーンと表情を指定してアバターを描画する avatarRenderer.Draw(avatarAnimation.BoneTransforms, avatarAnimation.Expression);
上記のコードを実行すると、以下のようにアバターが画面に表示されます。このコードではランダムにアバターを作っているので実行するたびに違うアバターが表示されます。
参考URL:
http://blogs.msdn.com/dejohn/archive/2009/05/08/avatar-api-preview-for-xna-game-studio-3-1.aspx
http://blogs.msdn.com/dejohn/archive/2009/05/11/what-to-do-while-an-avatar-loads.aspx
http://blogs.msdn.com/dejohn/archive/2009/05/18/lights-camera-avatar.aspx
http://blogs.msdn.com/dejohn/archive/2009/05/20/avatardescription-isvalid-when-why-the-description-returned-is-invalid.aspx
http://blogs.msdn.com/dejohn/archive/2009/05/28/avatardescription-description.aspx
PingBack from http://www.xna-today.jpn.org/archives/874
> 現状でアバターはXbox 360上でのみ動作するようになっています。ただし、アバター関連のコードをWindows上で走らせても例外が発生することなく動作します。
Windowsでは青い画面のまま、何も表示されません。
エラーもでないし動作はするが描画はされない、
ということでしょうか?
青い画面のまま描画されません。
エラーもでないし、実行はできるが、
青い画面のまま、というのは、
実質アバターアニメができるのは360上のみということでしょうか?
現状ではアバターが表示できるのはXbox 360上のみとなっています。