Unity : 마샬링(Marshalling) 과 메모리 풀링(Memory Pooling)
·
Unity
마샬링(Marshalling) 이란? C#과 같은 Managed 환경은 가비지 컬렉터(GC)가 메모리를 관리하며, 데이터가 메모리에 배치되는 방식의 런타임에 의해 유동적으로 결정될 수 있다. 반면 C/C++ 같은 Unmanaged 환경은 개발자가 직접 메모리를 제어하며, 메모리 레이아웃이 고정되어 있다. 이런 서로 다른 두 환경에서 데이터를 교환하려면 번역 과정이 필요하게 된다.예를 들어 C#의 string 타입은 내부적으로 UTF-16 인코딩을 사용하는 객체지만, C++ 에서는 const char* (UTF-8 또는 ASCII) 형태의 포인터 배열로 돼있다.이때 C#의 문자열을 C++이 이해할 수 있는 메모리 구조로 복사하고 변환해 주는 작업이 마샬링이다. Blittable 타입과 Non-Blittab..
Unity : C#과 Unity에서의 암묵적 Boolean 값 변환 => if (gameObject) 가능??
·
Unity
JS, Phyton 같은 타 언어에서는 암묵적 Bool 변환을 지원한다.if 조건문에 넣은 값에 따라 true나 false로 평가되는 방식으로 말이다. 하지만 C#은 엄격한 타입 안정성을 지향하기에 반드시 명시적으로 bool 타입을 사용하지 않으면 컴파일 에러가 발생한다. 하지만 Unity 환경에서는 특이하게도 if (gameObject) 나 if (transform) 과 같이 객체 자체를 조건문에 넣어도 정상 작동이 되는 것을 볼 수 있다.위에서 말한 C#의 기본적인 정책과 상충하는 것으로 보이는 이 현상에 대해 간략하게 정리해보자. Unity 에서의 내부 구현C# 언어 자체에서는 지원하지 않는 문법을 유니티가 쓸 수 있는 이유는, C#의 연산자 오버로딩(Operator Overloading)을 활용..
Unity : 같은 PC에서 클라이언트 여러개 실행시 멈추는 현상 (Firestore)
·
Unity
현상Unity 프로젝트에서 Firebase Cloud Firestore를 사용할 때, 한 컴퓨터에서 클라이언트를 여러개 동시에 실행하면 완전히 멈춰버리거나 크래시가 발생하는 문제가 있었다. 원인 분석사실 크게 기술적인 원인 분석을 한 부분은 없었다.그런데도 왜 Firestore 라고 확신했냐면, Firebase Auth 도입 직후까지는 정상적으로 멀티 클라이언트 실행이 가능했던 프로젝트가 Firestore 도입 시점부터 바로 이런 현상이 발생했기 때문이다...물리적으로 다른 원인이 있을 수 없었다. 하지만 Firestore가 원인이라고 해도 이해가 가질 않았다.웹 에서 Firestore를 사용했던 경험으로는 하나의 컴퓨터에서 여러개의 브라우저, 여러개의 계정을 통해 Firestore에 아무리 접근해도 ..
Unity : 관리자 콘솔 구현 및 프리징 현상 개선
·
Unity
Unity DevConsole 프리징 개선 기록 : 반복 에러 콜랩스 + Flush 예산화 1) DevConsole의 기존 작동방식과 핵심 기술 이 DevConsole은 유니티 로그를 받아서 콘솔 UI에 텍스트로 뿌리는 구조다.핵심 흐름은 아래와 같았다.Application.logMessageReceivedThreaded 콜백으로 로그를 수신한다.유니티는 싱글쓰레드이기에 백그라운드 상의 멀티 쓰레드의 로그를 모두 수집하면 데드락 위험이 있어 lock 키워드를 통해 pending 버퍼에 로그를 쌓는 방식으로 데드락을 방지했다.콘솔이 열리면 버퍼에 쌓인 로그를 실제 콘솔 UI에 출력하는 lines 리스트에 옮긴다.lines 전체를 StringBuilder에 합쳐서 출력한다.추가로, “연속 중복(바로 직전 로..
Unity : Firebase 등록 및 Auth로 (이메일/소셜) 로그인 구현
·
Unity
Firebase애플리케이션 개발 시 백엔드 인프라 구축의 번거로움을 최소화하는 BaaS(Backend as a Service) 플랫폼이다.서버 코드 작성 및 인프라 관리 부담을 줄여 개발 효율성을 극대화하는 것을 목적으로 한다.즉, 우리는 Firebase를 이용해 간단한 인증부터 DB, API까지 여러 방면으로 서버 개발 없이 빠르게 활용할 수 있다. Firebase 등록 방법1. Firebase 검색 후 Firebase - Google 페이지로 들어간다2. Get started in console 3. 새 Firebase 프로젝트 만들기 클릭해서 프로젝트 만들기 4. 프로젝트 생성 프로젝트 이름을 지정하고 그 뒤에 Gemini 애널리틱스 사용 여부를 묻는데 그냥 둘다 사용 안 해도 된다.애널리틱스는 서..
Unity Network : Photon Pun2 - PhotonView, IPunObservable, RPC
·
Unity
PhotonViewPhoton 네트워크에서 동기화 단위의 기준점네트워크 상에서 하나의 오브젝트를 식별하는 IDRPC, 변수 동기화, Ownership 판단의 기준PhotonView가 없는 오브젝트는 네트워크에 존재하지 않는다역할설명네트워크 IDViewID로 객체 식별소유권 관리Owner / IsMineRPC 송신View 기준 호출변수 동기화Observe 대상 지정 PhotonView pv;pv.IsMine // 내가 소유한 오브젝트인가pv.Owner // 소유 Playerpv.Owner.ActorNumber // pv의 인덱스처럼 1000씩 증가하는 고유 값pv.ViewID // 네트워크 고유 IDpv.RPC(함수명, RpcTarget.Others, 함수 파라미터); IPunObserv..
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..
네트워크 : 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..