반응형
이제 protobuf를 이용한 기본 작업도 끝났으니, 이를 이용해서 클라와 서버간의 패킷처리 코드를 작성해주자.
가장 먼저 해줄 부분은 게임에 입장하여 스폰되는 부분이다.
우선 이를 위해서 서버 코드에 Room과 Player 클래스를 추가해주자.
Room.h
#pragma once
class Room : public enable_shared_from_this<Room>
{
public:
Room();
virtual ~Room();
bool HandleEnterPlayerLocked(PlayerRef player);
bool HandleLeavePlayerLocked(PlayerRef player);
USE_LOCK;
private:
bool EnterPlayer(PlayerRef player);
bool LeavePlayer(uint64 objectId);
void Broadcast(SendBufferRef sendBuffer, uint64 exceptId = 0);
private:
unordered_map<uint64, PlayerRef> _players;
};
extern RoomRef GRoom;
#include "pch.h"
#include "Room.h"
#include "Player.h"
#include "gameSession.h"
RoomRef GRoom = make_shared<Room>();
Room::Room()
{
}
Room::~Room()
{
}
bool Room::HandleEnterPlayerLocked(PlayerRef player)
{
WRITE_LOCK;
bool success = EnterPlayer(player);
// 랜덤 위치
player->playerInfo->set_x(Utils::GetRandom(0.f, 500.f));
player->playerInfo->set_y(Utils::GetRandom(0.f, 500.f));
player->playerInfo->set_z(Utils::GetRandom(0.f, 500.f));
player->playerInfo->set_yaw(Utils::GetRandom(0.f, 100.f));
// 입장 사실을 신입 플레이어에게 알린다
{
Protocol::S_ENTER_GAME enterGamePkt;
enterGamePkt.set_succes(success);
Protocol::PlayerInfo* playerInfo = new Protocol::PlayerInfo();
playerInfo->CopyFrom(*player->playerInfo);
enterGamePkt.set_allocated_players(playerInfo);
//enterGamePkt.release_player();
SendBufferRef sendBuffer = ClientPacketHandler::MakeSendBuffer(enterGamePkt);
if (auto session = player->session.lock())
session->Send(sendBuffer);
}
// 입장 사실을 다른 플레이어에게 알린다
// 기존 입장한 플레이어 목록을 신입 플레이어한테 전송해준다
return success;
}
bool Room::EnterPlayer(PlayerRef player)
{
if (_players.find(player->playerInfo->object_id()) != _players.end())
return false;
_players.insert(make_pair(player->playerInfo->object_id(), player));
player->room.store(shared_from_this());
return true;
}
bool Room::HandleLeavePlayerLocked(PlayerRef player)
{
return false;
}
bool Room::LeavePlayer(uint64 objectId)
{
return false;
}
void Room::Broadcast(SendBufferRef sendBuffer, uint64 exceptId)
{
}
Player.h
#pragma once
class gameSession;
class Room;
class Player : public enable_shared_from_this<Player>
{
public:
Player();
virtual ~Player();
public:
Protocol::PlayerInfo* playerInfo;
weak_ptr<gameSession> session;
public:
atomic<weak_ptr<Room>> room;
};
#include "pch.h"
#include "Player.h"
Player::Player()
{
playerInfo = new Protocol::PlayerInfo();
}
Player::~Player()
{
delete playerInfo;
}
그리고 언리얼 엔진에서도 코드를 수정해주자.
UMyGameInstance.cpp 수정
//TEMP : 로비에서 캐릭터 선택창 등
{
Protocol::C_LOGIN Pkt;
SendBufferRef SendBuffer = ServerPacketHandler::MakeSendBuffer(Pkt);
SendPacket(SendBuffer);
}
bool Handle_S_LOGIN(PacketSessionRef& session, Protocol::S_LOGIN& pkt)
{
for (auto& Player : pkt.players())
{
}
for (int32 i = 0; i < pkt.players_size(); i++)
{
const Protocol::PlayerInfo& Player = pkt.players(i);
}
//로비에서 캐릭터 선택해서 인덱스 전송.
Protocol::C_ENTER_GAME EnterGamePkt;
EnterGamePkt.set_playerindex(0);
SEND_PACKET(EnterGamePkt);
return true;
}
bool Handle_S_ENTER_GAME(PacketSessionRef& session, Protocol::S_ENTER_GAME& pkt)
{
UE_LOG(LogTemp, Warning, TEXT("Handle_S_ENTER_GAME"));
return true;
}
당장 오브젝트가 진짜로 스폰되지는 않지만 정상적으로 패킷을 주고받은 것을 알 수 있다.
반응형
'언리얼 엔진 서버 연동' 카테고리의 다른 글
Despawn (0) | 2024.04.08 |
---|---|
Spawn(2) (0) | 2024.04.08 |
protobuf (0) | 2024.04.06 |
패킷 작업(Protobuf) (0) | 2024.04.06 |
PacketHandler (0) | 2024.04.05 |