현재 BT를 보면, 플레이어를 따라오거나 원래 위치로 가는 행위만 한다.
여기에 플레이어를 공격하는 노드를 추가하려고 한다.
위처럼 Shoot Node를 추가해준다.
Move To 노드는 300으로
반경 3m까지만 오고 멈추도록 설정한다.
계속해서 쉴 새 없이 쏘는 것을 방지하기 위해서,
Sequence에 Wait를 걸고, Loop Decotrator를 걸어서
딜레이를 가지고 반복해서 쏘게 한다.
AIController의 Tick에 구현하여 프레임마다 실행했던 기능을
ServiceNode로 구현하려고 한다.
그렇게 하는 이유는, ServiceNode도 Tick이 존재하고,
Service의 Tick은 매 프레임마다 실행되지 않고
0.4~0.6초 마다 실행하는 것으로 실행빈도를 급격히 낮출 수 있다.
그렇기 때문에 AIController의 모든 기능을
ServiceNode에서 구현할 수 있도록 옮긴다.
빨간 ServiceNode들을 추가하였다.
최상위 Selector에서 Player의 감지를 진행하고,
감지되면 PalyerLocation을 갱신한다.
아니면 초기화 = 똑같은 기능을 수행하는 것이다.
아래 ServiceNode는 LastPlayerLocation로 설정한다.
즉 기존 AIController의 기능을
2개의 Service Node로 나눈 것이다.
Service Node를 사용하는 이유는
연결된 BT의 BB에 접근하여 값을 수정할 수 있고,
Tick이 매 프레임마다 호출하는 것을 대신하여 경량화 시킬 수 있기 때문이다.
BT에 기능이 이미 구현되어있다.
Service의 SetDefaultFocus를 하고,
Blackboard의 PlayerLocation을 focus로 설정하면,
간단하게 플레이어를 보도록 설정할 수 있다.
위의 문제들은 Collision 관련 문제라고 봐야한다.
현재 플레이어는 Player Viewport화면을 기점으로
Location과 Rotation을 받지만,
AI는 Camera가 있어도 따로
Viewport가 없으므로 눈 위치에 해당하는 하드코딩 값을 사용한다.
Collision관련 Param을 설정한다.
IgnoreActor에 총 자신과, 총의 Owner인 AI를 추가한다.
Collision은 위처럼 제거한다.
제거하면서 PlayerController까지 제거한다면,
조작도 하지 못하게 막을 수 있다.
현재 게임에 적용된 GameMode는 단순히 Player, AI 등을 설정하기만하는
용도로 사용되고 있었다.
이전에 만든 SimpleShooterGameModeBase의 모드를
상속받는 KillAIAllGameMode를 만든다.
단순히 override를 설명하기 위한 용도인 것 같고,
SimpleShooter에 구현한 아무 의미 없는 PawnKilled라는 가상함수를
KillAIAll에 구현한다.
구현한 것은 단순히 로그를 띄우기
실제로 게임모드의 해당 로직을 실행하는 것은
Character에 위처럼 구현한다.
현재 실행중인 게임모드를
ASimpleShooterGameModeBase로 캐스트하고,
(GameMode는 단 하나지만, 명시적으로 멤버함수를 호출하기 위함)
구현한 기능을 사용한다.
현재 적용된 KillAIALLGameMode의 PawnKilled를 수행한다.
GameMode에선 PlayerController를 사용한다.
위를 통해서 졌음을 알린다.
PlayerController를 상속받는 ShooterPlayerController
를 상속받는 BP_ShooterPlayerController를 생성한다.
당장 사용하지는 않음
기본 Controller로 수정해준다.
그리고 GameHasEnded함수를 수정해준다.
Log만 일단 나오게 한다.
로그 대신 위처럼 수정한다.
PlayerController에는 간단히 게임을 Reset하는 함수가 존재한다.
따라서 Timer를 설정하여 5초뒤에 해당 함수가 호출되도록 한다.
제대로 다시 시작은 되지만,
왜인지 AI가 죽은 플레이어를 향해 계속 총을 쏜다.