4. Placing Block
강의 영상
블록을 놓는 커스텀 이벤트를 생성한다
- UI HUD에 대한 월드 로케이션과 전방 벡터를 구하고 이를 이용해 라인 트레이스를 구현한다
- 새 블록 인스턴스를 올바른 위치에 생성한다
벡터와 노말
십자UI의 월드 위치에 라인 쏘기
플레이어인 BP_BlockPlayer
에 GetCrosshairLocation
함수를 추가한다.
- Hud의 크로스헤어가 화면 상의 x, y축을
Deproject Screen to World
를 이용해 3D좌표계의 위치와 정면 벡터를 구한다
- 정규화된 정면 벡터에 최대로 블록을 놓을 거리를 곱해 원하는 길이를 가진 정면 벡터로 변환한다
- 정면벡터에 월드 위치를 더해 최종적인 라인의 벡터를 내놓는다
블록 놓을 때 해당 방향으로 플레이어 회전
BP_BlockPlayer
의 이벤트그래프에 타임라인으로 구현한다
- 새 타임라인을 추가한다.
- 현재 방향과 타깃 방향을
Lerp
한다
- 러프한 값을
Set Actor Rotation
을 이용해 적용한다.
클릭 시 라인 트레이스로 블록 정보 가져오기
BP_BlockPlayer
에 GetClickedOnBlock
함수를 추가한다.
- 카메라의 월드 위치를 가져온다.
Line Trace By Channel
로 레이 트레이 콜리전을 발사한다.
- Hit여부와 Hit한 오브젝트의 위치, 노멀, 액터를 가져온다.
- 가져온 Hit 오브젝트 액터를 형변환해 블록인지 확인해보고, 블록이 맞으면 해당 블록에 대한 위치, 노말, 벡터값을 반환한다.
- 만약 Hit를 실패하거나 가져온 Hit오브젝트가 블록이 아니면 성공 여부를
false
로 반환한다.
블록 배치
위에서 구현한 라인 트레이스, 플레이어 회전, 블록 정보들을 종합해 블록을 배치한다.
- 블록 입력 액션 버튼을 누르면 타이머를 시작하며 커스텀 이벤트인
PlaceBlockDown
을 실행한다.
액션 버튼을 떼면 타이머를 종료하고 초기화한다
PlaceBlockDown
이벤트를 구현한다. 우선 현재 액터의 회전값을 설정하고 Get Crosshair Location
함수로 현재 십자UI의 월드위치에 라인을 쏴 나온 결과 위치를 가져온다.
- 십자가 가리킨 위치와 현재 플레이어의 위치를 바탕으로 플레이어가 보아야 할 곳의 회전값을 구한다.
- 구한 회전값을 저장한 후 플레이어를 회전시키는 타임라인을 발동시킨다.
- 십자 라인이 가져온 위치로
Get Clicked on Block
함수를 이용해 라인이 가리킨 곳의 블록 여부와 위치좌표 등을 가져온다.
- 십자 라인이 가리킨 곳이 맞으면 블록을 붙일 곳의 위치를 반환한다.
- 몽타주를 재생해
BP_BlockPlayer
의 스켈레탈 메시에 존재하는 블록 설치 몽타주를 실행시킨다.
- 받아온 블록을 붙일 곳의 위치에
SpawnActor BP Base Block
으로 블록을 설치한다.
5. Adding Additional Blocks
강의 영상
BP_BaseBlock
의 자식 클래스를 구현한다
추가할 블록의 종류를 바꾸는 기능을 구현한다
블록을 삭제하는 기능을 구현한다
새 블록 구현
새 블록은 BP_Base Block
을 우클릭해 자손 블루프린트 클래스 생성
을 이용해 추가한다
블록 변경
BP Base Block class
형식의 변수를 새로 추가한다.
해당 변수는 모든 블록의 부모 클래스로써 어떠한 블록이든 할당 가능하다
- 각각의 키 입력에 맞춰 현 블록 클래스를 변경해준다
블록 삭제
- 블록 생성때와 같이 블록 삭제 이벤트를 타이머에 연결해준 후 이벤트를 실행한다
- 십자 라인이 가리킨 광선에 위치한 블록이 부서지는 블록인지 확인하고 만약 맞으면 해당 액터를 삭제한다.