[UE5] 언리얼5 Blueprint - 발사체 시스템 구현

AnJH·2024년 7월 18일
0

발사체 시스템 구현

발사체 시스템은 사실 간단한 문제다.
블루프린트에 좋은 노드들이 있고, 이를 잘 사용하기만 하면 어렵지 않게 구현이 가능하다.
하지만 이 글에서는 이전에 포스팅했던 Object Pooling과 연계되어 사용하는 발사체 시스템을 설명하고자 하고, 이때 발생했던 문제를 해결한 부분도 같이 풀어 나가보고자 한다.

먼저 발사체를 날리는 Actor의 공격 애니메이션에 삽입할 Anim Notify를 만들어야 한다.

  • Shoot_AnimNotify

    해당 Notify를 하나의 Actor에만 적용할 것이 아니기에 FindEnemy와 Shooting함수를 만들었다.
    Notify를 호출한 MeshComp의 Owner 즉, Actor 자체를 가져와서 해당 Actor가 어떤 Class를 나타내는지 알아낸다.
    이후, 해당 Class에 맞는 Shooting함수를 호출하는 것이다.

  • FindEnemy

    Actor의 값을 Input값으로 받아왔기에 어떤 Class인지 찾는 것은 간단하게 Tag로 진행했다.
    이때 반환값을 Tag와 동일하게 주어서 이후 함수에 사용하도록 했다.

  • Shooting

    마지막으로 Shooting함수의 흐름은 위와 같다.
    노드가 많아보일 수 있으나 두가지 Class가 사용하고 있기에 그런것이고 실질적인 노드는 매우 간단하다.
    Input값으로 받아온 Class의 Tag로 Switch문을 이용해 어떤 Class인지 가려낸다.
    이후 해당 Class를 Casting하고, Mesh의 Socket Location을 알아낸다. 이때 Socket은 Skeletal에서 총알이 발사되는 위치의 Bone에 Socket을 지정해두었다.
    이후 총알 형태를 지닌 Blueprint Actor를 Pooling방식을 통해 Spawn하고, Add Impulse를 통해 원하는 방향으로 힘을 가하면 발사체가 구현된다.

  • BP_Bullet

    이때 Bullet Actor는 Add Impulse Node를 사용하기 위해서는 Simulate Physics를 켜주어야 한다. 그래서 Spawn될 때와 Return될 때 각각 Set Simulate Phsics를 통해 키고 꺼주었다.
    이러고 실행을 해보니 발사체가 눈에 보이지도 않고, Spawn이 되는 것은 맞는데 정상적인 Location값을 받아오지 못하고 있었다.
    이유를 찾다보니 Simulate Physics를 사용하는 Actor를 정상적으로 사용하기 위해서는 초기속도를 지정해줘야 한다는 것이었다.
    이에 Linear Velocity와 Angular Velocity를 통해 초기속도와 회전값을 모두 초기화 시켜주고, Add Impulse만을 통해서만 Actor에 힘을 가하도록 수정하여 문제를 해결했다.

  • Animation Montage

    이렇게 개발한 AnimNotify를 위와 같이 Montage에 삽입하는 방식으로 원하는 타이밍에 발사체 공격 시스템을 구현할 수 있다.

Spawn Actor와 Destroy Actor만을 사용해서 코드를 구현할 수도 있겠으나 게임 내에서 메모리 최적화를 신경쓰고 있다면 이전 글에서 사용된 Object Pooling 방식과 더불어 해당 시스템을 사용해보는 것도 추천한다.

0개의 댓글