Unity Network : Photon Pun 2 - Lobby / Room
·
Unity
Photon PUN2 : Lobby / Room Photon 네트워크의 전체 흐름 요약Photon PUN2에서 클라이언트는 다음과 같은 흐름으로 네트워크에 참여한다.Photon Server Connect → Lobby → Room → InGameLobby: 방 목록을 조회하고, 방을 고르는 대기 공간Room: 실제로 플레이어들이 모여 동기화된 게임을 진행하는 공간LobbyLobby는 말 그대로 방 목록을 관리하는 대기 공간이다.현재 열려 있는 Room 목록을 서버로부터 전달받는다플레이어는 여기서새로운 Room을 생성하거나기존 Room에 참가한다Lobby에 들어갔다고 해서 다른 플레이어와 동기화가 되는 것은 아니다.Lobby는 매칭을 위한 공간일 뿐이다.동기화X 없음게임 로직X 실행 불가Room 목록O 조..
Unity : Photon PUN2, Voice 2 로 실시간 멀티 플레이, 음성채팅 적용하기
·
카테고리 없음
Photon PUN2 와 Voice2로 멀티플레이, 음성채팅을 적용하기 위한 유닛 테스트다.거두 절미하고 과정을 빠르게 설명 Asset Store 에서 Photon PUN 2, Photon Voice 2 Free 버전을 다운 받는다.유니티 공식 에셋 스토어에서 검색해서 다운 받으면 된다. Photon 프로젝트 및 AppId 설정https://dashboard.photonengine.com/ko-kr해당 사이트에 접속해 회원가입 / 로그인 진행Dashboard (관리화면) 으로 이동새 어플리케이션 만들기로 Voice와 Pun을 생성해준다. 각각 창에 보이는 AppID를 사용해야한다. 유니티에서 세팅유니티 프로젝트에서 두 에셋을 다운로드 후 임포트 한다.Window 탭에 있는 Photon Unity Netw..
Unity UI: 코드로 레이아웃 제어 vs 프리팹 기반 구성
·
Unity
Unity를 통해 채팅창 UI를 작업하던 중, 기존 구조에서 날짜 텍스트를 추가하는 작업에서 발생한 사례다.“채팅 버블 + 타임스탬프 + 날짜 구분선”을 추가하면서, 동적 생성(코드) 중심 구조를 프리팹/레이아웃 중심 구조로 정리했다.결과적으로 기능은 동일하지만, 프레임 안정성(레이아웃 리빌드 빈도)과 유지보수 비용에서 차이가 난다. 배경: 문제 지점은 “레이아웃”이 아니라 “리빌드 빈도”UGUI는 레이아웃/그래픽 갱신을 프레임 말미에 모아서 처리한다.필요할 때 Canvas.ForceUpdateCanvases()를 호출하면 즉시 갱신할 수 있지만, 이는 모든 Canvas의 레이아웃 및 콘텐츠 생성 계산을 강제로 수행한다.반복 호출하면 성능에 직격탄이 된다. 또한 Layout Group / Content ..
네트워크 : OSI, TCP/IP, Client-Server, P2P
·
Unity
OSI 7계층OSI 7계층은 네트워크를 역할별로 나눈 개념적 모델이다.실제로는 TCP/IP 기반을 많이 사용하지만, 문제 발생시 어디 계층의 문제인지 나눠서 판단하기에 유용하다. 7Application게임 로직 메시지 (로그인, 이동, 공격, 채팅)6Presentation직렬화/역직렬화 (JSON, Protobuf, BitStream)5Session세션 유지, 재접속, 룸 개념4TransportTCP / UDP 선택3NetworkIP 기반 라우팅 (보통 의식할 일 거의 없음)2Data LinkNIC, LAN 환경1Physical케이블, 무선 신호1계층 : 물리 계층 (Physical Layer)네트워크 데이터가 전기적, 전자적 연결에 의해 전송되는 물리적 계층0과 1의 on off의 디지털 데이터를 전송..
길찾기 알고리즘 : 다익스트라(Dijkstra) 와 에이스타(A*)
·
Unity
다익스트라 알고리즘 (Dijkstra)시작점에서 각 노드가지의 최소 비용을 계싼하는 알고리즘이다.각 노드를 탐색하며, 해당 지점까지 온 비용(g)이 가장 작은 노드부터 탐색한다.그러므로 목표까지 가까워 보이는 방향을 추정하지 않고, 그저 현재까지 누적된 비용이 가장 작은 노드만을 기준으로 탐색한다. 위 이미지는 다익스트라가 길을 찾는 방식이다.가까운 곳에 목표가 있음에도 원형으로 퍼져나가며 경로를 찾는 비효율적인 모습을 보인다. 다익스트라를 코드로 구현하면 다음과 같다. using System.Collections.Generic;using UnityEngine;class DijkstraNode{ public int Index; // ABCD, 0123 번호 public Ve..
Unity - 데이터 저장 방식 : PlayerPrefs, JSON, CSV, ScriptableObject
·
Unity
PlayerPrefsUnity가 기본 제공하는 가장 간단한 로컬 저장 방식으로 소규모 설정값 등을 간단하게 저장하기에 좋다.OS별 레지스트리 또는 설정 파일에 저장되며 파일 기반이 아니기에 가볍다.하지만 암호화되지 않아 치트나 메모리 변조에 취약하다.영구 저장이 가능하긴 하지만 대량 데이터에는 부적합하고 불편하다.또한 이전에는 옵션값 등을 주로 썼지만, 요즘에는 옵션값을 로컬 환경이 아닌 계정 귀속으로 설정하는 경우가 많기에 이것도 조금 애매해졌다... 기본 사용법은 아래와 같다.using UnityEngine;using UnityEngine.InputSystem;public class SaveTest : MonoBehaviour{ public float playerHealth = 100; v..
Unity - Object Pool Pattern : 오브젝트 풀
·
Unity
Object Pool Pattern : 오브젝트 풀오브젝트 풀은 쉽게 말해 한 번 생성한 객체를 재사용하는 설계 패턴이다. 유니티의 Object들은 기본적으로 Transform 을 포함한 여러 컴포넌트들을 보유하고 있어 생성시에 약간의 부하가 있다.또한 오브젝트가 파괴 될 때도 GC(Garbage Collector) 에 의한 부하가 발생하여, 많은 수의 오브젝트가 생성 및 파괴가 발생하면서 성능 저하를 유발할 수 있다. 이것을 방지할 수 있는 것이 바로 오브젝트 풀이다.생성 / 파괴가 아닌 활성 / 비활성화 과정을 통해 한번 생성한 오브젝트를 재활용하여 이러한 부하를 줄여주는 기법이다. 동작 원리는 매우 간단하다.초기화 : 풀을 초기화 혹은 초기 풀 사이즈에 맞게 미리 생성할당 : 풀에서 꺼내 사용반납 ..
Unity - FSM : Finite State Machine - 유한 상태 머신
·
Unity
FSM : Finite State Machine - 유한 상태 머신오브젝트가 여러 상태 중 하나의 상태만 활성화된 상태로 존재하며, 특정 조건이 만족될 때 다른 상태로 전이하는 구조다.캐릭터의 걷기, 뛰기, 공격 등 상태 단위로 정의하고, 그 상태에 따라 애니메이션을 재생하는 기능을 예시로 들 수 있다.게임을 만들 때 현재 게임의 Playing, Paused, GameOver 등의 상태를 관리하는 것 또한 FSM이라 볼 수 있다. 이러한 FSM은 행동 단위로 분할된 구조 덕분에 구현 및 유지 보수에 강점을 갖는다. 구성 요소State (상태)시스템이 가질 수 있는 유한한 상태 (Idle, Move, Attack 등)Transition (전이)상태 간 이동을 결정하는 조건 또는 이벤트Event / Inpu..
Unity - 6000.2.10f1 - InputSystem 버그
·
Unity
버그상황 재현유니티의 new Input System을 통해 다양한 액션을 정의할 수 있다. Player 오브젝트에 Player Input을 넣고, 원하는 액션맵이 정의돼있는 inputactions 파일을 Actions에 등록해서 사용할 수 있다.별도로 설정하지 않았다면 최초에 생성되는 전역 액션인 InputSystem_Actions가 자동으로 들어가있을 것이다. Action Maps에 Player의 이동에 쓰일 Move와 Rotate를 정의해두었다.(Actions 탭 하단에 보이는 두 CamActive Actions는 본래 Camera Action Maps에 있던 액션들이다.) 우선 Player의 이동 스크립트를 아래와 같이 작성했다.using UnityEngine;using UnityEngine.I..
C# - 델리게이트(Delegae). 람다식과 캡쳐, 클로져 문제 (feat. useState)
·
C#
사전 지식델리게이트(Delegate) : 함수를 변수처럼 저장하고 실행할 수 있는 타입.void PrintHello() => Console.WriteLine("Hello");void PrintBye() => Console.WriteLine("Bye");Action printer = PrintHello; // 함수 참조를 저장printer(); // Helloprinter = PrintBye; printer(); // Bye 람다식(Lambda Expression) : 화살표 함수, 익명 함수 등으로 불리는 간단한 표현 문법.Func square = (x) => x * x;Console.WriteLine(square(5)); // 25 캡쳐 (Capture)람다식이 외부 스코프의 변수를 참조할 때, 그 변..