본문 바로가기
언리얼엔진

[언리얼 엔진4] 7. 인공지능(Ai) 구현하기, 배열(Array)

by 쿠킷리스트 2021. 10. 6.

학습내용

#1 : 언리얼 엔진에서의 인공지능(Ai) 구현하기
#2 : 랜덤하게 배회하다가 플레이어 캐릭터를 발견했을 때 플레이어만 쫓아오는 Ai
#3 : 골드코인을 나는 먹어지는데 Enemy는 못먹게 만들기
#4 : 하늘에서 불타는 책상이 랜덤하게 떨어지게 만들기(배열, Array)

#1 : 언리얼 엔진에서의 인공지능(Ai) 구현하기

 언리얼 엔진에서 Ai, 인공지능을 구현하는 3가지 방법.

  • 블루프린트 노드를 활용해 구현.
  • Behavior 트리를 이용해 구현.
  • C++ 혹은 python 코드를 짜서 언리얼에 import 하여 구현.

 

#2 : 랜덤하게 배회하다가 플레이어 캐릭터를 발견했을 때 플레이어만 쫓아오는 Ai

1) 캐릭터 만들기

  • Third person character를 복사하여 이름을 enemy로 변경.
  • 더블클릭하여 블루 프린트로 들어가 카메라 관련 component 모두 삭제.
  • Event Graph의 모든 노드를 삭제.
  • Capsule Component를 선택하여 크기 수정.
  • Character Mesh를 선택하여 materials 수정.

2) 움직임 만들어주기

  • Event Graph에서 AI MoveTo 생성.
  • Pawn을 self와 연결. (get a reference to self)
  • Destination은 해당 캐릭터의 목적지를 만들어 주는 것.
    • X, Y, Z 좌표를 랜덤하게 지정해줘서 배회하게 만들기.
    • random을 검색하면 Ai 관련 3가지 기능이 나옴.
    • 우리는 랜덤한 값을 가지고 오기만 하면 되는 상황.
    • 파란색은 값을 전달 다른 노드에 전달하기에 필요가 없을 것. 녹색은 값을 가지고 있기에 사용 
    • GetRandomPointInNavigableRadius를 Destination에 연결.
      • Origin 값으로 원점을 설정.
      • 캐릭터가 가진 위치 주변의 랜덤한 좌표를 찍어서 이동하도록 설정.
      • Self - GetActorLocation - Origin 연결.
      • Radius를 500으로 설정해 5m 범위 내에서 Destination을 지정하도록.

  • On Success는 Destination에 도착했다면을 뜻함.
  • On Fail은 Destination에 도착하지 못했다를 뜻함.
  • Print String을 사용해 도착했는지, 못했는지를 확인할 수 있도록 설정.
  • Event BeginPlay를 연결해 게임이 시작되면 작동하도록 설정.
  • 하지만 이러한 상태에서 동작을 하지 않는데, 이는 Ai를 랜덤하게 돌아다니게 설정해뒀더니 너무 랜덤하게 돌아다녀서 레벨 디자인을 망치는 경우가 많아 이를 제한하고 있음.

  • Volumes - Nav Mesh Bounds Volume을 가져와서 움직일 수 있는 범위를 설정해준다.
  • Show에 navigation을 체크하면 돌아다닐 수 있는 영역을 시각적으로 확인할 수 있다.
  • Play 해보면 한 번 움직인다.
  • Event Graph에서 결과값이 Success, Fail 모두 다시 AI MoveTo로 연결해주면 계속 돌아다닌다.
  • 노드를 더 깔끔하게 만들어 주기 위해 Custom Event로 (EnemyMoving) 이벤트를 만들어준다.
  • AI MoveTo와 연결해주고 Success, Fail 모두 EnemyMoving과 연결한다.
  • Event BeginPlay도 Enemy Moving과 연결하여 첫 시작을 할 수 있게 만들어 준다.

3) 플레이어를 보면 쫓아오게 만들기

  • PawnSensing component를 가져오고 컴파일 하면 듣고, 볼 수 있는 범위를 나타내준다.
  • Peripheral Vision Angle 값을 줄여 시야각을 줄여준다.(다양한 값을 수정)
  • 컴포넌트 관련 이벤트는 Details 창 안 Events 설정해줄 수 있다.
  • On See Pawn의 초록색 + 를 클릭하면 Event Graph에 자동으로 Event가 생성된다.

  • On See Pawn을 Print String과 연결해 잘 작동되는 지 확인.
  • AI MoveTo와 연결하여 움직임 만들어줌. Pawn은 Self. 
  • Print String과 AI MoveTo 사이에 Cast To ThirdPersonCahracter를 넣어준다.
  • Cast의 Object를 Get Player Character와 연결.
  • Target Actor를 Cast To ThirdPersonCahracter(Player Character)와 연결.
  • 모든 노드를 선택하고 C를 누르면 선택한 노드들에 주석을 추가할 수 있음.

4) 코드를 더욱 깔끔하게 만들기

  • 사용하지 않을 때는 코드를 끊어주는 것이 좋음.
  • Branch와 Boolean 변수를 사용해 설정을 해준다.
    • EvenvtMoving과 Branch를 연결.
    • Boolean 변수를 생성하고 Default값을 False로 설정.
    • Branch Condition에 생성한 Boolean 변수 연결.
    • Branch False 값을 AI MoveTo에 연결.
    • On See pawn (PawnSensing)을 Set Boolean 변수(True 값)에 연결.
    • Prinst String과 Enemy Moving 사이에 Set Boolean 변수(False 값)에 연결.


#3 : 골드코인을 나는 먹어지는데 Enemy는 못먹게 만들기

  • Geometry - Cylinder를 이용해 GoldCoin을 생성한 뒤 Static Mesh로 만들어 블루프린트에서 먹으면 사라지게 만들고, 소리도 나게 하고, 여러개의 동전 깔아놓기.
  • Begin Overlap - Other Actor를 Cast To ThirdPersonCahracter와 연결해 캐릭터가 코인을 먹을 때만 사라지도록 설정.


#4 : 하늘에서 불타는 책상이 랜덤하게 떨어지게 만들기(배열, Array)

  • 새로운 블루프린트에 Static Mesh, Particle System 컴포넌트를 추가하여 불타는 책상 만들기.
  • 테이블의 Details 창에서 Simulate Physics를 체크하여 True 값으로 변경.
  • Particle System을 Static Mesh 아래로 넣어 하이어라키 완성.

  • Level 블루 프린트에서 K를 누르면 책상 생성되도록 만들기.
    • input k - Spawn Actor From Class 연결하고 Class에 BP_BurningTable 추가.
  • All Classes에서 Target Point를 뷰포트에 옮기기.(위치 값을 가져다 쓰기 위한 것)
    • Event Graph에서 Target Point를 가져오고 GetActorLocation 혹은 GetActorTransform과 연결.
    • GetWorldLocation 혹은 GetWorldTransform을 Spawn Transform과 연결.

  • TargetPoint를 여러개 생성.
  • Get All Actors Of Class를 생성하여 Input K와 연결.
  • Get All Actors Of Class의 Actor Class에 TargetPoint 입력.
  • Get All Actors Of Class의 Out Actors에서 Get(a copy)을 만들어 연결.
  • Get을 GetActorLocation과 연결.
  • Get All Actors Of Class를 Spawn Actor BP Buring Table과 연결.
  • Get에 Random Integer 혹은 Random Integer in Range와 연결.
  • Spawn Actor BP Buring Table을 Delay와 연결.
  • input K를 제거하고 custom event 생성하고 시작지점과 연결.
  • Delay를 custom event와 연결.
  • EventBeginPlay를 생성하고 custom event와 연결.

댓글