UDN
Search public documentation:

PhysicalMaterialPropertyJP
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

UE3 ホーム > Physics > 物理マテリアル プロパティ

物理マテリアル プロパティ


概要


「Unreal Engine 3」では、 物理マテリアルマテリアルの概要 または マテリアル インスタンス コンスタント にアタッチすることができます。単に追加プロパティをもつマテリアルを作るのとは異なり、アタッチすることによって、複数のマテリアル上で物理マテリアル プロパティのオブジェクトを再利用することができるようになります。

簡単な例を次にあげます。 ワールド内のすべての砂利道に適用した砂利道マテリアルがあるとします。この砂利道マテリアルには、 GravelPhysicalMaterial (砂利物理マテリアル) という 物理マテリアル があります。GravelPhysicalMaterial 内で、物理マテリアルプロパティ オブジェクトを作成して、マテリアルがポーンに踏まれた時に再生する足音を格納しました。

これで、同一マテリアル上にある 2 つの物理マテリアルが、単一のマテリアル上でサポートされるようになりました。コリジョンが発生すると、ラインチェックコードがトライアングルのヒットを発見し、ヒット位置のテクスチャ UV を取得し、マスクテクスチャの中を調べることによって、ヒットされたピクセルが黒か白かを決定します。対応する物理マテリアルが返されることになります。詳細については、 物理マテリアル マスク のページを参照してください。

UnrealScript の具体例


PhysicalMaterial.uc をご覧ください。

具体的には:

PhysicalMaterial.uc
var(PhysicalProperties) export editinline PhysicalMaterialPropertyBase PhysicalMaterialProperty;

PhysicalMaterialPropertyBase.uc には、この先必要となるコメントが含まれています。

状況に応じた足音を出すとともに、フレームワークを配置して他の適正な PhysicalMaterial ベースのエフェクトを得るためには、 PhysicalMaterialPropertyBase のサブクラスを作成します。

MyGamePhysicalMaterialProperty.uc
class MyGamePhysicalMaterialProperty extends PhysicalMaterialPropertyBase
  collapsecategories
  editinlinenew
  hidecategories(Object);

var(Sounds) const SoundCue FootStepSoundCue;

これで、ポーンが歩くと (AnimNotify_Footstep またはその他のメソッドによって)、 PlayFootStepSound() を呼び出して、そのイベントを正しいポーンに送ることができるようになりました。そのポーンは、自分が歩いているサーフェスに基づいて、どのようなサウンドを再生すべきかを決定できるようになりました。例 : プレイヤーが砂利道を歩いているとします。 歩くとともに PlayFootStepSound() が呼び出された時に、下に向かってトレースし、物理マテリアルを発見し、保存されている SoundCue を取得し、それを再生します。

当然、PhysicalMaterials およびプロパティのフレームワークを使用して、上記のように、非常にすばらしい、状況に応じたあらゆる種類の機能を実行することができます。 (例 : 衝撃音、ヒットエフェクト、デカール、足音など)。

物理マテリアルの階層


プログラミングスタッフによって上記の固有なゲームクラスが作成されると、コンテンツチームが、物理マテリアルの階層を作成し、ゲームデザインに必要となるエフェクトで満たすことができるようになります。

コンテンツクリエーターのための詳細説明

PhysicalMaterial には、PhysicalMaterial 親変数があり、これによって、物理マテリアルの階層を作成することができます。(この例では) FootStep (足音) のサウンドの階層を作成することができます。たとえば、Default -> Clay (泥) -> Wet Clay (湿った泥) という階層を作ることができます。これで、コンテンツチームは、ゲームワールドにある物理マテリアルを極めて固有なものにすることができるようになります。Wet Clay の足音サウンドを出す必要があれば、そのようにすることができます。Wet Clay の足音サウンドがない場合は、それが見つかるまで階層を調べていくか、デフォルトの足音サウンドをもつ Default まで行き着きます。

階層を使用する

コードのサポートとパラメータ化された物理マテリアルの階層がそろったため、物理マテリアルをマテリアルにアサインすることができます。アサインが完了すると、ゲームで再生されるようになります。

コンテンツのヒント


(この例を進めるために) 足音を作成する場合は、サウンドチームによって、 SoundCues が、ソースサウンド、および、ピッチと減衰の両方の点においてランダムな足音となるようにしてもらいます。これによって、足音によりリアリティが増します。さらに、物理マテリアルシステムが正しく抽象化されるようになります。

「Unreal Tournament 3」の例


「Unreal Tournament 3」において、足音のサウンドは、マテリアルに関連付けられたサウンドキューに代わって、サーフェスのタイプをマテリアルのプロパティが格納することによって実装されました。そこから、UTPawn が、SoundGroupClass 内に格納されている再生すべき適切な SoundCue を調べます。

UTPawn.uc
simulated function name GetMaterialBelowFeet()
{
  local vector HitLocation, HitNormal;
  local TraceHitInfo HitInfo;
  local UTPhysicalMaterialProperty PhysicalProperty;
  local actor HitActor;
  local float TraceDist;

  TraceDist = 1.5 * GetCollisionHeight();

  HitActor = Trace(HitLocation, HitNormal, Location - TraceDist*vect(0,0,1), Location, false,, HitInfo, TRACEFLAG_PhysicsVolumes);
  if ( WaterVolume(HitActor) != None )
  {
    return (Location.Z - HitLocation.Z < 0.33*TraceDist) ? 'Water' : 'ShallowWater';
  }
  if (HitInfo.PhysMaterial != None)
  {
    PhysicalProperty = UTPhysicalMaterialProperty(HitInfo.PhysMaterial.GetPhysicalMaterialProperty(class'UTPhysicalMaterialProperty'));
    if (PhysicalProperty != None)
    {
      return PhysicalProperty.MaterialType;
    }
  }
  return '';
}

simulated function ActuallyPlayFootstepSound(int FootDown)
{
  local SoundCue FootSound;

  FootSound = SoundGroupClass.static.GetFootstepSound(FootDown, GetMaterialBelowFeet());
  if (FootSound != None)
  {
    PlaySound(FootSound, false, true,,, true);
  }
}

simulated event PlayFootStepSound(int FootDown)
{
  local PlayerController PC;

  if ( !IsFirstPerson() )
  {
    ForEach LocalPlayerControllers(class'PlayerController', PC)
    {
      if ( (PC.ViewTarget != None) && (VSizeSq(PC.ViewTarget.Location - Location) < MaxFootstepDistSq) )
      {
        ActuallyPlayFootstepSound(FootDown);
        return;
      }
    }
  }
}