하아찡
[언리얼5, C++] 몬스터 움직임 본문
언리얼 버전 5.5.3
서버언어 C++로 구성했습니다.
실행화면
현재 몬스터 움직임 로직
몬스터 스포너 위치치를 기준으로 -1000 ~ +1000 사이의 값에서 랜덤한 좌표를 받아서 처리합니다.
나중에 몬스터별로 클래스가 생성됐을때 범위를 따로 지정해주면 될듯합니다. 움직이는 주기랑.
SendBufferRef Monster::ServerMove(MonsterRef monster, unordered_map<uint64, SpawnLocation> _levelMonsterSpawnLocation)
{
uint64 spawnerID = monster->SpawnerID;
Protocol::S_MOVE pkt;
Protocol::PosInfo* pos = pkt.mutable_posinfo();
pos->CopyFrom(monster->objectInfo->posinfo());
pos->set_x(_levelMonsterSpawnLocation[spawnerID].x + Utils::GetRandomFloat(1000));
pos->set_y(_levelMonsterSpawnLocation[spawnerID].y + Utils::GetRandomFloat(1000));
pos->set_movestate(Protocol::MOVE_STATE_RUN);
//서버도 똑같이 이동된 좌표값을 가지게함.
Protocol::PosInfo* mypos = monster->objectInfo->mutable_posinfo();
mypos->set_x(pos->x());
mypos->set_y(pos->y());
mypos->set_movestate(Protocol::MOVE_STATE_RUN);
SendBufferRef sendBuffer = ClientPacketHandler::MakeSendBuffer(pkt);
return sendBuffer;
}
보완해야할점.
클라이언트 문제이긴 한데, 서버에서 보내준 좌표에 도착했을때 계속 앞으로 전진하는 코드때문에 도착하면 앞뒤로 계속 회전하는 문제가 발생.
현재는 서버가 도착지점을 바로 저장함으로 중간 중간 이동동기화 작업이 없음. (후순위)
다음예정
몬스터가 플레이어 어그로 잡는 기능을 추가할 예정입니다.
모든 플레이어 값을 가져와서 연산하는 방식은 너무 과한거같아서 일정영역을 정해두고 그리드 형식으로 몬스터 주변 그리드만 불러와서 해당 위치에 플레이어가 있는지를 확인하는 방식으로 사용할듯합니다.
반대로 몬스터도 그리드 기능을 넣어서 플레이어가 주변 몬스터가 얼마나 있는지를 확인하는 기능을 넣을까하는데
플레이어는 이미 그리드기능을 추가해두었는데 몬스터는 중간중간 움직임때문에 서버에서 어떤식으로 그리드 처리를 해야할지 잘모르겠음. 일단은 움직인 좌표값을 기준으로 처리할듯합니다.
반응형
'C++ > 이것저것서버테스트' 카테고리의 다른 글
[언리얼5] 마지막 종료지점 저장 (0) | 2025.03.12 |
---|---|
[언리얼5, C++] 몬스터 어그로 (0) | 2025.03.12 |
[언리얼5, C++] 몬스터 생성 (0) | 2025.03.04 |
[언리얼5, C++] 맵 이동 - 2 (0) | 2025.02.25 |
[언리얼5, C++] 맵 이동 (0) | 2025.02.23 |