언리얼엔진5/블루프린트 Paper2D 로 게임 만들기

[Paper2D로 게임 만들기 필기] 4-5. DataTable, 피격 판정, Widget Blueprint, FSM, Controller

Rocketbabydolls 2023. 7. 25. 16:27

   지금까지 클래스에 들어있는 변수들을 변수 내에 멤버 변수로 선언해서 사용을 했었는데, 데이터 테이블을 사용하면 더 효율적으로 관리할 수 있다. 

   먼저 구조체를 만들어서 테이블에 원소를 넣기 쉽게 만든다.

Structure

구조체를 만들어 관리하기 더 편하다.

이렇게 만들어준 구조체를 데이터 테이블에서 사용할 예정이다.

 

DataTable

이미지 파일, 객체에 대한 정보, 서버에서 받아오는 정보들 등 담아둘 정보가 많은 경우에는 멤버 변수로 모두 관리하기가 매우 힘들다. 따라서 이렇게 구조체를 만들고 데이터 테이블에 넣어 두면 정보를 조회하기도 편하고, 관리하기도 편하다.

 

 

데이터 테이블 정보 가져오기

getDataTableRow를 통해 정보를 가져온다.

 

내가 만든 CreatureDataTable에서 정보를 가져와서 확인하고 있다.

 

한층 더 깔끔해진 모습

마찬가지로 이전의 애니메이션에서 하나하나 가져왔던 데이터들을 데이터 테이블의 Row를 불러와서 Select문에 집어넣을 수 있다.

 

 

피격 판정

box collision

Box Collision을 통해 피격 범위를 설정해 줄 수 있다.  플레이어가 바라보는 방향(칼을 들고 있는 방향), 신체 이렇게 두 개를 합쳐 ㅏ 같은 모양으로 만들었다.  hidden in game 설정으로 실행 시 피격 박스가 보이게 할지 말지를 정할 수 있다.

box collision을 추가한 모습.

 

우리가 사용할 Get OverlappingActors 함수.

   Get OverlappingActors 함수는 액터끼리의 충돌을 검사해 주는 함수이다. 언리얼 엔진은 자주 쓰이거나 보편적인 함수들은 웬만하면 거의 다 있다고 생각하면 된다. 필요한 함수를 연상해서 키워들 입력하면 나오는 것 같다. 

   Apply Damage  함수를 이용해서 데미지 계산을 해도 되지만(편리하게 구성되어 있다), 구현의 기본기를 위해 직접 데미지를 깎는 과정을 구현했다.

완성된 피격판정 & 데미지 갱신

 

Widget BluePrint

 

   위젯 블루프린트는 UI/UX 에 사용되는 위젯들을 모아놓은 클래스들이다. 정말이지 편리하게 '게임을 위한 UI' 는 거의 다 들어있다고 보면 된다. 공부를 하다보니 문득 이런 생각도 든다. 사업으로 12억 미만까지는 라이센스 비용을 내지 않는데, 진정한 오픈소스 정신이라고 보인다. 이런 걸 사실상 무료로 공개하다니... 

 

노량진 수산시장의 리누스 토르발즈

 

각설하고 ProgressBar를 사용하여 체력 바를 만들고 내 BP_Creature 와 연결했다. 당연히 생물이면 체력이 있을 것이므로 BP_Creatures 에서 체력바 참조를 가져와 체력을 깎는 데 사용했다. 

 

사용 예시. 퍼센트로 값을 전달하기 위해 최대 체력으로 나눴다.

FSM(Finite State Machine)

유한 상태 기계

 

   강의에서 깊게 다루지 않는 부분이라 따로 공부하였다.

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=syen124&logNo=220692229412 

 

유한 상태 기계(FSM)

게임프로그래머로서의 기초적 지식을 좀 간단하게 써두려고 글쓰기 버튼을 누르긴 했지만.. 이 글을 팁에 ...

blog.naver.com

 

   이해하기 쉽게 설명해놓은 블로그의 글이 있어서 스크랩 해왔다. 간단히 요약하자면 '유한개의 상태를 가진 흐름을 따라가는 기계' 라고 보면 된다.

   우리가 게임을 만들 때는 AI이긴 하지만 딥러닝AI, 강화학습AI 가 아닌 경우에는 정해진 패턴을 따라가게 된다. 예를 들어 피파 온라인 4(축구 게임) 이 있다고 하면, 내가 공을 몰고 있을 때는 상대 수비 AI가 판단할 것이다. 어느 지역에 도달했는지(본인 팀의 골대와 가까운지), 어떤 속도로 공을 몰고 가고 있는지 등을 판단하여 수비수가 적절한 행동을 취하는 것이라고 보면 된다. 

 

ex)

축구장.

if (패널티 박스 안인가?)
{
	태클을 입력받기 전에태클을 걸지 않는다.  # Focus 상태
	if(슈팅을 하기 직전인가?)
    {
    	몸으로 블로킹을 시도한다.
    }
    else
    {
    	#Focus 상태로 돌아간다.
    }
    

}
else
{
	모험적으로 태클한다.
}

    이런 식으로 유한한 상태에서 기계가 작동한다고 생각하면 된다. 

 

Controller

컨트롤러

 

   이름에서 알 수 있듯 컨트롤러이다.  객체마다 Input을 받아주어 애니메이션을 재생하고 하는 함수를 넣어놓지 말고, 컨트롤러 사용하면 간편하게 관리가 가능하다.

 

우선 GameMode 를 임의로 설정한다. 지금까지는 Player 0 을 빙의(선택)해서 BP_Kinght 객체를 이동시켰는데, 사실 게임 모드를 사용하면 더 직관적이고 쉽게 설정이 가능하다.

classes 주목

   Player Controller Class 를 내가 만든 BP_PlayerController 로 놓고, Default Pawn Class 를 BP_Knight 로 설정했다. 이렇게 된다면 만약 BP_Knight 객체 여러개를 만들고 전부 키 입력을 통해 움직여야 한다면 참조를 가져와 1번을 누르면 1번 기사 조종, 2번을 누르면 2번 기사 조종 을 할 수 있다. possess 설정을 해주는 것으로도 바꿀 수는 있지만 게임 모드를 설정해서 협업 개발자가 다른 폰으로 빙의하는것을 막고, 갑자기 다른 캐릭터를 조종하게 되는 버그도 막고 등에 의의가 있지 않나 싶다.

 

  World Settings 에서 게임 모드와 컨트롤러를 설정해 주면 끝난다.