アバターを使おう その1:アバターを表示する

アバターをゲーム画面内に表示する

アバターをゲームt画面内に表示するには以下の三つのクラスが重要な役割を果たします。

  • AvatarDescription
  • AvatarAnimation(必ずしも必要ではない)
  • AvatarRenderer

AvatarDescription

AvatarDescriptionはアバターの性別、容姿、服装といった情報を保持しています。AvatarDescriptionのプロパティには男性(Male)、女性(Female)を表すBodyType、メートル単位の身長を表すHeightがあります。AvatarDescriptionを得るには以下の三つの方法があります。

  1. SignedInGamer.Avatarからゲーマータグのアバター情報を取得する
  2. AvatarDescription.CreateRandomメソッドを使ってランダムにアバターを生成する
  3. AvatarDescription(byte[] data)コンストラクタを使って生成する

1はゲーマータグに関連付けられたらアバター情報をSignedInGamer.AvatarからAvatarDescriptionを取得して使う方法で、自分のアバターをゲーム内で使う方法です。

2の手法は、自分のアバター以外をゲーム内で使ったり、複数の違った体形のアバターを自分のゲーム内で表示しても問題がないようにテスト目的として使う方法です。

3の方法は、アバター情報をネットワークを介して転送する時に使用します。実際にはByte[]型であるAvatarDesciprion.Descriptionプロパティの情報をネットワークを介して転送し、転送されたデータをAvatarDescription(byte[])コンストラクタに渡すことで同じアバターを生成することができます。

また、2の方法ではランダムにアバターを生成しますが、ゲームの雰囲気にあったアバターを自由に作りたいという時があります。この場合、ダッシュボード上で仮のゲーマープロファイルを生成、好きなアバターを編集します。そして、作ったアバターでサインインした状態でXNA Game Studioを起動、デバッガ上で該当するアバターのAvatarDescription.Descriptionプロパティの値を保存しておくことで自分の好きなタイプのアバターをゲーム内で使うことができます。

AvatarAnimation

XNA GS 3.1ではアバター用に31種類のアニメーションが用意されています。このアニメーションを再生する為に使うのがAvatarAnimationクラスです。AvatarAnimationクラスには現在のアニメーション再生位置、ボーン情報、表情(Expression)などの情報などが含まれます。AvatarAnimationクラスはAvatarAnimationPreset列挙型を指定して生成、通常はAvatarAnimation.Updateメソッドを使用してアニメーション再生をすることができます。

また、AvatarAnimation.CurrentPositionプロパティは現在のアニメーション再生位置を取得することに使いますが、任意の再生位置を設定することで自由にアニメーションすることもできます。

AvatarRenderer

アバターをゲーム画面に描画するにはAvatarRendererクラスを使用します。AvatarRendererクラスはBasicEffectクラスとや同じように描画するアバターのWorld、View、Projection行列や、環境光源(AmbientLightColor)や平行光源(LightDirection, LightColor)を指定することができます。BasicEffectと違うところは描画するときにアバターのボーン情報や表情を指定できることです。通常はAvatarAnimationのBoneTransformsExpresssionプロパティを指定します。

また、指定するボーン情報は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);

上記のコードを実行すると、以下のようにアバターが画面に表示されます。このコードではランダムにアバターを作っているので実行するたびに違うアバターが表示されます。

itoxe1-78

アバターを使う上での注意点

  • GamerServiceComponentを追加するのを忘れないこと
  • 現状でアバターはXbox 360上でのみ動作するようになっています。ただし、アバター関連のコードをWindows上で走らせても例外が発生することなく動作します。
  • ゲーム内で使用するときには、背の高いのから低いのまで、痩せ型から太り気味といったさまざまなタイプのアバターが存在居るということに気をつける必要があります。例えば、アバターを矩形内に表示させたい時に身長の低いアバター向けに調整してしまうと、背の高いアバターを表示させると頭の上が途切れてしまうという問題があります。

参考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