Context-based Steering 알고리즘을 이용한 몬스터 AI제작

2021. 11. 4. 18:11게임개발

참고한 글 : https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=70459&s_type=search_subject_memo&s_keyword=%ED%8E%AD%EA%B7%84&page=1 

 

펭귄이 사막에서 총질하는 게임 개발일지 -2- - 인디 게임 개발 갤러리

이전 게시글 : https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=70309&exception_mode=recommend&page=1사

gall.dcinside.com

너무 아이디어를 그대로 따라한것 같아서 아쉽긴하지만 결과물은 좋게 나온것같다

 

결과물을 봐보자

 

 

이제 어떻게 했는지를 알아보자

 

Context-Based Steering알고리즘이란 내가 해석한걸로는 자신주변으로 갈 방향으로 각각 가중치가 존재하고

가장 큰 가중치 방향으로 이동하는것이다

 

이제 가중치 계산이 핵심이다

내적값을 저장하는 배열을 만들어준다 이를 dotProductValues라고 부르겠다

mob에서 target으로 가는 빨간색의 벡터를 만들어준다 뺄셈연산을 이용하면된다

그후 삼각함수를 이용해 mob에서 자신 주변으로 가는 벡터를 만들어준다

그후 이 둘을 내적해주면된다 내적값은 두 벡터가 단위벡터일때

두벡터가 이루는 각도를 θ라고 할때 내적값이 Cosθ가 나오게된다

그러면 이런식으로 내적값이 나오게되는데 간단하게 방향의 유사성이라고 보면된다

유사도가 크면 1 작으면 -1인 값이 나오는 방향의 유사성으로 말이다

이제 이 값들을 dotProductValues에 넣어주고

가중치를 계산해준다

가중치배열은 weights라고 두겠다

플레이어에게 다가갈때 가중치계산은

weights[i] = 1 + dotProductValues[i]

로 하면된다

그러면 타겟으로 가는 가중치가 가장 커지게된다

 

 

푸른색 Ray의 길이가 가중치를 의미한다

타겟은 흰색동그란 스프라이트이고 타겟에게 멀어졌을때 타겟으로 가는 방향이

가장 가중치가 큰것을 볼수가 있다

그러면 다른상황때는 어떻게할까??

몬스터가 항상 플레이어를 향해 달려가지만은 않을것이다

일정거리를 유지하도록

둘사이의 거리가 일정거리보다 작으면 뒤로 갈 수있게

weights[i] = 1 - dotProductValues[i]

둘사이의 거리가 일정거리와 같으면 빙글빙글 돌게

weights[i] = 1 - Mathf.Abs(dotProductValues[i]);

빙글빙글 도는 가중치는 이런식으로 된다

일정거리보다 멀때 플레이어에게 다가갈때의 가중치계산은

weights[i] = 1 + dotProductValues[i]이다

 

그리고 장애물을 피할수있게 나아가는 방향으로 레이캐스트를 쓰는데

레이캐스트에 걸린 방향의 가중치를 대폭 깎아서 해당 방향으로

가지 않도록 장애물을 피할 수 있게했다

 

결과물이 잘 나온것같아서 좋았다

'게임개발' 카테고리의 다른 글

갈고리(Hook)  (0) 2021.11.15
타격감  (0) 2021.11.13
동적인 유도화살  (0) 2021.11.04
Procedural Map Generation(절차적 맵생성,BSP)  (1) 2021.07.23
ProceduralAnimation(절차적애니메이션)  (0) 2021.07.20