기본 콘텐츠로 건너뛰기

좋은 AI의 조건 (1)

    목차

▲이 글의 대부분은 Game Maker's Toolkit의 What Makes Good AI? 영상에서 인용하였습니다.


최근 대부분의 게임에서 뛰어난 적의 AI가 채용된 것들이 많습니다.
좋은 AI는 플레이어에게 게임의 경험을 더 즐겁게 만들어주고, 뛰어난 기술력을 느끼게 할 수도 있습니다.
최근에는 '에일리언 : 아이솔레이션'에서는 복수의 AI를 부여하여 학습하는 에일리언을 구현하기도 하였고, '헬로 네이버'에선 이웃집 아저씨가 플레이어의 행동을 예측하고 정말 똑똑한 AI처럼 만들어 게임의 공포감을 훨씬 더 살렸습니다.

게임의 AI는 날이 갈수록 발전하는 만큼 좋은 AI의 조건, 좋은 AI처럼 보이게 하는 조건에는 어떤 것들이 있을까 살펴봅시다.

적의 체력과 AI의 관계

과거 좋은 AI를 가졌다고 알려진 'F.E.A.R'의 클론 병사들, '헤일로' 시리즈의 코버넌트, '하프라이프'의 해병대들이 있습니다.
이들의 공통점은 좋은 AI를 가진것 외에도 하나의 공통점이 있는데, 체력이 많다는 것입니다.

'헤일로'의 '코버넌트'들은 엄폐, 근접 공격, 감각기관들을 가져서 좋은 AI라고 느끼기도 하지만 그들은 많은 체력을 가졌습니다.
실제로, '헤일로'를 개발한 '번지'에서 '헤일로'를 개발할 때 적의 체력이 많은 버전과 체력이 적은 버전을 따로 테스트를 했더니, 적의 AI가 영리하다고 느낀 비율이 각각 43%와 8%였습니다.
(체력이 많은 적들은 플레이어들이 적을 처치하기 위해 그만큼 더 많이 생각하고 더 다양한 전략을 활용하고, 적 AI가 다양한 행동을 보이게 되기 때문인 것 같습니다.)


AI의 형태를 다르게 설계

그리고 적의 AI는 어떤 컨셉의 게임인지에 따라 다르게 생성되어야 합니다.
2016년 '이드 소프트'가 '둠'을 개발 할 당시, 적의 AI를 공격적으로 만들자 플레이어들이 점점 더 수비적으로 행동하게 되었다고 말했습니다.
이는 보이는대로 다 부수고 매우 공격적으로 플레이해야하는 '둠'의 컨셉과는 맞지 않았습니다.
그래서 개발팀은 '둠'의 적들을 조금 더 수비적으로 바꾸고, 적의 위치를 고수하게 만들었습니다. 그러자 플레이어들은 '둠'의 컨셉과 맞게 공격적으로 플레이하게 되었습니다.

'배트맨 아캄'시리즈 역시 플레이어들이 적을 때리고 콤보를 넣는 쾌감을 느끼는 것이 이 게임 전투의 핵심입니다. '배트맨'역시 수비적인 AI가 어울립니다. 만약 '배트맨'의 적들이 총을 난사하고 배트맨을 두들겨 패기위해 혈안이 되어있다면 이 게임의 전투는 좋은 평가를 받지 못했을 것입니다.

반대로 '에일리언 : 아이솔레이션' 이라는 게임의 컨셉은 에일리언이 플레이어를 쫓아다니고 플레이어는 AI를 피해다니면서 공포를 느껴야 합니다. 이런 게임에서는 조금 더 공격적인 AI가 어울립니다.
'에일리언 : 아이솔레이션'의 에일리언
이 게임들 모두 좋은 평가를 받고 있는 게임인 만큼, '플레이어를 죽일 수 있는 적'보다는 '좋은 AI를 가진 적'들이 좋은 게임을 만드는데 필요하다는 것을 알 수 있습니다.


플레이어에게 편법을 쓸 수 있게 하는 좋은 AI

좋은 AI는 플레이어에게 편법을 사용하는 것을 가능하게 합니다.
예를 들어, '스카이림'에서 상점 주인에게 바스켓같은 물건을 머리에 씌어서 물건을 훔칠 수 있습니다. 이것은 현실의 사람과 비슷하게 만든 똑똑한 AI라고 볼 순 없습니다.

하지만 머리에 물건을 씌우면 밖을 보지 못한다는 것은 NPC에게 눈, 코, 귀같은 감각 기관이 존재한다는 것을 의미하고, 플레이어들은 NPC들의 감각을 직접 피해가면서 플레이한다는 것에 성취감을 느끼고, 꼼수를 써가면서 플레이 한다는 것에 재미를 느끼기도 합니다.

저는 최근에 '젤다의 전설 : 브레스 오브 더 와일드'를 재밌게 플레이 했습니다.
그 게임에서 저는 처음으로 너무 강해서 이길 수 없다고 판단한 적을 만났는데, 그 적을 죽이기위해 적의 서식지 천장에 있는 횃불을 활로 쏴 폭탄에 닿이게 해서 처치했습니다.
이 경험은 아마 모두 설계된 것이었겠지만, 저는 이런 꼼수를 사용해 적을 처치했다는 것에 큰 성취감을 느낀 기억이 있습니다.

또 다른 예로는 '파크라이' 시리즈에서는 적의 거점을 공격할 때 일부분의 적들만 플레이어에게 공격을 한다던가, '배트맨' 시리즈에서는 암살 미션에서 적이 절대 뒤를 돌아보지 않습니다.
또, '언차티드' 시리즈에서는 플레이어가 엄폐물에 숨어있다가 나왔을 때는 적이 플레이어를 절대 맞추지 못하게 만들기도 했습니다.
이런 것들은 플레이어가 알지 못하게 플레이어와 적들이 공평하게 싸울 수 있도록 만들어 준 것입니다. 만약 이런것들이 없었다면 플레이어들은 게임이 불공평하다고 생각하고 너무 어렵다고 느낄 것입니다.

자신의 감정을 표현

많은 게임들에서 자신의 감정을 밖으로 표현하는 NPC들이 있습니다.
이런 게임들을 플레이 하다보면 저는 NPC들에게도 감정이 있다는 기분을 받기도 합니다.
예를 들어, '스플린터 셀' 시리즈에서 플레이어가 적에게 가까이 다가가면 적들이 "여기에 누군가 있는것 같은데"하는 말을 내뱉기도 합니다.

꼭 대사로 그것을 표현하지 않아도 됩니다.
'마크 오브 닌자'에서는 적들이 ?같은 표식을 나타내기도 하고, '파크라이'나 '어쌔신 크리드'에서는 UI상에서 나타나기도 합니다.
NPC가 자신의 생각을 표현하는 것은 보통 암살이 있는 게임에서 많이 사용되곤 합니다. 이런 표현 방식은 플레이어에게 긴장감을 더 높여주고, NPC들에게 지능이 있다는것을 표현합니다. 그럼 플레이어들이 그저 '걸어다니는 덩어리'를 암살했다고 생각하지는 않을 것입니다.

또한 감정이 있는 AI를 만들기 위해서는 AI마다 각각의 개성을 만들어 주는 방법도 있습니다.
'팩맨'의 4가지 유령들은 각자의 개성과 이름이 있습니다.

빨간 유령은 '블링키'로 불리며 플레이어의 뒤를 계속 쫓아갑니다.
분홍색 유령은 '핑키'로 불리며 팩맨의 앞을 노립니다.
하늘색 유령은 '잉키'로 불리고 플레이어와 대칭으로 움직이며
주황색 유령은 '클라이드'로 불리고 랜덤으로 움직입니다.

이런 유령들의 개성은 '팩맨'의 유령들을 더 똑똑한 AI처럼 보이게 합니다.
그 외에, '문명' 시리즈의 지도자들 각각의 특성이나 성격, '미들어스 : 섀도우 오브 워'의 적 지도자들도 비슷한 역할을 합니다.

개발자들은 자신의 감정을 표현하는 AI가 플레이어들에게 더 똑똑해 보인다는 것을 알게 되었습니다.
그 이유는 실제로 각각의 AI가 판단능력과 인지능력, 감각기관 등을 가지고 있다고 해도 실제로 플레이어가 목격하지 않는다면 알 수 없기 때문입니다.

위에서 본 예시들에서도 "여기 누군가 있는것 같다"고 말하는 NPC가 실제로 그것을 인지하게 프로그래밍 되어있어도 플레이어가 그것을 알지 못한다면 그저 멍청한 AI로 보일 수 있습니다.
이런 AI의 감정 표현은 플레이어에게 중요한 정보나 계획, AI의 행동 패턴 파악으로도 활용될 수도 있습니다.


다음은 예측이 가능한 AI로 시작하겠습니다.

댓글

이 글도 관심 있으실 것 같아요!

놀이의 4대 요소 (Agon(아곤), Mimicry(미미크리), Ilinx(일링크스), Alea(알레아))

네덜란드의 고전 학자인 '요한 하위징아'의 저서인 「호모 루덴스 」에서 인간을 '유희의 인간'이라고 칭했습니다. 프랑스의 '로제 카유아'라는 학자는 「호모 루덴스 」의 이론을 발전시켜 그의 저서인 「놀이와 인간」 (원제 「 Man, plays and games 」) 에서 ‘놀이의 4대 요소’를 말했습니다. 저자는 그것을 아곤, 미미크리, 알레아, 일링크스로 소개했습니다. 이 네 가지 놀이의 요소는 인간의 모든 유희, 놀이에서 발전되어 현대의 비디오 게임에서도 매우 중요한 이론으로 알려져있습니다. 먼저, 아곤(Agon), 경쟁 아곤은 놀이의 주체와 객체간의 경쟁을 의미합니다. 사람들은 경쟁에서 승리함으로써 성취감을 얻고, 우월감을 느끼게 합니다. 이 아곤을 현대의 게임에 대입 시켜보면 경쟁은 최근 가장 많이 플레이 하는 게임 중 하나인 ‘배틀 그라운드’나 ‘리그 오브 레전드’같은 게임들도 경쟁에 기반이 되어있고, 혼자 플레이 하는 게임에서도 자기 자신과의 경쟁, AI와의 경쟁 등이 포함되어있습니다. 예를 들어, 슈퍼 마리오 같은 게임에서도 플레이어들은 어떻게 이 게임을 더 빨리 클리어하기 위해 경쟁하고, 더 많은 점수를 받기 위해 노력합니다. 또한 비교적 MMR시스템이 잘 짜여져있는 '리그 오브 레전드'같은 AOS게임에서도 플레이어의 등급을 결정하는 랭크 게임 시스템이 중점적으로 돌아가고 있고, '오버워치'의 경쟁전 등 많은 게임에서 이런 경쟁을 유도하는 시스템을 만들어 놓았습니다. 게임을 계속 플레이하게 만드는 가장 큰 요소가 아곤입니다. 많은 게임에서 플레이어의 경쟁을 어떻게 잘 이끌어 나갔느냐에 따라서 그 게임의 성공이 나뉠 수도 있습니다. 미미크리(Mimicry), 역할 미미크리는 역할을 의미합니다. 사람들은 실제 세계에서 하지 못하는 일들을 놀이에서 느끼면서 큰 기쁨을 느낄 수 있습니다. 이 역할은 롤플레...

FastAPI 실시간 영상 스트리밍 OpenCV

  FastAPI와 OpenCV를 활용한 실시간 영상 스트리밍 Permalink 실시간 영상을 스트리밍 하는 방법을 찾던 중 파이썬 FastAPI를 활용한 방법을 시도 해보았다. 필수 라이브러리 Permalink 필요한 것은 Python3.9버전 (애플 M1칩셋 맥북에어에서 3.8 버전으로 시도 해보니 OpenCV라이브러리 설치에서 문제가 발생했었다) FastAPI uvicorn OpenCV 정도면 될 것 같다. 라이브러리들은 모두 설치 되었다고 가정 하고, 예제 코드 Permalink # main.py # 라이브러리 import # StreamingResponse를 가져와야함 from fastapi import FastAPI from fastapi.responses import StreamingResponse # cv2 모듈 import from cv2 import get_stream_video # FastAPI객체 생성 app = FastAPI () # openCV에서 이미지 불러오는 함수 def video_streaming (): return get_stream_video () # 스트리밍 경로를 /video 경로로 설정. @ app . get ( "/video" ) def main (): # StringResponse함수를 return하고, # 인자로 OpenCV에서 가져온 "바이트"이미지와 type을 명시 return StreamingResponse ( video_streaming (), media_type = "multipart/x-mixed-replace; boundary=frame" ) # cv2.py import cv2 def get_stream_video (): # camera 정의 cam = cv2 . VideoCapture ( 0 ) while True : ...

Python FastAPI 알아보고 설치하고 초기 설정 해보기

  Python FastAPI, 설치하고 초기 설정 해보기 Permalink 파이썬 웹 서버를 만들어야 하는 일이 생겼늗데, 최대한 빠르고 안정적인 서버를 선택 해야했다. 그래서 기존에 사용하던 Flask보다 훨씬 빠르다고 하는 FastAP를 사용해보기로 했다. ❓ FastAPI란? Permalink 👉 FastAPI 공식 한국어 페이지  https://fastapi.tiangolo.com/ko/ FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python3.6+의 API를 빌드하기 위한 웹 프레임워크입니다. FastAPI는 파이썬에서 사용 가능한 웹 프레임워크 중 하나인데, Flask나 Django보가 훨씬 빠른 속도를 보여준다고 하고, 확인 해봐야 하겠지만 Go언어와도 비슷한 속도를 보여준다고 한다. 또, 쉽고 간결한 코드, 200% ~ 300% 까지 증가하는 개발 속도를 기대할 수 있다고 하는데, 시작 해보자! 👏 Permalink FastAPI 설치 Permalink 먼저 공식 사이트에선 pip를 이용해 설치 하라고 나와있는데, 나는 anaconda를 이용해서 설치를 했다. bash $ pip install fastapi anaconda 사용 시 $ conda install fastapi 그리고 ASGI서버도 필요해서 같이 설치하라고 하는데, Univorn을 설치 해보자. bash $ pip install uvicorn[standard] anaconda 사용 시 $ conda install uvicorn FastAPI 예제 Permalink 설치가 완료되면 이렇게 vscode에서 FastAPI() 클래스가 자동 완성 되는걸 확인할 수 있다. 그리고 정말 간단히 API를 만들 수 있는데, main.py 파일을 만든 후에 from typing import Optional from fastapi import FastAPI app = FastAPI () @ app . get ( "/"...