학습내용
#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와 연결.
'언리얼엔진' 카테고리의 다른 글
[언리얼 엔진4] 8. 시퀀서(Sequencer) (0) | 2021.10.13 |
---|---|
[언리얼 엔진4] 6. Cast, Custom Event, Blue Print (0) | 2021.09.29 |
[언리얼 엔진4] 5. Material, Texture, Add, Multiply, LI (0) | 2021.09.26 |
[언리얼 엔진4] 4. 시한폭탄 만들기, Variable (0) | 2021.09.15 |
[언리얼 엔진4] 3. Blueprint, Class, 고장난 전등 만들기 (0) | 2021.09.15 |
댓글