유니티 연동 #3

Eunho Bae·2022년 5월 16일
0

설명

xml 정의

<PDL>
	<packet name="S_BroadcastEnterGame">
		<int name="playerId"/>
		<float name="posX"/>
		<float name="posY"/>
		<float name="posZ"/>
	</packet>

	<packet name="C_LeaveGame">
		
	</packet>

	<packet name="S_BroadcastLeaveGame">
		<int name="playerId"/>
	</packet>

	<packet name="S_PlayerList">
		<list name="player">
			<bool name="isSelf"/>
			<int name="playerId"/>
			<float name="posX"/>
			<float name="posY"/>
			<float name="posZ"/>
		</list>
	</packet>

	<packet name="C_Move">
		<float name="posX"/>
		<float name="posY"/>
		<float name="posZ"/>
	</packet>
  	<packet name="S_BroadcastMove">
		<int name="playerId"/>
		<float name="posX"/>
		<float name="posY"/>
		<float name="posZ"/>
	</packet>
</PDL>

S_BroadcastEnterGame

서버측에서 해당 플레이어가 들어오면 주변 모든 플레이어들에게 전송할 목적인 패킷

C_LeaveGame

해당 플레이어가 떠날때 클라이언트 쪽에서 떠남을 알리는 패킷

S_BroadcastLeaveGame

어떤 유저가 떠났는지 주변 유저들에게 뿌리는 목적인 패킷

S_PlayerList

해당 유저에게 주변에 어떤 유저들이 있는지 알려주기 위한 패킷.

C_Move

해당 유저가 이동할 때 어디로 갈 것인지 좌표가 들어있는 패킷. 참고로 playerId가 없는 이유는 패킷을 전송할 때 어떤 세션에서 전송되었는지 정보가 같이 포함이 되는데 ClientSession에 자신의 playerId가 포함되어 있기 때문에 굳이 넣어주지 않아도 된다.

S_BroadcastMove

마찬가지로 이동할때 주변 유저들에게 알리는 용도

플레이어가 입장할때

public void Enter(ClientSession session)
		{
			_sessions.Add(session);
			session.Room = this;

			S_PlayerList players = new S_PlayerList();
			foreach(ClientSession s in _sessions)
            {
				players.players.Add(new S_PlayerList.Player() {
					isSelf = (s == session),
					playerId = s.SessionId,
					posX = s.PosX,
					posY = s.PosY,
					posZ = s.PosZ,
                });
            }
			session.Send(players.Write());

			S_BroadcastEnterGame enter = new S_BroadcastEnterGame();
			enter.playerId = session.SessionId;
			enter.posX = 0;
			enter.posY = 0;
			enter.posZ = 0;
			Broadcast(enter.Write());
		}

자기 자신을 포함한 세션에 추가된 모든 유저(ClientSession에 playerId와 좌표가 존재)를 돌면서 새로 만든 S_PlayerList 패킷에 담은 다음, 자기 자신(session 변수)에 Send하는 코드이다. 입장할때 주변 유저들에게 알리기 위한 목적으로 만든 패킷에 자신의 아이디와 (0,0,0) 좌표를 담고 Broadcast해주면 JobTimer에서 설정한 0.25초마다 한번씩 브로드캐스팅 해줄 것이다.

플레이어 이동

이번시간에는 테스트만 할 것이기 때문에 플레이어 이동은 좌표를 랜덤한 값으로 넣어주고, 서버에 올리는 것까지만 한다.
다음과 같이 SessionManager에서 정의하면 DummyClient의 Program 클래스의 Main함수에서 0.25초마다 SendForEach 함수를 실행시켜주는데 그때마다 이동패킷을 만들고 서버로 보내는 것까지 구현했다.

Random _rand = new Random();

		public void SendForEach()
		{
			lock (_lock)
			{
				foreach (ServerSession session in _sessions)
				{
					C_Move movePacket = new C_Move();
					movePacket.posX = _rand.Next(-50, 50);
					movePacket.posY = 0;
					movePacket.posZ = _rand.Next(-50, 50);
					
					session.Send(movePacket.Write());
				}
			}
		}

추가 내용

  • MMO에서는 유저가 접속하자마자 바로 Room에 넣어주는 것이 아니라 클라이언트 쪽에 접속 신호를 보내면 클라이언트가 모든 리소스를 로딩한 후 OK 패킷을 보내면 그제서야 룸에 입장시켜주는 식으로 동작한다.
  • 또 플레이어가 어떤 룸(세션)에 들어가면 주변에 있는 모든 유저들에게 해당 플레이어가 들어왔다는 것을 알려줘야 하고, 해당 플레이어한테도 주변 플레이어 목록을 전송시켜줘야 화면에 보이게 된다.
  • 패킷을 정의할 때 플레이어 위치좌표는 float로 각각 지정해줘도 되지만 vector3으로 처리하도록 만들어줘도 된다.
  • 나중에 규모가 켜지면 Player 클래스를 하나 만들고, 자신이 어느 세션에 연결되어 있는지 멤버로 정의해주면 된다. 해당 강의에선 간단하게 하기 위해 좌표 정보를 ClientSession에 넣어주었다.
profile
개인 공부 정리

0개의 댓글

관련 채용 정보