UDN
Search public documentation:

MyFirstPawnJP
English Translation
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

はじめてのポーン

2226 ビルドのために2003年11月7日にChris Linder (DemiurgeStudios?)により作成。Chris Linder (DemiurgeStudios?)により更新。3323 のためのアニメーション コードの変更のため、Michiel Hendriks により最後に更新。

関連文書

「はじめてのコード」「はじめてのコントローラ」「はじめてのGameInfo」「はじめてのHUD」

はじめに

「はじめてのコード」文書をまだお読みでないなら、まず読む必要があります。

本書では、ワールドを移動し、適切にアニメーションを作成する簡単なポーン クラスの作り方を取り上げます。適切なアニメーションの作成には、歩くこと、走ること、身をかがめて歩くこと、泳ぐこと、飛ぶこと、ジャンプすること、落ちること、着地すること、何もしないことが含まれます。適切にアニメーションを作成することには、動きに基づかない任意のアニメーションをプレイするための機能も含まれています。これらすべてのアニメーションは、ネットゲームで適切に機能します。本書には、ポーンに適切にアニメーションを作成させるためのクラスばかりではなく、異なるモデルを使用してアニメーション コードを使用する方法を説明する、2つのサブクラス、 ExampleBoy と ExampleGirl が含まれます。男と女は、defaultproperties(デフォルト プロパティ)を調整するだけの取るに足りないクラスです。

本書には、コンパイルされた *.u ファイルとすべてを機能させるためのアニメーションとテクスチャのパッケージに加えて、UnrealScript ソース コードが含まれます。実行中のポーン例の詳細については、以下の「例をインストールする」を参照してください。

この例は、ストレート コード ドロップ、UDNBuild、UDNBuildOff、およびRuntime を含むエンジンのすべての2226 ビルドまたは、エンジンの 3323 (およびより以降のもの)ビルドで使用できます。

クラスのセットアップ

この例は、3つのクラス、ExamplePawn.uc, ExampleGirl.uc, および ExampleBoy.uc から構成されます。ExamplePawn には、アニメーションと動作のための主要な機能が含まれます。ExampleGirl と ExampleBoy は、両方ともExamplePawn の拡張で、モデル、アニメーション セット、衝突シリンダをdefaultpropertiesで指定する以上のことは何もしません。

新しいモデル

新しいポーンを作ることの最大の部分は、ポーンのために新しいモデルを作ることだと考えて良いでしょう。キャラクター モデルの作成の仕方についての詳細は、ModelingTableOfContents(コンテンツ テーブルのモデリング)文書を参照してください。

UKX ファイルにモデルがあれば、defaultpropertiesなどで Mesh 変数を指定して、ポーンのためにそのモデルを使用できます。

Mesh=SkeletalMesh'UDN_CharacterModels_K.GenericMale'
- or -
Mesh=SkeletalMesh'UDN_CharacterModels_K.GenericFemale'

インポートされたモデルが、適正なサイズでなかったり、適正に方向を定められていない場合があります。AnimBrowserReference(アニメーション ブラウザ リファレンス)に記述されているように、アニメーション ブラウザを使用して、モデリングのスケール、位置、方向を変更できます。

クラスのデフォルト プロパティでモデルの衝突シリンダのCollisionRadius とCollisionHeight を調整する必要もあります。

PointOfView

ポーンがコントローラに所有されるときに呼び出される関数である、 simulated function bool PointOfView() があります。この関数の戻り値により、カメラが3番目の人(真)であるか、最初の人(偽)であるかが決まります。ExamplePawn によって、bStartBehindView 変数が追加されるため、ポーンは、defaultpropertiesでこの変数をセットできます。カメラをスタートする仕方を変更するために PointOfView をオーバーライドするのとは対照的です。

ポーンの動作とアニメーション

ExamplePawn のためのアニメーションの大部分は、アニメーションに基づく物理演算を使用して実行されます。アニメーションに基づく物理演算とは、ポーンの動きによってポーンがプレイするアニメーションが何か決まることを意味します。これは、Unreal エンジンで普通に実行されるアニメーションの方式です。これは、シングル プレーヤの場合に機能するばかりではなく、複数プレーヤの状況でも非常に好都合です。というのは、それぞれのクライアントが、何のアニメーションをプレイするのが良いかを調べるために、与えられたポーンの動きを見るからです。余分な情報を送信する必要はありません。アニメーションに基づく物理演算を可能にするために、bPhysicsAnimUpdate が、defaultpropertiesで true (真) にセットされます。

アニメーションに基づく物理演算の詳細は、PhysicsBasedAnim(アニメーションに基づく物理演算)文書を参照してください。本書は、2226 コードドロップに基づきますが、それでも役に立つはずです。

v3323 およびそれ以降については、次の「ユーザー コントロールのアニメーション」までのセクションは無視していただいて構いません。アニメーションに基づく物理演算は変更されているので、完全な関連性がないからです。このことに関しての詳細は、PhysicsBasedAnim(アニメーションに基づく物理演算)文書をお読みください。v3323 よりも前のバージョンでは、UnrealScript は必要ではありません。正確な変数をセットするだけです。

動作のアニメーション

動作をするために、アニメーションに基づく物理演算では、6つのアニメーション名を使用して、ポーンがどのように動くかに基づいてアニメーションをプレイします。アニメーション名は次の通りです。

MovementAnims[0]      //Forward
MovementAnims[1]      //Back
MovementAnims[2]      //Left
MovementAnims[3]      //Right
TurnLeftAnim
TurnRightAnim

ポーンが前進しているとき、MovementAnims[0] によって指定されたアニメーションは、ループします。ポーンが左に移動しているとき、MovementAnims[2] によって指定されたアニメーションは、ループします。ポーンが前方および左に移動している場合は、前方および左のアニメーションが、アニメーション チャンネルを使用してブレンドし、その後ループします。ポーンが静止して立って、回転しているときは、TurnLeftAnim か TurnRightAnim のどちらかがループします。ポーンが回転する速度が速くなればなるほど、回転するアニメーションがそれだけ速くプレイします。

6つのアニメーションが、歩くこと、走ること、身をかがめること、泳ぐことなどの異なるアニメーション タイプすべての説明にどうしてなるのか不思議に思われるかも知れません。その答えは、プレーヤが動作タイプを変更する度に呼び出される関数 simulated function PlayMoving() に関わります。このことは、プレーヤが走ることから歩くことへ、または落ちることから歩くことへ、または飛ぶことから落ちることへ変更したことを意味します。PlayeMoving によって、ポーンが現在実行中の動作のタイプに基づいてその他の関数が呼び出されます。この関数によりMovenmentAnims がリセットされ、場合によっては回転アニメーションがリセットされることもあります。例えば、PlayMoving が呼び出されて、 =(Physics == PHYS_Flying)= 、次にAnimateFlying() が呼び出されると、AnimateFlying() は次のようになります。

// Play appropriate flying animations
simulated function AnimateFlying()
{
   MovementAnims[0]=FlyingAnims[0];
   MovementAnims[1]=FlyingAnims[1];
   MovementAnims[2]=FlyingAnims[2];
   MovementAnims[3]=FlyingAnims[3];
}

飛ぶことには、回転アニメーションは使用されません。したがってリセットされません。身をかがめることには、回転アニメーションが使用され、AnimateCrouchWalking() は次の通りです。

// Play appropriate crouching animations
simulated function AnimateCrouchWalking()
{
   MovementAnims[0]=CrouchAnims[0];
   MovementAnims[1]=CrouchAnims[1];
   MovementAnims[2]=CrouchAnims[2];
   MovementAnims[3]=CrouchAnims[3];
   TurnLeftAnim=CrouchTurnAnims[0];
   TurnRightAnim=CrouchTurnAnims[1];
}

PlayerMoving および Animate...() 関数は、以下で取り上げるジャンプすること、着地すること、落ちること以外のすべての動作のアニメーションの元になります。

ジャンプすること、着地すること、および落ちること

ジャンプすること、着地すること、および落ちることは、PlayJump, PlayLandingAnimation, および PlayFalling によって取り扱われます。これらはすべて、ポーンがそれぞれの動作を実行しているときにエンジンによって呼び出される関数です。PlayJump と PlayFalling は非常に単純です。以下にリストがあります。

simulated event PlayJump()
{
   AnimBlendToAlpha(LANDINGCHANNEL,0,0.0);
   if ( (Acceleration.X != 0) || (Acceleration.Y != 0) )
      PlayAnim(JumpMovingAnim, 1.0, 0.1);
   else
      PlayAnim(JumpStandingAnim, 1.0, 0.1);
}

simulated event PlayFalling()
{
   LoopAnim(FallingAnim, 1.0, 0.5);
}

PlayJump では、最初にAnimBlendToAlpha が呼び出されます。というのは、以下に記述される着地するチャンネルにより、素早く連続して複数回ジャンプすることが妨げるからです。

着地する場合は、アニメーション チャンネルを指定する必要があります。というのは、デフォルト(チャンネル 0 )で着地することをプレイした場合、動作のアニメーションが、着地するアニメーションを上書きしてしまうからです。すべての動作のアニメーションよりも高いチャンネルを使用したため、着地するアニメーションのプレイ後か、または外に動作のアニメーションが見えなくなった後は、そのチャンネルのアルファをブレンドして 0.0 に戻す必要がありました。これは、AnimEnd で実行されます。以下の関数で、以上を実行する方法が説明されます。

simulated event PlayLandingAnimation(float ImpactVel)
{
   AnimBlendParams(LANDINGCHANNEL, 1.0, 2.0, 2.0);
   PlayAnim(LandAnim, 0.4, 0.0, LANDINGCHANNEL);
}

simulated event AnimEnd(int Channel)
{
   Super.AnimEnd(Channel);

   ...
   if(Channel == LANDINGCHANNEL)
   {
      AnimBlendToAlpha(LANDINGCHANNEL,0,0.5);
   }
}

何もしないこと

何もしないことは、非常に単純です。エンジンによって、ポーンがそこに立っていることが検知されると、 simulated function PlayWaiting() が呼び出されます。この関数によって、ポーンの状態に基づく適切なアニメーションとともに LoopAnim が呼び出されます(以下の関数を参照)。LoopAnim が呼び出されると、速度 1.0 およびトゥイーン時間 0.2 が指定されます。これにより、アニメーションは、 0.2 秒で現在のアニメーションから標準速度およびトゥイーンでプレイするようになります。チャンネルは指定されていないので(LoopAnim のオプションのパラメータの1つです)、アニメーションは、チャンネル 0 上でプレイし、骨格全体に影響します。動作のアニメーションは、より高いチャンネルでプレイされるため、キャラクターが動き出すとき、何もしないことは、その上にブレンドされ見えません。

// Play appropriate idle animations
simulated function PlayWaiting()
{
   if(Physics == PHYS_Falling)
      LoopAnim(FallingAnim, 1.0, 0.2);
   else if(Physics == PHYS_Flying)
      LoopAnim(FlyIdle, 1.0, 0.2);
   else if(Physics == PHYS_Swimming)
      LoopAnim(SwimIdle, 1.0, 0.2);
   else
   {
      if(bIsCrouched)
         LoopAnim(CrouchIdle, 1.0, 0.2);
      else
         LoopAnim(StandIdle, 1.0, 0.2);
   }
}

ユーザー コントロールのアニメーション

ユーザー コントロールのアニメーションでは、ユーザーがボタンを押したり、コマンドを実行したりするときに、ポーンがアニメーションをプレイします。例えばUT2004 では、あざけるようにプレイします。これは、シングル プレーヤの状況ではかなり簡単です。しかし、上記のように、アニメーションはネットワークで送信されないので、ネットゲームではずっと困難になります。

したがって、関数 simulated event SetAnimAction(name NewAction) および変数 var name AnimAction が存在するのです。これらは、一緒に機能してアニメーション データをサーバからすべてのクライアントに送信するように設計されています。SetAnimAction が、サーバ側で呼び出されると、サーバからすべてのクライアントにレプリケートされる AnimAction が変更されます。クライアントが新しい AnimAction を受信すると、C++ のコードが、AnimAction が新しいかどうかを検知し、次に SetAnimAction によってプレイされる新しいアニメーションとともに SetAnimAction をそのクライアント側に呼び出します。一度アニメーションがプレイされると、AnimAction は、クライアントとサーバの両方にセットされ、次に SetAnimAction が呼び出されたときにはすべて再びうまく機能します。このためのコードは次の通りです。

//Called to have all clients play a single animation in the idle animation channel
simulated event SetAnimAction(name NewAction)
{
   AnimAction = NewAction;
   PlayAnim(NewAction); //Play on base channel, which is the idle channel
   bPlayedAnimAction = true;
}

simulated event AnimEnd(int Channel)
{
   Super.AnimEnd(Channel);

   if(Channel == 0 && bPlayedAnimAction) //idle channel
   {
      PlayWaiting(); //reset to normal idle
      bPlayedAnimAction = false;
      AnimAction = '';
   }
   ...
}

物理演算スクリプト

ポーンをコントロールするためにスクリプト シーケンスを使用しているときは、ScriptedController では、関数 SetMovementPhysics() が実装されることが期待されます。SetMovementPhysics は、Pawn.uc で定義されていますが、ボディを持ちません。もし独自の実装がない場合は、スクリプトしようとするポーンは、[PHYS_None] に等しい物理演算で空中に垂れ下がります。次の SetMovementPhysics の実装は、単純で、うまく機能します。

// Sets up Physics correctly for Scripted Sequences
function SetMovementPhysics()
{
   if (Physics == PHYS_Falling)
      return;
   if ( PhysicsVolume.bWaterVolume )
      SetPhysics(PHYS_Swimming);
   else
      SetPhysics(PHYS_Walking);
}

例をインストールする

Unreal Runtime

Runtime を使用している場合は、ExamplePawns.zip をダウンロードし、解凍し、ExamplePawns.urm を実行してください。ExamplePawns.urm を実行できない場合は、Runtime のインストール時に[Runtime modification association] (Runtime 修正関連付け)ボックスのチェックを外していることが考えられます。その場合は、以下のステップの通りにしてください。

  1. ExamplePawns.zip を開けて、ExamplePawns.urm を Runtime の System (システム」)ディレクトリに解凍します。
  2. Runtime の system ディレクトリのコマンド プロンプトを開けます。
  3. setup install ExamplePawns.urm と入力します。

いずれの場合も、インストール ウィンドウに表示される指示の通りにしてください。このようにして Runtime 用に例のポーンがインストールされます。

ポーンがインストールされた後は、そのポーンをいくつかの方法で使用できます。 User.ini を変更して、ポーンのタイプを指定できます。 User.ini の[DefaultPlayer] セクションで、Class を次のようにセットします。

Class=MyFirstExample.ExampleBoy
- or -
Class=MyFirstExample.ExampleGirl

また、次の行のどちらかを使用して、コマンド プロンプトからゲームを実行できます。この方法でも同様に User.ini が変更されます。

UE2Runtime EM_Runtime?Class=MyFirstExample.ExampleBoy
- or -
UE2Runtime EM_Runtime?Class=MyFirstExample.ExampleGirl

もう一つの方法は、ゲーム中にコンソールで次の行の一つを入力することです。この方法でも、User.ini が変更されます。

Open EM_Runtime?Class=MyFirstExample.ExampleBoy
- or -
Open EM_Runtime?Class=MyFirstExample.ExampleGirl

CodeDrop, UDNBuild, UDNBuildOff

UDNBuild または UDNBuildOff を使用している場合は、MyFirstPawn_UDNBuild.zip をダウンロードして、エンジンのビルドに解凍してください。

2226 コードドロップを使用している場合は、MyFirstPawn_CodeDrop.zip をダウンロードして、エンジンのビルドに解凍してください。3323 およびそれ以降を使用する場合は、MyFirstExample_CodeDrop3323.zip をダウンロードしてください。

この時点で、ポーンのタイプを指定するためにUser.ini を変更して、新しいポーンでプレイできます。User.ini の[DefaultPlayer] セクションで、Class を次のようにセットします。

Class=MyFirstExample.ExampleBoy
- or -
Class=MyFirstExample.ExampleGirl

これらの引数を使用してコマンド ラインからゲームを実行することもできます。この方法でも同様に、User.ini は変更されます。

UT2004 <YourMap>?Class=MyFirstExample.ExampleBoy
- or -
UT2004 <YourMap>?Class=MyFirstExample.ExampleGirl

もう一つの方法は、ゲーム中にコンソールで上記の行の一つを、「UT2004」 を 「Open」 と置き換えて入力することです。この方法でも同様に、User.ini は変更されます。

ネットプレイでポーンを使用する

これらのポーンをネットプレイで使用したいのであれば、ゲームをホストするコンピュータ上にすることが少しあります。

まず、<YourGame.ini> を編集し(UE2Runtime.ini または UT2004.ini など)、ServerPackages リストに MyFirstExample を入れます。ServerPackages リストは、INI ファイルの [Engine.GameEngine] セクションにあります。次の行をそのセクションに追加できます。

ServerPackages=MyFirstExample

次に MD5 データベースをリビルドする必要があります。エンジンのビルドの System ディレクトリのコマンド プロンプトを開けて、次のように入力してください。

UCC MASTERMD5 -c *.U

これでゲームをホストでき、他の人々が接続でき、みんなで一緒に、走ること/飛ぶこと/泳ぐことができます。システム ディレクトリのコマンド プロンプトに以下を入力してゲームをホストできます。

UE2Runtime <YourMap> -server
- or -
UW <YourMap> -server

「例をインストールする」セクションで上述のようにサーバに接続できますが、マップ名の代わりに、サーバの IP アドレスを使用してください。例えば、コマンド ラインから次のように入力できます。

UE2Runtime 192.168.1.112?Class=MyFirstExample.ExampleGirl

例に変更を加える - UnrealEd で例を使用する

所定のコードに変更を加えたい場合や、UnrealEd にExamplePawns を配置したい場合は、<your_game>.ini (UW.ini または UE2Runtime.ini など)にある EditPackages リストに「MyFirstExample」 を追加する必要があります。INI ファイルを開けて、「EditPackages」をテスト検索して、次ぎに、=EditPackages=MyFirstExample= 行をリストの一番下に追加します。リストは2つありますから、両方のリストに行を追加したことを確認してください。コードに変更を加える場合は、システム ディレクトリにある既存の MyFirstExample.u ファイルを削除し、コマンド ラインで ucc make と入力して行った変更を再コンパイルできます。