UDN
Search public documentation:

PhysicalMaterialPropertyCH
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 主页 >物理 > 物理材质属性

物理材质属性


概述


在 UE3 中,您可以将物理材质赋给材质材质实例常量。相对于只有一个具有其他属性的材质,附加一个物理材质属性会使您可以在多个材质上重新使用您的物理材质属性对象。

下面是一个快速示例: 您有一个砾石路材质,您将其应用在世界中的所有砾石路上。该砾石路材质具有一个名为 GravelPhysicalMaterial物理材质。在 GravelPhysicalMaterial 中,您成功创建了一个物理材质属性对象,它可以存储当 pawn 走在这个材质上时发出的脚步声。

现在,在同一个材质上的两个物理材质在每个单个的材质上都受支持。 当某个碰撞发生线检查代码发现一个三角形点击时,可以在点击位置获取贴图 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;

所以现在当 Pawn 行走(通过 AnimNotify_Footstep 或一些其他方法)时,您可以调用 PlayFootStepSound() ,它随后会将该事件发送给正确的 pawn。而现在 pawn 可以根据 pawn 所行走的表面来确定播放什么样的声音,例如,玩家沿着砾石路行走。当它行走的时候会调用 PlayFootStepSound() ,跟踪,找到这个物理材质,得到存储的 SoundCue(声效)然后播放。

很明显,使用 PhysicalMaterials 和一个属性框架,如上所述,您可以进行所有类型的真正令人敬畏的符合情境的功能(例如,撞击声音,攻击效果、贴花、脚步等等)

物理材质的层次结构


只要您负责编程的员工创建了以上特定的游戏类,您的内容团队就可以开始建立物理材质的层次结构并开始为它们填充游戏设计中要求的特效。

供内容创建者参考的详细信息

PhysicalMaterial 有一个 PhysicalMaterial Parent 变量,它允许您创建物理材质的层次结构和其中(在我们的示例中)FootStep 声的层次结构。所以您可以将 Default(默认值) -> Clay(黏土) -> Wet Clay(湿黏土)层次结构作为一个示例。所以,现在您的内容团队实际上可以在他们在游戏世界中具有的物理材质中指定。如果您想要有一个 Wet Clay(湿粘土)脚步声也可以。如果您没有 Wet Clay(湿粘土)脚步声,那么您可以查找层次结构直到找到一个或者最后使用 Default,它应该有默认脚步声。

使用层次结构

所以既然您具有代码支持和参数化的物理材质层次结构,您就可以将物理材质赋值给材质。只要您已经为它们赋值,那么您应该会在游戏中听到它们播放的声音。

内容建议


在制作脚步时(上接我们的示例),您应该让您的声音团队根据随机的脚步制作声效,一个源声,然后进行音调和衰减处理。这就会产生更多可信的脚步声。此外,它会为物理材质系统提供正确的提取方法。

虚幻竞技场 3 示例


虚幻竞技场 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;
      }
    }
  }
}