블록 게임 만들기 2

정선호·2023년 6월 5일
0

Unreal Study

목록 보기
11/13

4. Placing Block

강의 영상

블록을 놓는 커스텀 이벤트를 생성한다

  • UI HUD에 대한 월드 로케이션과 전방 벡터를 구하고 이를 이용해 라인 트레이스를 구현한다
  • 새 블록 인스턴스를 올바른 위치에 생성한다

벡터와 노말

십자UI의 월드 위치에 라인 쏘기

플레이어인 BP_BlockPlayerGetCrosshairLocation함수를 추가한다.

  1. Hud의 크로스헤어가 화면 상의 x, y축을 Deproject Screen to World를 이용해 3D좌표계의 위치와 정면 벡터를 구한다
  2. 정규화된 정면 벡터에 최대로 블록을 놓을 거리를 곱해 원하는 길이를 가진 정면 벡터로 변환한다
  3. 정면벡터에 월드 위치를 더해 최종적인 라인의 벡터를 내놓는다

블록 놓을 때 해당 방향으로 플레이어 회전

BP_BlockPlayer의 이벤트그래프에 타임라인으로 구현한다

  1. 타임라인을 추가한다.
  2. 현재 방향과 타깃 방향을 Lerp한다
  3. 러프한 값을 Set Actor Rotation을 이용해 적용한다.

클릭 시 라인 트레이스로 블록 정보 가져오기

BP_BlockPlayerGetClickedOnBlock 함수를 추가한다.

  1. 카메라의 월드 위치를 가져온다.
  2. Line Trace By Channel로 레이 트레이 콜리전을 발사한다.
  3. Hit여부와 Hit한 오브젝트의 위치, 노멀, 액터를 가져온다.
  4. 가져온 Hit 오브젝트 액터를 형변환해 블록인지 확인해보고, 블록이 맞으면 해당 블록에 대한 위치, 노말, 벡터값을 반환한다.
  5. 만약 Hit를 실패하거나 가져온 Hit오브젝트가 블록이 아니면 성공 여부를 false로 반환한다.

블록 배치

위에서 구현한 라인 트레이스, 플레이어 회전, 블록 정보들을 종합해 블록을 배치한다.

  1. 블록 입력 액션 버튼을 누르면 타이머를 시작하며 커스텀 이벤트인 PlaceBlockDown을 실행한다.
    액션 버튼을 떼면 타이머를 종료하고 초기화한다
  2. PlaceBlockDown이벤트를 구현한다. 우선 현재 액터의 회전값을 설정하고 Get Crosshair Location함수로 현재 십자UI의 월드위치에 라인을 쏴 나온 결과 위치를 가져온다.
  3. 십자가 가리킨 위치와 현재 플레이어의 위치를 바탕으로 플레이어가 보아야 할 곳의 회전값을 구한다.

  1. 구한 회전값을 저장한 후 플레이어를 회전시키는 타임라인을 발동시킨다.
  2. 십자 라인이 가져온 위치로 Get Clicked on Block함수를 이용해 라인이 가리킨 곳의 블록 여부와 위치좌표 등을 가져온다.

  1. 십자 라인이 가리킨 곳이 맞으면 블록을 붙일 곳의 위치를 반환한다.
  2. 몽타주를 재생해 BP_BlockPlayer의 스켈레탈 메시에 존재하는 블록 설치 몽타주를 실행시킨다.
  3. 받아온 블록을 붙일 곳의 위치에 SpawnActor BP Base Block으로 블록을 설치한다.

5. Adding Additional Blocks

강의 영상

BP_BaseBlock의 자식 클래스를 구현한다
추가할 블록의 종류를 바꾸는 기능을 구현한다
블록을 삭제하는 기능을 구현한다

새 블록 구현

새 블록은 BP_Base Block을 우클릭해 자손 블루프린트 클래스 생성을 이용해 추가한다

블록 변경

  1. BP Base Block class형식의 변수를 새로 추가한다.
    해당 변수는 모든 블록의 부모 클래스로써 어떠한 블록이든 할당 가능하다
  2. 각각의 키 입력에 맞춰 현 블록 클래스를 변경해준다

블록 삭제

  1. 블록 생성때와 같이 블록 삭제 이벤트를 타이머에 연결해준 후 이벤트를 실행한다
  2. 십자 라인이 가리킨 광선에 위치한 블록이 부서지는 블록인지 확인하고 만약 맞으면 해당 액터를 삭제한다.
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글