2024. 8. 21. 01:17ㆍ카테고리 없음
적 상태 설정 (Enemy FSM)
열거형을 위한 블루프린트 생성
Enumeration을 생성한다.
[+Add Enumerator] 버튼을 눌러서 상태를 추가한다.
BP_Enemy로 간다. EventGraph에서 방금 만든 열거형을 추가한다.
Event Tick과 연결하고 [Selection] 부분에 우클릭 후 Variable을 하나 생성해서 MyState로 이름을 지었다.
각 상태에 대한 Function을 생성했다.
각 상태에 맞게 배치하였다.
중간에 [Print String] 노드를 추가하여 현재 상태를 출력한다.
[Print String] 노드에서 [Print to Screen] 체크 해제하면 화면상에는 나오지 않고 Output Log에만 출력된다.
IdleState 함수 편집
IdleState 함수 편집으로 들어왔다. CurrentTime과 IdleDelayTime 변수를 만들어서 일정 시간이 지나면 State를 Move로 바꿔주도록 만들었다. CurrentTime은 초기화된다.
Move 함수 편집
먼저, 변수 추가를 위해서 Target 이름의 변수를 추가했고 BP_Player로 설정한다.
타겟 위치에서 내 위치를 빼고, Normalize까지 하여 방향만 구해서 Direction 이름의 지역 변수에 SET 하였다.
뒤에 [Add Movement Input] 추가
그런데 여기서, 게임을 시작하기 전에는 Target을 알 수 없기 때문에 다시 EventGraph로 돌아가서 Target을 SET한다.
이 상태로는 적이 계속 나를 따라온다.
컴포넌트로 만들기
Actor Component 블루프린트 클래스를 하나 만들었다.
BP_Enemy에 있는 노드들과 VARIABLES, FUNCTIONS를 모두 복사해서 가져왔다. 함수 노드는 지우고 다시 연결하였다.
Compile하면 Target 부분에 오류가 나서 Me 이름의 Variable을 하나 만들어서 BP_Enemy로 설정했다.
Target 부분에 Me를 놓고 Compile하여 오류없이 잘 가져왔다.
BP_EnemyFSM의 EventGraph로 돌아가서, Me가 BP_Enemy 임을 명시해야 한다.
BP_Enemy의 모든 EventGraph는 지운다. Variable과 Function도 다 지웠다.
BP_Enemy에 BP_EnemyFSM을 컴포넌트로 추가했다. 실행하면 잘 동작한다.
캐릭터를 보면서 움직일 수 있게 [Orient Rotation to Movement]를 체크했다.
Camera가 Enemy는 무시하고 벽은 안뚫었으면 좋겠다
BP_Enemy에서 Capsule과 Mesh의 Collision 중 Camera 부분을 Ignore로 바꾼다. 그러면 벽은 못뚫지만 적은 카메라가 뚫는다.
참고사항으로 BP_Player의 SpringArm 설정.
Move 함수 편집 계속
일정 범위에 타겟이 들어오면 공격을 하도록 만들어야 한다.
Direction 지역 변수를 하나 만들었고 Target과 나의 벡터 뿐만 아니라 거리도 구해야 하므로 [Vector Length] 노드를 추가했다.
그렇게 계산된 거리를 AttackRange와 비교해서 범위 내에 들어오면 Attack으로 State를 변경한다.