프로그래밍 공부
작성일
2024. 4. 8. 21:20
작성자
WDmil
728x90

블루프린트로 AI의 기초를 생성해본다.

 


AI Character

 

기본 3인칭 캐릭터를 상속받아. AI케릭터를 생성한다.

 

 

AI는 비헤이비어 트리, 패트롤 컨트롤을 위한 엑터 컴포넌트 한개를 가지고 생성된다.

 

AI컨트롤러를 사전에 생성한. AiController로 지정해준다.

생성은 위와같이. AI컨트롤러를 상속받아 생성해준다.

지정은 위와같이. 디테일 창에서 AI컨트롤러클래스로 새 컨트롤러를 지정해준다.


엑터 컴포넌트( 패트롤 메니저 )

위와같은 구성을 가진다.

 

패트롤 할 때, 일정 구간을 순회하여야 함으로, 구간순회용 Line값과 해당 컴포넌트를 가지는 Owner,

 

현재 순환구역의 끝 까지 도달했을 때, 반대쪽으로 돌아가야 함으로, 돌아가는 상태인지 확인하는 Bool변수,

 

현재 이동한 거리를 측정하는 DIstance

 

다음 이동의 위치값을 지정하는 PatrolLocation

 

다음 이동의 위치값에 대한 보정값.( 이동속도에 따라서 완벽하게 해당 위치에 도달할 수 없을 수 있기 때문. 오차가 보통 소숫점 몃자리까지는 생긴다. ) 

 

를 가진다.

 

Update Location

 

 

다음으로 지정될 이동위치를 측정하기 위해 사용한다.

 

현재 Owner-> Characer Movement -> Max Walk Speed 를 통해. 현재 이동속도를 구하고, 그곳에 Delta를 곱해서 현재 프래임당 이동속도를 구한다.

 

그리고, 프레임당 이동속도를 틱마다. DIstance에 적립해준다.

지정된 Spine에 대한.( 이동경로 에 대한 ) 가장 가까운 지점을 찾는다.

 

현재 Distance를 사용해서. 이동거리에 따른 선분의 위치중 가장 가까운 점을 찾는것이다.

 

찾았다면, 해당 값을 PatrolLocation에 지정해준다.

 

 

이동거리에 따라. 현재 이동 거리가. 지정된 패트롤의 전채 길이보다 클 경우( 내가 패트롤 이동거리를 전부 이동했을 경우. )

 

현재 지정된 패트롤 위치가. Loop상태인지?( 끝과 처음시작점 이 연결되어있는지. ) 확인하고. 연결되어있다면 시작점이 종료점과 같음으로, DIstance를 0으로 초기화한다.

 

연결되어 있지 않다면, Reverse를 True해주어. 이제부터 역순으로 이동한다고 지정해준다.

 

Reverse가 True일 경우, 역순으로 진행한다는 의미이다. 현재 Distance가 Spine의 최대길이와 같거나 크다는 의미음으로,

 

반대로 DIstance에 틱당 속도를 계속해서 빼준다. 그리고 가장 가까운 Spine의 점을 찾아서 반환한다.

 

만약, DIstnace가 0보다 작다면, 역순이동이 종료되었기 때문에, Rverse를 0으로 돌려준다.


Get Data

 

현재 틱마다 업데이트 되는 데이터를 가져오기 위한 함수이다.

 

각 값은, 보정값과 다음 이동위치값이다.

 

만약, Line이 지정되지 않았다면, 0으로 리턴한다.


비헤이비어 트리

 

비헤이비어 트리는, 다음과 같이 컴포넌트를 생성하고, 기본값으로 지정해줄 수 있다.

 

만약, 내가 다양한 인공지능을 상태값에 따라 다르게 쓰고싶다면, 여러개의 비헤비이어트리를 쓸 수도 있을것이다.

 

비헤이비어 트리는 다음과 같이 생성하면 된다.


비헤이비어 트리

비헤이비어 트리는 위와같은 구조를 가진다.

 

모든 객체가 if문처럼 돌아간다고 생각하면 되는데,

 

현재. Selector는, 지정된 조건 하에 가장 올바른 객체부터  순서대로 1번부터 선택해서 순환해준다.

 

위에서는 1번과 3번이 Selector에 연결되어 있음으로, 1번이 유효하다면, 3번은 유효할 수 없다.

 

비헤이비어 트리는 블랙보드 를 통해 변수를 관리한다.

 

인공지능의 신경망을 비헤이비어 트리 라고 생각하고, 저장장치 를 블랙보드 라고 생각하면 이해가 쉽다.

 

 

블랙보드는 위와같이. Self 레퍼런스와 PlayerActor를 통해 현재 Player를 탐색했는지 여부를 구분한다.

 

 

비헤이비어 트리의 좌측 1번의 경우, 블랙보드의 PlayerActor가 Is Not Set일 경우. (NULLPTR일 경우) 실행한다.

 

Patrol이라는 행동을 실행.

 

이라는 뜻이다.

 

즉, 플레이어를 발견할 때 까지 지정된 위치를 순찰하게 하는 것이다.

 

비헤이비어 트리의 우측 3번의 경우, PlayerActor가 Is Set일 경우 ( NULL이 아닐경우 ) 실행한다.

 

패트롤을 종료하고, Move To를 한다는 의미이다.


BTT_Patrol

 

 

매우 쉽게 구성되어 있다.

 

현재 Tick AI로, Ai가 거의 Tick과 동일하게 시간마다 처리하게 하여. 현재 지정된 컨트롤러의 Pawn에서 Class를 받아온 뒤, 해당 컴포넌트의 GetData를 통해. 값을 받아와 AI Move To를 실행한다.

 

AiMove To 는 지정된 위치값을 향해 지정된 오차값까지 진행할 것이다.

 

다 끝났다면, Succeass를 통해 Finish Execute True를 반환한다.

 

만약, 현재 Owner가 존재하지 않는다면 유효하지 않음으로, False를 반환한다.


AI Controller

 

현재 지정된 객체의 인공지능 컨트롤러 컴포넌트 이다.

 

비헤비어 트리는 뉴런구조, 블랙보드 는 저장장치 라면,

 

전체 이동관리를 담당하며 쉽게 말해 머리다.

위와같은 구조를 가지며,  AIPerception을 통해 현재 지정된 폰의 감지계통을 사용한다.

 

현재 지정된 감지환경설정은 눈 이며, 여러개를 지정하고 주도적인 감각 지정을 통해 더 우선순위의 행동목표를 지정해줄 수 있다.

 

예를들면, 시야와 Damage를 두개 사용한다면, 적 엑터는 기본 시야이지만, 데미지가 들어왔다면 데미지 를 준 객체로 변하게 할 수 있다는 의미이다.

 

귀속 감지는 현재 지정된 탐지할 객체의 범위를 말한다.

 

Event On Posses를 통해 실행될 때, 현재 지정된 pawn의 비헤비이어 트리를 Run Behavior Tree를 통해 실행시켜줘야 AI가 동작한다.

 

 

위와같은 On Perception Update를 통해 현재 감지계통을 업데이트 할 수 있다.

 

위 업데이트는 For를 통해 순환하며, 감지계통에 검색된 객체 배열을 반환하고 해당 배열을 순환조회하면서, 목표로하는 객체가 맞는지 확인. 맞다면 SetValue As Obejct ( Blackboard를 통해 해당 블루프린트에 접근 가능하다. ) 를 사용해서 지정된 Value이름에 객체를 집어넣으면 된다.

 

집어넣었다면, Found를 통해. 찾았음을 확인하고. 찾았다면 그대로 진행. 찾지 못했다면 NULLPTR로 다시 변환해준다.


Line

 

Line은, Spline을 집어넣기만 하면 된다.


월드배치

 

인공지능 이동을 구현하려면, 네비게이션메시를 맵에 배치하여. 현재 이동가능한 위치를 지정해주어야 한다.

 

네비게이션메시는 다음과같이 사용할 수 있다.

 

생성된 네비게이션 메시를 확인하려면 P 버튼을 누르면 된다.

 

네비게이션 메시는 맵 전체를 둘러싸듯이 생성해주면, 현재 물리법칙 상 위에 존재할 수 있는 위치에 이동가능 한 메시를 배치해준다.

 

 

생성된 주황색이 네비게이션 메시 이다. 높이값까지 하려면 높이까지 위로 올려주면 된다.

 

Line은 다음과 같이 배치한다.

 

원을 그리는 방법은 다음과 같이 사용하면 된다.

 

 

내부가 전부 이어져있는 원을 그리려면 다음과 같은 설정을 지정한다.

 

월드상 객체를 눌러주고, 닫힌 루프를 체크해주면 닫힌루프 처리가 된다.

 

그리고, 월드에 배치된 AI를 선택하고, 해당 AI의 Line을 월드상 객체로 연결해준다.

 


테스트

 

 

728x90