언리얼 블루프린트/컴포넌트

[언리얼5 블루프린트] 적 캐릭터의 인식 컴포넌트 만들기

디버그러 2024. 7. 7. 21:41

적 캐릭터가 쫓아오도록 만들려면 플레이어를 인식하고 추적하는 과정이 필요합니다.

인식 컴포넌트 만드는 과정입니다.

 

 

새 컴포넌트를 만드려고 합니다.

마우스 우클릭 → 블루프린트 클래스 → 액터 컴포넌트

인식으로 이름 변경했습니다.

 

 

Multi Sphere Trace By Profile 노드를 이용하였습니다.

 

Get Owner, Get Actor Location으로 위치 정보를 가져와 연결해 주고

Radius는 변수로 승격하여 인스턴스 편집이 가능하게 하였고 인식범위로 이름 변경 후 기본값을 500으로 설정했습니다.

 

 

편집 → 프로젝트 세팅 → 콜리전에서 새 프로파일을 만들었습니다.

이름은 온리폰으로 하고, Pawn만 블록으로 체크했습니다.

적이 플레이어만 인식해야 하는데 땅이나 사물을 인식하면 안 되기 때문입니다.

 

콜리전은 Physics Only로 선택했습니다.

 

 

Profile Name을 방금 프로젝트 세팅 콜리전에서 만든 온리폰으로 설정했습니다.

For Each Loop with Break 노드를 연결하여 플레이어를 찾으면 트레이스가 정지되도록 만들 예정입니다.

 

 

Break Hit Result 노드를 통해 결과를 가져와서 컨트롤러를 가지고 있는 캐릭터인지 확인합니다.

Cast to Character 노드Is Player Controlled 노드를 사용했습니다.

 

 

Branch 노드를 통해 플레이어에 의해 제어되고 있는 캐릭터가 맞는지 확인하는 절차를 거칩니다.

 

 

마지막으로 변수로 승격한 플레이어를 For Each Loop with Break 노드의 Break와 연결하였습니다.

Branch의 True를 바로 Break로 연결해도 되지만, 코드의 가독성와 실수 방지를 위해 플레이어 변수를 사용했습니다.

 

이제 인식 범위를 만들었으니 인식 시간도 만들어보겠습니다.

 

 

Event Tick 노드와 Multi Sphere Trace By Profile 노드에 Is Valid 노드를 추가했습니다.

플레이어 변수를 사용하여 플레이어가 아닐 경우, 플레이어를 찾을 때까지 트레이스가 계속 작동하도록 하였습니다.

 

 

인식시간이라는 변수를 추가하여 플로트로 변경했습니다.

 

 

Branch 노드와 플레이어 변수 사이에 인식시간 변수를 추가했습니다.

Get Game Time in Seconds 노드를 이용해 현재 시간을 인식 시간으로 저장했습니다.

 

 

인식 범위를 넘어갈 경우 바로 인식이 풀리는 게 아니라 일정 시간 후에 풀리게 만들려고 합니다.

현재 시간 > 인식시간 + 풀리는 시간(5초) 일 경우 인식이 풀리게 만들 예정입니다.

 

 

여기서 풀리는 시간을 변수로 승격하여 인식유지시간으로 이름 변경했습니다.

전체 노드와 연결하지 않은 상태입니다.

 

 

인식범위를 감지하고 적이 쫓아온다면 금방 인식범위 밖으로 나갈 수 있을 것입니다.

인식범위보다 경계범위를 넓게 만들어주면 쫓아올 때 인식범위보다 멀리 떨어져야 도망갈 수 있을 것입니다.

 

변수를 추가하여 경계범위로 이름 변경했습니다.

 

 

인식범위는 500, 경계범위는 100으로 설정했습니다.

500에 100을 더한 범위보다 멀리 나간다면 인식이 풀리도록 만들 예정입니다.

 

 

변수로 지정한 플레이어를 Get Actor Location 노드를 통해 위치를 가져옵니다.

이 컴포넌트를 가지고 있는 액터도 같은 노드를 통해 위치를 가져옵니다.

이를 Distance(Vector) 노드로 연결하면 둘 사이의 거리가 나옵니다.

 

 

플레이어와 적의 거리가 인식범위(500)와 경계범위(100)를 합한 것보다 멀다면 인식이 끝나도록 만들 예정입니다.

 

 

여기에 Branch 노드를 연결하였습니다.

플레이어가 없다면 트레이스가 계속 작동되고 플레이어가 있으면 계속 인식을 하는데,

거리가 멀면 풀리도록 만들 예정입니다.

 

 

Branch 노드에 또 Branch 노드를 연결했습니다.

거리가 멀고 인식이 풀릴 시간이 되었다면 인식이 풀리도록 만들 예정입니다.

 

 

거리가 멀고 인식이 풀릴 시간이 되었다면 플레이어 변수를 가져옵니다.

하지만 플레이어 핀에 아무것도 넣지 않았기에 플레이어를 찾지 못하고 다시 돌아가 트레이스를 생성하게 됩니다.

 

 

전체적인 모습입니다.

 

 

폰에 넣는다면 인식범위, 인식유지시간, 경계범위를 인스턴스로 편집할 수 있습니다.

 

 

추가적으로 Multi Sphere Trace By Profile 노드의 Draw Debug Type을 For One Frame으로 바꿔준 후

플레이할 경우 트레이스(인식범위)를 볼 수 있습니다.