JS/TIL(Today I Learned)113 2025-02-25 <최종 프로젝트 D-17> 내일배움캠프 Node.js 트랙 81일차C#에서 Json 파일 사용하기최종 프로젝트가 진행됨에 따라, 서버와 클라이언트가 동일한 데이터를 공유할 필요성이 생겨났다. Json 파일을 이용하기로 했고, 이를 위한 라이브러리를 찾게 되었다. 물론 깡으로 함수를 만들 수도 있겠지만 C#은 내 주력 언어가 아닌데다가 시간 관계 상 함수를 새로 만드는 건 비효율적이었다.C#과 유니티 환경을 고려했을 때, 우리가 선택하게 된 라이브러리는 NewtonSoft.Json이었다. 참고 링크 : Read and parse a Json File in C# - Stack Overflow Read and parse a Json File in C#How does one read a very large JSON file into an.. JS/TIL(Today I Learned) 2025. 2. 25. 2025-02-24 <최종프로젝트 D-18> 채팅 기능 업그레이드 구현 목적기존에도 채팅 기능은 있었다.하지만 파티 시스템이 도입되면서 파티원들과 따로 메시지를 주고받는 기능이 필요했다.따라서 기존 기능을 개선 및 보완하기로 결정했다.가장 많은 영감을 받은 건 롤과 로스트 아크의 채팅 기능.드롭다운으로 채팅 대상을 설정했고, 채팅 메시지 출력을 롤과 비슷하게 구현해봤다.패킷 구조함수 구현클라이언트public void PushMessage(string nickName, string msg, string chatType, bool myChat){ if (!isOpen) { alarm.gameObject.SetActive(true); alarm.DOShakePosition(1f, 10); .. JS/TIL(Today I Learned) 2025. 2. 24. 2025-02-21 <최종 프로젝트 D-21> 파티장 위임 기능파티장이 탈퇴를 한 경우 다른 멤버에게 파티장 권한이 위임됩니다.// leavePartyHandler 함수의 일부분// 떠난 멤버가 파티장이면 파티장 교체const partyLeader = party.getPartyLeader();if (member[1] === partyLeader) { // party클래스에서 파티장 교체 const memberIds = party.getAllMemberIds(); if (memberIds.length > 0) { const newLeaderId = memberIds[0]; const newLeaderSocket = party.getSocketById(newLeaderId); if (newLeader.. JS/TIL(Today I Learned) 2025. 2. 21. 2025-02-20 <TCP와 UDP> TCP와 UDP전송계층이란?- 네트워크 계층과 응용 계층 사이에 존재하는 통신 계층.- 네트워크 계층의 프로토콜이 가지고 있던 약점을 보완.- 응용계층의 하위 계층으로서 그 기반 역할을 수행. 전송계층의 필요성IP는 호스트에서 호스트까지 패킷을 전송은 하지만, 특정 어플리케이션에 패킷이 전송 되었는지는 보장하지 않습니다. 중간에 패킷이 손실되거나 잘못 전송되어도 이를 확인하거나 복구할 기능이 포함되어 있지 않습니다. 물론 이런 방식이 마냥 나쁜 것만은 아닙니다. 동영상 스트리밍처럼 때론 신뢰성보다도 속도가 더 중요할 때도 있기 때문입니다. 따라서 IP의 상위 계층인 전송 계층에서는 두 가지 종류의 통신을 지원하는데요. 하나는 TCP 통신이고, 또 하나는 UDP 통신입니다. TCP는 신뢰할 수 있는 통신.. JS/TIL(Today I Learned) 2025. 2. 20. 2025-02-19 <최종프로젝트 D-23> 구현 결과 미리보기 파티 수락 패킷 추가 서버 코드파티 생성파티 인스턴스 생성해서 플레이어에게 응답 패킷 전송const partySession = getPartySessions();const party = partySession.addParty(socket, player);party.setPartyLeader(player);const packet = Packet.S2CCreateParty( party.getId(), party.getPartyLeaderId(), party.getMemberCount(), party.getAllMemberCardInfo(player.id),);// 파티 세션에 브로드캐스트party.notify(packet);파티 초대닉네임으로 접속 중인 유저를 찾고,.. JS/TIL(Today I Learned) 2025. 2. 19. 2025-02-18 <최종 프로젝트 D-24> 내일배움캠프 Node.js 트랙 76일차파티창 UI 제작하기구현을 위한 의사 코드는 이전 게시물 참조public void UpdateUI(){ // 현재 파티 정보 가져오기 Party party = Party.instance; if (isInParty) { noPartyPanel.SetActive(false); inPartyPanel.SetActive(true); Button invitePartyButton = inPartyPanel.transform.Find("InvitePartyBtn").GetComponent(); invitePartyButton.onClick.RemoveAllListeners(); invitePar.. JS/TIL(Today I Learned) 2025. 2. 18. 2025-02-17 서버 로직 흐름파티 생성(1) 클라이언트에서 파티 생성 버튼을 누른다. 서버는 C_CreateParty 패킷을 수신. new party(socket, player)로 파티 인스턴스를 생성한다. PartySession.addParty(party)로 파티 세션에 파티 인스턴스를 추가한다. (2) 파티 생성 메시지와 현재 파티 구성을 응답 패킷으로 전송 => 클라이언트 UI에 반영파티 초대 (1) 클라이언트에서 파티 초대 버튼을 누른다. 상대방 닉네임 입력.(2) 닉네임을 통해 응답 패킷 전송(상대방 화면에 초대 알림창이 뜨고 파티에 대한 간략한 정보가 뜬다.)파티 초대 수락/거절(1) 클라이언트에서 수락/거절 버튼 누르기.(2) 수락이면 joinParty 패킷 수신. party 정원이 남았는지 확인. par.. JS/TIL(Today I Learned) 2025. 2. 17. 2025-02-14 <최종 프로젝트 D-28> NavMeshLoader 구현 구현 목적클라이언트와 동일한 NavMesh 데이터를 서버도 보유하기 위함동일한 NavMesh 데이터를 기반으로 플레이어의 이동 경로를 도출하기 위함클라이언트 오브젝트가 NavMesh의 알고리즘에 의해 이동할 때, 매 10프레임마다 좌표를 검증하기 위함구현 방법obj 파일이란?3차원 데이터를 기반으로 ASCII 형식으로 저장한 파일 포맷 중 하나이다. 각 정점의 위치와 각 텍스처 좌표 정점의 UV 위치, 정점 노멀, 그리고 각 다각형을 구성하는 정점 목록 및 텍스처 정점으로 정의된 면을 포함한다. 쉽게 말해 3D 데이터를 간단하게 표현한 형식이라고 보면 된다.따라서 NavMesh로 베이크한 데이터도 obj로 export가 가능하다. 유니티 상에서 export하기 위해 유니티 커뮤니티를 찾아보았다. 참고한 .. JS/TIL(Today I Learned) 2025. 2. 14. 2025-02-13 <최종 프로젝트 D-29> 이동동기화 핸들러 클라이언트에 적용하기 마을에 입장하자마자 이동할 때(첫 클릭) 왠지는 모르겠는데 폴리곤을 찾아내지 못한다. 분명 같은 NavMesh 데이터를 가지고 있을 텐데 어떻게 가능한 걸까? 디버그 터미널을 실행시켜보았다. 가장 처음 움직일 때 end 포인트(클라이언트에서 클릭한 지점)의 값이 어째선지 (0, 0, 0)으로 들어오는 중이다.두번째 이동 지점을 클릭했을 때 보다시피 제대로된 값이 들어온다. 클라이언트로부터 수신받는 첫 좌표가 잘못 된 게 확실하기 때문에 클라이언트에서 로직을 다시 살펴보았다.// 왼쪽 마우스 버튼을 눌렀을 때 (Input.GetMouseButtonDown(0))// UI 요소를 클릭하지 않았을 경우만 실행 (!eSystem.IsPointerOverGameObject())// 마우스 위치에서 3D 광선(.. JS/TIL(Today I Learned) 2025. 2. 13. 2025-02-12 <최종 프로젝트 D-30> 이동 동기화 구현 방안 (1) C_Move와 S_Move에서는 경로에 대한 검증을 하고 클라에선 navMesh 기반으로 움직인다. socket별로 path를 저장(가장 최신버전으로 timestamp도 저장) => Path ID를 생성하고 이를 공유하여 같은 경로를 여러 클라이언트가 재사용할 수 있도록 한다.(2) C_Location과 S_Location에서는 실시간 위치 검증을 한다.(속도가 같고 같은 경로로 이동한다면 좌표도 같아야 한다. 이동 알고리즘은 navMesh로 도출할 수 있을 것이다.) 이때 오차 범위를 루트2로 설정. 범위를 넘어가면 클라이언트의 위치 및 상태(hp, mp 등…)를 다시 동기화=> 클라이언트의 NavMesh 경로를 사용하고, 서버는 생성된 path로 검증, 중간에 범위 내에.. JS/TIL(Today I Learned) 2025. 2. 12. 2025-02-11 <최종 프로젝트 D-31> ❗코드 예제는 chatGPT의 도움을 받았습니다. 따라서 실제 구현과 괴리가 있을 수 있습니다. 사용할 모듈에 관해 충분히 공부를 마친 뒤 적절한 코드로 교체하도록 하겠습니다. 따라서, 이 페이지에서는 “게임 구현 방법론”에 초점을 맞추도록 하겠습니다.서버 디자인임태현, 게임 서버 디자인 가이드, NDC2013 | PPT 작은 규모의 게임 서버이므로, 접속자가 많을수록 동기화에 의한 부하가 막심해진다.=> 게임 채널을 분리한다면?(채널 : 메이플스토리, 와우, 로스트아크)=> 게임 룸을 만든다면?(디아블로, 딥락갤)=> 지역을 조각낸다.(클러스터링) → 그렇지만 마을이 그렇게 크지 않아서 문제…. 천 명을 넣어도 좁은 탓에 천명의 채팅을 모두 브로드캐스팅할 수밖에 없다. 파티 시스템을 고려한다면 게임 룸.. JS/TIL(Today I Learned) 2025. 2. 11. 2025-02-10 <최종 프로젝트 D-32> 출처Multiplayer Game Sync Techniques through CAP theorem | PPT Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem - Download as a PDF or view online for freewww.slideshare.netMMOG Server-Side 충돌 및 이동처리 설계와 구현 | PPT MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현 - Download as a PDF or view online for freewww.slideshare.net JS/TIL(Today I Learned) 2025. 2. 10. 이전 1 2 3 4 5 ··· 10 다음