클라 기반이라면은 너무나 당연하게도 클라에서 길찾기를 해야되는데
멀티 게임을 경우 서버에서 길찾기를 해야하는게 아니라
클라에서도 길찾기를 클라에서도 해야되나??
이것은 컨텐츠 마다 조금씩 다르긴하다.
우리가 만드는 게임처럼 셀 단위로 움직이는게 아니라면
"서버"에서 아무리 길을 열심히 찾아준다고 해도
점단위로 정확하게 어디로 움직여야 할지는 찾아주질 못한다.
그래서
목표하는 목표지점만 찍어주고(서버에서)
그 중간에 길을 찾는 과정에서 Astar같은 것은 각자 클라에서 해줘서 싱크를 맞춰 주면 될 것이다.
따라서
클라에서도 길찾기를 해야하나 아니냐는 경우에 따라 조금씩 다르다.
루키스는 클라에서 작업을 한다음에
쪼개고 쪼개서 서버에 주는? 그런 방식을 선호를 한다.
Astar 크게 달라진점
ignoreDestCollision
최종 목적지는 충돌을 할지 말지 결정하는데
이렇게한 이유는
어떤 몬스터가 플레이어를 추적하기 위해서 추가한 것인데
Astar돌릴때
startCellPos = 시작위치, destCellPos = 플레이어가 있는 목표지점인데
목표지점에 플레이어가 있어서 막혀있으면
목적지를 못찾게 되니까
맨 마지막 좌표는 충돌을 무시하고 무조건 갈 수 있다고 간주를 하라라는 의미에서 추가를 함.
에서
Idle일 경우
_coPatrol == null일 경우
코루틴 돌려서 이상하게 이리저리 움직이게 했었음.
그래서 패트롤만! 하는게 아니라
패트롤 하면서 움직이는 도중에 Player를 찾았다면은
플레이어를 향해서 이동을 하게끔 추가를 하도록 하겠다.
패트롤 같은 경우
이렇게 간단하게 랜덤 시간 이후 이루어져있는데
Search AI의 경우 어떻게 해야할까..??
플레이어가 가만히 있으면 노상관인데
플레이어가 막 이동을 하면 우짜지??
한번 Search를 했다고 해서 근방에 없다는 보장이 없음.
그래서 1초마다 Search로직을 실행시켜주는게 합당할 거같다.
while문을 무조건 계속 돌지말고 1초마다 돌게 끔 만들어주고
현재 Object의 Find함수가 Vector3Int를 받고있는데
상하좌우 다 보면서 찾지말고
조금더 효율적인 Find를 만들어 보도록 하자.
Find 함수 오버라이딩을 해주도록 하는데
조건을 실시간으로 전달을 해주는 방식으로 만들어 보도록 하자.
https://docs.microsoft.com/en-us/dotnet/api/system.func-2?view=net-6.0
public delegate TResult Func<in T,out TResult>(T arg);
말이 좀 어려운데 인자 in T를 받아서 TResult를 내뱉는다는 것이다.
https://velog.io/write?id=b7235e06-3c4b-4e37-bca3-60c094693f01
이거 정리한건데 참조 ㄱㄱ
(이렇게하면 Func<GameObject, bool> condition = 어쩌구 해줘야 하지 않나..??)
47번째 줄에서 44번 if문을 통과 했으니까 cc가 존재하는 상황이고
obj가 있다는 말임(41번쨰 foreach돌고있으니까)
그러면 condition이라는 Func에다가 Invoke로 obj가 있다고 알려줌
(이게 return obj가 되는 것인가?)