본문 바로가기

개발/내일배움캠프

02/10 간단한 상호작용 구현하기

[Step 0] Interact 입력 Mapping 추가

 

Edit → Project Settings → Input

Action Mappings에 Interact(키: E) 추가

E 키 이벤트를 블루프린트에서 찾기 위함.

UE5부터 Enhanced Input사용

Input Action생성후 Input Mapping Context에 키 할당.

[Step 1] 문 또는 아이템 블루프린트 생성

  • 새 Actor 블루프린트 생성 (BP_InteractableDoor 또는 BP_PickupItem)
  • Static Mesh 추가 (문 / 아이템 등으로 보이게 설정)
  • 생성한 BP_InteractableDoor/BP_PickupItem 에디터에서
    • Components 탭의 Static Mesh 선택
    • Collision Presets → BlockAll 설정
    • Line Trace가 오브젝트를 정확히 감지합니다.

[Step 2] 상호작용 범위 구현 (Line Trace)

MyCharacter 블루프린트에 Line Trace by Channel 노드 추가

E 키 입력 → Line Trace → Hit된 오브젝트 태그 확인 → 이벤트 실행

blueprint

복사편집

E Pressed → LineTraceByChannel → BreakHitResult → Check Tag → Custom Event 실행

Plain Text

 

Line Trace By Channel을 이용한 화면 정중앙 라인트레이스 구현

카메라 기준 화면 정 중앙을 구하는 방법

Start지점은 카메라,

End지점은 카메라가 바라보는 방향으로 Multifly에 사용한 값만큼의 지점(카메라로부터 1000거리의 지점 = 1000거리까지 Trace)

이제 라인트레이스가 완료되었으면 이를 통해 액터를 가져오고, 

가져온 액터가 Interactable 태그를 가지고있다면 내가만든 BP_InteractableDoor로 캐스팅 후 OpenDoor함수 호출.

 

 

[Step 3] 문 열기 or 아이템 줍기 로직 추가

문이면: SetRelativeRotation으로 회전값 변경

아이템이면: Destroy Actor로 사라지게 처리

InteractableDoor의 OpenDoor함수를 추가, 변수 Opened값에 따라 문을 90도 돌려 열고 닫기를 구현하였다.

 

이때 겪은 시행착오가 변수 Opened를 localVariable로 만들었다가, 매번 호출시 값 변경되지 않아서 닫기가 안되는 문제가 있었다.

 

이유는 로컬변수는 해당 함수 내에서만 생성되고 사용되기 때문에 휘발성이었기 때문.(매번 호출될때 초기값으로 초기화

일반 변수로 다시 변수를 설정하고 나서야 열기-닫기가 순환되면서 제대로 구현되었다.

[Step 4] 태그 설정 & 테스트

상호작용 대상 블루프린트에 Tag: Interactable 설정

게임에서 캐릭터가 E 키를 눌러 상호작용 되는지 테스트

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

붉은/녹색선은 LineTrace시 출력되는 디버그 선임.

 

로컬변수 잘못써서 삽질을 좀 했지만 제대로 구현하는데 성공했다.

 

 

정리

인풋시스템 복습, 액터 캐스팅(형변환)과 다른 블루프린트의 함수 호출

lineTrace기능 써보기

특히 라인트레이스는 여러 게임에서 굉장히 반복적으로 쓸것이기 때문에 확실히 사용방법을 기억해놓는것이 좋을듯

 

아쉬운점은 문에 강의에서 넣은 회전애니매이션을 넣으면 더 볼만할듯?
Timeline등을 이용해서 나중에 해보는걸로