🎮Unreal4/Blueprint

[UE4] 가비지 컬렉션, Pending Kill, 활 쏘기, Get Attach Parent Actor, DetachFromActor

공대 컴린이 2023. 2. 8. 18:41
728x90

🪣 가비지 컬렉션 (GC, Garbage Collection), Pending Kill

블루프린트에서 Destroy Actor 함수를 호출하여 어느 객체를 지우면 해당 객체가 바로 사라지는 것 같지만, 사실은 바로 지워지지 않는다.

언리얼에는 메모리 관리기법으로 "가비지 컬렉션"을 사용한다. 

가비지 컬렉터라는 쓰레기 수집기가 링크가 끊어진 부분을 찾아서 링크가 끊어진 상태(=Pending Kill, 킬 대기)라면 해당 객체를 지우는 과정이 내포되어 있다.

즉, 오브젝트나 컴포넌트가 Destory되면 씬 상에서 제거된 것으로 보이지만, 메모리 상에서는 Pending Kill 상태가 되어 다음 GC(Garbage Collection) 실행 시 메모리에서 해제되는 것이다.

C++ 코드 상에서 유효성을 검사할 때 Pending Kill 상태까지 검사하기 위해서는 Is Valid() 함수를 사용해야 한다.

🎯 활 쏘기

Weapon_Bow BP : Begin Do Action

게임이 시작되고 플레이어가 활을 들면, 먼저 자동으로 화살 하나를 플레이어의 손에 위치시킨 뒤, 들고 있는 화살을 화살 배열(Arrows)에 추가시킨다.

 

이후 활 쏘기 액션을 입력하면 Begin Do Action 함수가 실행되는데, 화살 배열(Arrows)를 검사하면서 플레이어 손에 붙어있는 화살이 존재하는지를 검사한 뒤, 손에 화살이 존재한다면, 해당 화살을 Detach 시켜주어 손에서 화살이 떼지고 앞으로 날아갈 수 있도록 하였다.

💡 Get Attach Parent Actor

화살이 손에 붙었는지를 파악하기 위해 Get Attach Parent Actor 함수를 사용했는데, 해당 함수는 다른 액터의 컴포넌트에 부착되어 있다면 해당 액터를 반환해준다.

 

따라서 손에 붙은 화살을 Temp변수에 저장한 뒤, DetachFromActor 함수를 호출해 연결을 끊어주었다.

💡 DetachFromActor

DetachFromActor 함수는 현재 액터의 루트 컴포넌트를 어태치되어있는 씬 컴포넌트에서 떼어내는 기능을 구현한다.

DetachFromActor 함수에서 가장 중요한 것은 Rule을 설정하는 것이다. Rule은 Keep RelativeKeep World 두가지 중 하나를 선택할 수 있다.

 

시작 지점(0) ------------- 플레이어 위치 (10) ------------- 화살 위치(5)

 

플레이어의 위치가 0으로부터 10만큼 떨어진 지점에 위치할 때, 화살이 10 으로부터 5만큼 떨어진 15에 위치한다고 할 때, Keep Relative로 해제하면 화살이 부모로부터 떨어진 5 간격만 출력되어 0으로부터 5만큼 떨어진 5지점에 위치하게 된다.

반대로 Keep World로 해제하면 월드상에 현재 위치로 떨어져서, 부모의 간격을 모두 포함하여 0으로부터 15만큼 떨어진 15지점에 위치하게 된다.

 

따라서 플레이어가 손에 화살을 잡고있다가 놓으면서 발사해야 할 때 Keep World로 트랜스폼을 모두 설정하여 손에서부터 앞으로 발사될 수 있도록 구현해야 한다.


참조

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/

 

언리얼 오브젝트 처리

UObject 시스템의 기능에 대한 개요입니다.

docs.unrealengine.com

https://docs.unrealengine.com/5.1/ko/actors-in-unreal-engine/

 

액터

기본적인 게임플레이 요소인 액터와 오브젝트에 대한 설명입니다.

docs.unrealengine.com

 

728x90