무기 시스템

언리얼엔진3 에서의 무기

엔진이 제공하는 프레임웍의 기능들

Weapon (extends Inventory)

  • 발사 모드 정의. 배열로 관리된다.
    • FiringStateArray - 발사 시 사용될 state 이름
    • WeaponFireTypes - 발사 타입. Instant, Projectile, Custom
    • WeaponProjectiles - Projectile 형일 때 사용할 탄알객체
    • FireInterval - 발포 간격
    • Spread - 총알의 확산 정도. 에러율?
    • InstantHitDamage - Instant 형일 때, 뎀지
    • InstantHitMomentum - Instant 형일 때, 모멘텀
    • InstantHitDamageType - Instant 형일 때, 뎀지 타입
  • 발사/타이머/상태
    • EquipTime - 장착하는데 걸리는 시간
    • PutDownTime - 내려놓는데 걸리는 시간
    • FireOffset - Muzzle 위치 offset
    • WeaponRange - 발사거리
  • Mesh/Skins/Effect
    • Mesh - MeshComponent
  • Inventory 그루핑
    • Priority - 무기 선호도
    • bCanThrow - 토스 or 던질 수 있나?
  • AI 에 도움이 될만한 힌트
    • AIController
    • Instant Hit 여부
    • 밀리어택 여부
    • AIRating
  • 복제는 없는것 같음

상태

Weapon 의 각종 상태들

  • Inactive
  • Active
  • WeaponFiring
  • WeaponEquipping
  • WeaponPuttingDown
  • PendingClientWeaponSet

Inventory

  • 이름
  • 다음 아이템에 대한 포인터 (linked list)
  • bDropOnDeath - 죽으면 떨궈라
  • Pickup 관련 속성
    • 똑똑한 AI 느 이 무기의 리스폰을 예측할 수 있다.
    • 리스폰 시간
    • 소유욕구 및 집었을 때 메세지와 사운드
    • DroppedPickup class, mesh, factory, particle 등
  • 복제
    • 다음 아이템에 대한 포인터 (next Inventory)
    • Inventory Manager
  • Pickup 시도 시 특정 조건에 따라 이를 거부시킬 수 있다. (DenyPickupQuery)
  • 월드에 아이템을 떨굴 수 있다.

InventoryManager

  • Inventory 체인 시작 포인터
  • 교체 할 무기를 지정할 수 있다. (PendingWeapon)
  • 현재 무기를 가지고 교체를 하지 않는 한 일부러 무기를 내려놓을 수 없게할 수 있다. (bMustHoldWeapon)
  • PendingFire 배열 ( 0 or 1 )
  • 복제
    • Inventory 체인 시작 포인터
  • BaseClass 분류인 모든 Inventory 를 순회할 수 있다.
  • Pickup 처리를 할 수 있다. 이때 내가 가지고 있는 모든 Inventory 를 순회하며 Pickup 처리를 무효화할 수 있다. (Inventory::DenyPickupQuery 사용)
  • DesiredClass 분류인 아이템을 찾을 수 있다.
  • 새롭게 Inventory 를 생성할 수 있다.
  • Inventory 를 추가하거나 없앨 수 있다.
  • 모든 Inventory 를 폐기할 수 있다. (보통 소유자가 죽어서)
  • HUD 를 그릴 기회가 있다.
  • AI 가 Inventory 목록 중 가장 선호하는 무기를 선택할 수 있다.
  • (현재 무기가 없을 경우.. 즉, Pawn.Weapon == None 일때, 이거나 명시적으로 원할 경우) 가장 최적의 무기를 선택하여 교체할 수 있다.
  • linked list 상에서 현재 무기의 이전이나 이후에 위치한 무기로 교체할 수 있다. (UTGame 에서 휠을 돌릴때를 생각)
  • 사용할 무기를 선택할 수 있다. (SetCurrentWeapon)
    • SetPendingWeaopn
    • ChangeWeapon
      • Pawn 에게 무기 교체 에니메이션을 재생하도록 한다. (Pawn.PlayWeaponSwitch)
    • PC 에게 교체되었음을 알린다. (Controller.NotifyChagnedWeapon)

무기 생성 및 착용

무기생성에 따른 복제

Server 에서 Pawn.CreateInventory 가 호출된 후의 복제 과정
5851668997_b69d0b31f7_b.jpg

발사

발사의 종류

언리얼엔진3 에서 제공하는 무기시스템에는 기본적으로 2가지 방식의 공격이 존재한다.

  • InstantFire - 발사 즉시 direction 과 distance 를 기반하여 충돌처리를 수행하고 데미지 딜링을한다. 쏘는 즉시 맞는 방식
  • ProjectileFire - 발사체를 소환하고 그에게 충돌처리 및 데미지 딜링을 위임한다. 발사체는 물리운동으로 인해 궤적을 그리며 날아갈 수 있다.

발사에 따른 처리

  • 발사 및 그에 따른 복제,데미지딜링,효과 를 모두 Pawn 에서 수행하고 있음
  • Pawn 에 FlashLocation, FlashCount, FiringMode 가 있는데 이것이 클라로 복제되고 있음
  • InstantHit 의 경우 같은 HitLocation 을 다시 맞췄을 경우 복제가 안되는 상황에 대비하여 HitLocation 에 + vect(0,0,1) 해주는 로직이 존재함
  • 또한 원점 (0,0,0) 을 쏘았을 경우 발사를 멈추게되는 것을 방지하기 위해서도 + vect(0,0,1) 해주고 있음. (0,0,0) 을 쏘았을 경우 발사를 중단시키기 때문

발사에 따른 복제

스스로 그려보고 정리해 둔 것. 다른 사람들에게 의미가 있을지는 모르겠음

PlayerController 에서 StartFire 를 한 후의 복제 과정
5792050257_b06186e153_b.jpg

WeaponFiring 상태에 들어가면 FireAmmunition 이 호출되고 공격 타입에 따라 InstantHit 과 ProjectileFire 로 나뉜다. 이하 계속…

InstantHit 의 경우 복제 과정
5810852931_b46023c25c_b.jpg

InstantHit 은 쏘면 바로 맞는 형식의 공격타입이다. 때문에 Pawn.FlashLocation 으로 다른 client 들에게 복제를 수행한다.

ProjectileFire 의 경우 복제 과정
5810853325_d331b602b9_b.jpg

ProjectileFile 는 물리역학에 따라 궤적을 그리며 날아가는 탄알을 소환하는 형식의 공격타입이다. 그리고 이후 충돌처리 및 데미지딜링은 탄알에게 위임한다. 이 타입은 Pawn.FlashCount 로 다른 client 들에게 복제를 수행한다.