https://gamdekong.tistory.com/category/%EC%96%B8%EB%A6%AC%EC%96%BC%20%EC%97%94%EC%A7%84

 

'언리얼 엔진' 카테고리의 글 목록

배움.

gamdekong.tistory.com

작업은 위 게시물을 이어서 한다.

 

우선 Behavior Tree를 생성해 준다.

다음, EnemyCharacter를 다음과 같이 추가한다.

 

빌드후, Enemy 블루프린트를 열어보면 다음과 같이 BehaviorTree가 추가된것을 볼 수 있다.

미리 생성한 Behavior Tree를 적용시킨다.

 

 

다음은, EnemyController에서 BehaviorTree를 사용하기 위해 다음과 같이 코드를 수정한다.

 

이젠 BehaviorTree를 사용할 준비가 되었다.

 

하지만 BehaviorTree에서 캐릭터의 데이타를 사용하기 위해서 Blackboard가 필요하다.

 

다음과 같이 Blackboard를 생성한다.

다음, BehaviorTree에 해당 Blackboard를 적용시킨다.

 

그후, 마찬가지로, Controller에서 Blackboard를 사용할수 있도록 다음과 같이 수정한다.

빌드를 해준다.

 

 

 

이젠 Enemy가 근처에 Player가 있는지 없는지 확인하는 서비스를 만들어 보자.

기본적으로 서비스는 정해진 빈도에 맞춰 실행되어 데이타를 갱신 할 수있다.

여기서는 Enemy와 Player간의 거리를 갱신하는 용도로 사용한다.

 

BehaviorTree에서 NewService를 클릭하여 서비스를 생성한다.

생성된 서비스의 이름을 적절하게 변경한다.

Blackboard의 데이터를 갱신하기 위하여 다음과 같이 Blackboard에 Bool데이타를 생성한다.

이젠 생성된 서비스에서 IsPlayerWithin값을 변경하도록 다음과 같이 서비스를 작성한다.

IsPlayerWithinKey는

위와 같이 작성후 BehaviorTree를 다음과 같이 수정한다.

이젠 CheckPlayerWithin 서비스는 0.1초마다 채크하며 Blackboard의 IsPlayerWithin을 갱신한다.

 

 

이후, Player가 500 이내에 있을경우 추적하도록 작성한다.

데코레이터는 일종의 조건절과 같다. 또한 새로운 데코레이터 또한 만들수 있다.

여기서는 IsPlayerWithin이 true라면 실행하도록 설정한다.

Player를 추적하기 위해서 앞서 생성한 CheckPlayer Service를 수정하여 bool값뿐만 아니라 Player의 위치값도

저장하도록 수정해보자.

 

 

우선 블랙보드에 다음과 같이 추가한다.

그후, 서비스를 다음과 같이 수정한다.

이젠 Player와의 거리를 채크하면서 일정거리 내에 있다면 PlayerActor에 Player를 넣는다.

 

 

 

Player가 일정 거리 이내에 있다면 Player를 쫓는 테스크를 만들어 보자.

이젠, Player가 일정거리내에 있다면 Player를 쫓는다.

 

 

 

다음은 Player가 특정 거리내에 없을경우 patrol을 하도록 BehaviorTree를 작성해보자.

 

저번 게시물에서 저장한 patrol위치를 Blackboard 데이타에 입력시키도록 수정한다.

 

Blackboard에 패트롤을 위한 데이타를 추가한다.

EnemyCharacter를 다음과 같이 수정한다.

 

 

빌드후,

BehaviorTree를 다음과 같이 추가한다.

 

위와같이 설정하면, Player가 일정 거리내에 없다면 패트롤을 순서대로 실행한다.

 

첫번째로, AI를 사용하기 위해서 모듈추가를 해준다.

 

Character 클래스를 상속받아 Enemy cpp 파일을 생성한다.

이 클래스를 이용하여 Enemy 블루프린트를 생성하고 사용할 에니메이션을 넣는다.

 

다음은 AIController를 상속받아 EnemyController CPP파일을 생성한다.

이젠 EnemyController를 EnemyCharacter에 적용시킬 수 있다.

 

다음은 AI가 돌아다딜수 있는 지역을 지정하기 위한 작업이다.

Nav Mesh Bounds Volume을 드레그하여 뷰포트에 생성하여 크기 조절을 한다.

P를 클릭하면 적용되는 지역을 볼 수 있다.

 

 

다음은 캐릭터의 Patrol을 위한 소스코드를 작성한다.

 

EnemyController 클래스를 다음과 같이 추가하자.

 

EnemyCharacter 클래스에 다음과 같이 추가하자.

빌드후, Enemy 블루프린트를 뷰포트에 생성하여 Patrol 포인트를 적용시키자.

 

여기까지 적용하면 Enemy가 특정 페트롤 포인트를 랜덤으로 돌아다니게 된다.

 

다음은 Enemy가 점프를 해서 높은곳으로 올라갈 수 있도록 적용해보자.

 

뷰포트에 점프할 박스를 생성한다.

NavMeshBoundsVolume을 알맞게 조정하여 모든 박스가 적용되게하자.

 

 

다음은 점프를 띌수 있도록 다음과 같이 적용한다.

 

우선 NavLinkProxy를 부모로 블루프린트 파일을 생성한다.

그후 BP_JumpingNavLink를 드래그하여 생성한후, Link를 절절하게 연결해준다.

 

점프를 위해서는 SmartLink를 사용해야한다 다음과 같이 클릭한다.

SimpleLink를 카피 하여 기존 위치 그대로 SmartLink를 사용하고,

SmartLinkIsRelevant를 클릭하여 SmartLink를 사용하도록 하자.

 

위와같이 각 점프할곳마다 적용시킨다.

 

다음은 앞서 생성한 BP_JumpingNavLink블루프린트를 다음과 같이 수정한다.

 

 

이젠 EnemyCharacter가 점프를 뛰는것을 확인할 수 있다.

 

Actor를 상속받아 Bullet 블루프린트를 만들자.

블루프린트를 실행하여

SphereCollision, Static Mesh, Projectile Movement 컴퍼넌트를 붙여준다.

 

원하는 총알Mesh를 적용시킨다.

 

컬리전 크기를 총알에 맞게 수정한다.

 

이젠 총알을 총의 Muzzle위치에 생성하여 발사해보자.

 

보통 총들은 Muzzle Socket을 가지고 있기 때문에 이를 이용하면 된다.

총 에셋의 스켈레톤에 들어가보면 다음과 같이 확인 할 수 있다.

 

만약 Muzzle이 없다면 직접 만들면 된다.

 

총알을 발사하기 위해 마우스 왼쪽 버튼을 사용한다.

 

총알을 발사하기 위해서 캐릭터 블루프린트를 열어 다음과 같이 수정한다.

 

컴파일후 게임을 실행하여 버튼을 누르면 총알이 발사되는것을 확인 할 수 있다.

총알이 나가는 방향과 총알의 회전이 다를 수 있으므로 확인하여 로테이션 조정을 해준다.

 

 

 

+ Recent posts