목차

물리적 재질에 의한 효과

총을 나무, 돌덩이, 금속 등을 향해 사격했을 때 각각 음향/피격효과/남는데칼 이 틀릴 것이다.

UnrealEngine3 에는 이렇게 재질별로 표현하는 효과를 다르게 할 수 있는 방법이 존재한다. 하지만 GearsOfWar2 는 좀 더 개량된 방법으로 이를 구현하였다.

여기서는 GearsOfWar2 에서 물리적 재질별로 효과를 다르게 표현하는 방식에 대해 알아본다.

관련 클래스

GoW2 에서는 재질별 표현할 효과를 정의하기 위해 GearPhysicalMaterialProperty 라는 클래스를 만들었다.

GearPhysicalMaterialProperty.uc
class GearPhysicalMaterialProperty extends PhysicalMaterialPropertyBase
...
 
// 변수
var() editinline   ImpactFXBallistic   DefaultFXInfoBallistic;     // 이 재질에 탄알형태의 무기에 의해 남는 Impact/Decal/Sound/CameraLensEffect 의 디폴트값.
var() editinline   ImpactFXExplosion   DefaultFXInfoExplosion;     // 이 재질에 폭탄형태의 무기에 의해 남는 Impact/Decal/Sound/CameraLensEffect 의 디폴트값.
 
var(FootSteps) editinline Array<FootStepDatum>  FootStepInfo;      // 이 재질위를 걷거나/기어오르거나/착지하거나/슬라이딩 했을 시 출력되는 사운드
 
var(FootSteps)            ParticleSystem    FootstepEffectWalk;    // 이 재질위를 걸을 때 출력되는 Particle 효과
var(FootSteps)            ParticleSystem    FootstepEffectRun;     // 이 재질위를 뛸   때 출력되는 Particle 효과
var(Dust)                 ParticleSystem    RoadieRun;             // 이 재질위를 로디런할 때 출력되는 Particle 효과
 
var(Dust)                 ParticleSystem    EvadeEffect;           // 이 재질위에서 회피할 때 출력되는 Particle 효과
var()   class<Emit_CameraLensEffectBase>    EvadeCameraLensEffect; // 이 재질위에서 회피할 때 출력되는 CameraLensEffect 효과
 
var(Dust)                 ParticleSystem    SlideIntoCoverEffect;  // 이 재질위에서 Cover In 했을 때 출력되는 Particle 효과
var(Dust)                 ParticleSystem    SlideIntoCoverNonPlayerEffect;  // 상동 but AI 가 했을 시
var()   class<Emit_CameraLensEffectBase>    SlideIntoCoverCameraLensEffect; // 이 재질위에서 Cover In 했을 때 출력되는 CameraLensEffect 효과
 
var(Decals)   editinline  GearDecalInfo     DecalInfo;             // 이 재질위에 뿌려지는 모든 Blood Decal 정보
 
// 함수
final simulated static function PhysicalMaterial GetImpactPhysicalMaterial( const out ImpactInfo Impact );  // Impact 로부터 PhysicalMaterial 정보를 획득
final simulated static function PhysicalMaterial GetImpactPhysicalMaterialHitInfo( const out TraceHitInfo HitInfo );  // HitInfo 로부터 PhysicalMaterial 정보를 획득
final simulated static function DecalData DetermineImpactDecalData( ... );  // 탄알/폭탄으로 타격했을 때 남길 Decal 정보를 획득
final simulated static function SoundCue DetermineImpactSound( ... );       // 탄알/폭탄으로 타격했을 때 출력할 Sound 정보를 획득
final simulated static function ParticleSystem DetermineEvadeParticleEffect( ... );  // Evade 시 출력할 Particle 정보를 획득
final simulated static function FogVolumeSphericalDensityInfo DetermineFogVolumeArchetype( ... ); // 폭탄으로 인해 남길 Fog 정보를 획득
final simulated static function ParticleSystem DetermineSlideIntoCoverEffect( ... ); // CoverIn 시 출력할 Particle 정보를 획득
final simulated static function ParticleSystem DetermineSlideIntoCoverNonPlayerEffect( ... ); // 상동 but AI
final simulated static function class<Emit_CameraLensEffectBase> DetermineImpactCameraEffect( ... ); // 탄알/폭탄으로 타격했을 때 출력할 CameraLensEffect 정보를 획득
final simulated static function class<Emit_CameraLensEffectBase> DetermineSlideIntoCoverCameraLensEffect( ... ); // CoverIn 시 출력할 CameraLensEffect 정보를 획득
final simulated static function class<Emit_CameraLensEffectBase> DetermineEvadeCameraLensEffect( ... ); // Evade 시 출력할 CameraLensEffect 정보를 획득
final simulated static function ParticleSystem DetermineRoadieRunParticleEffect( ... ); // 로디런 시 출력할 Particle 정보를 획득
final simulated static function ParticleSystem DetermineImpactParticleSystem ( ... ); // 탄알/폭탄으로 타격했을 때 출력할 Particle 정보를 획득
final simulated static function ParticleSystem DetermineExitWoundParticleSystem ( ... ); // 관통 시 출력할 Particle 정보를 획득
final simulated static function SoundCue DetermineFootStepSound( ... ); // 걸을 때 출력할 Sound 정보를 획득
final simulated static function SoundCue DetermineSlidingSound( ... ); // CoverIn 시 출력할 Sound 정보를 획득
final simulated static function SoundCue DetermineLandingSound( ... ); // 착지 시 출력할 Sound 정보를 획득
final simulated static function SoundCue DetermineLeapingSound( ... ); // 기어오를 시 출력할 Sound 정보를 획득
final simulated static function DecalData GetBloodDecalData( ... ); // 남길 Blood Decal 정보를 획득

보면 알겠지만 CoverIn 등과 같이 굉장히 특별한 경우에 표현할 임펙트/사운드/카메라렌즈효과 등도 지정 가능하다. 즉, 게임 특화된 필드를 마음대로 추가 가능하다는 소리다.

하지만 내부적으로 버전을 관리하므로 신중하게 필드를 추가해야 하겠다.

에디팅

언리얼에디터에서 PhysicalMaterial 타입의 리소스를 생성하면 물리적 재질의 속성을 설정할 수 있는데, 속성 중, PhysicalMaterialProperty 에서 더 디테일한 (위 클래스에서 정의한) 정보를 설정할 수 있다.

아래 스샷을 보면 이해가 빠를 듯

전략

특별히 물리적재질을 설정하지 않을 경우를 대비하여 디폴트 설정이 만들어져 있다. (DefaultPhysMat)

GoW2 는 다양한 물리적재질이 있고 대표적으로 다음과 같은 것들이 있다.

게임 내 Material 관련 에셋에서 상기 PhysicalMaterial 을 알맞게 적용한다. 핵심정보는 PhysicalMaterial 이 아니라 그 안의 속성인 PhysicalMaterialProperty 이다.

인게임에서 해당 PhysicalMaterial.PhysicalMaterialProperty 를 뒤져서 정보가 없을 경우 디폴트 설정의 것을 참조하게 된다.

코드 플로우

상기 함수를 키워드로 검색하면 대부분 나올 것이므로 대표적으로 다음 두가지만..

참조

GoW2 소스