전체 글 153

앵커와 피봇은 가만히 놔두는 게 좋습니다.

이 게시물을 위해 인벤토리 슬롯 UI를 구현 중에 있었다. 원 프리팹에서는 레벨 표시가 없었기에 텍스트 하나를 추가한 후 앵커 프리셋을 이용해 위치를 조정했다. 그런데 웬 걸 실행해보니 난리 부르스가 났다. 앵커와 피봇을 다시 중앙으로 해놓으니 정상적으로 돌아왔다. 웬만하면 앵커와 피봇은 중앙에 두고서 배치하자...

Study/Unity 2024.10.30

[Unity System Programming Pt.1] 7-8주차 - 유저 인벤토리 구현

개요게임에서 인벤토리는 아이템이 수납되는 장소를 일컫는다.* 이번에는 강의에서 언급된 Scroll View의 한계에 대해서 살펴보고, 간단한 필터와 정렬 기능이 들어간 인벤토리를 구현해보고자 한다. 리소스는 강의에서 제공한 것을 그대로 사용하도록 하고 여기서는 핵심 코드에만 집중하도록 한다.* 인벤토리에 대한 자세한 설명이 필요하다면 나무위키를 참고하기를 바란다.Scroll View의 한계Unity로 채팅창과 같이 스크롤링이 필요한 UI 요소를 구현하고 싶다면 Scroll View를 이용하면 된다. Scroll View에 대한 자세한 설명은 이 영상과 UGUI 매뉴얼로 대신한다. Scroll View에는 2가지 아쉬운 점이 있다. 첫 번째는 최적화다. UGUI는 자동으로 Content의 자식오브젝트를 재..

Study/Unity 2024.10.30

UI 이벤트 메소드를 연결 전에 잘 살펴봐야 하는 이유

버튼 이벤트 메소드를 참조해주고 나니 사소한 컨벤션 오류가 있다는 걸 발견했다. 그래서 OnClickSortButton으로 수정하고 실행했는데 버튼이 동작하지 않았다. 그래서 다시 인스펙터로 살펴보니 아래와 같이 되어 있었다.  인스펙터로 참조를 연결해주면서 MissingReferenceException 은 많이 마주했는데, 메소드에서도 이게 일어날줄은 몰랐다.코드 수정을 좀 더 신중히 해야겠다는 생각이 든다. 만약 여러 군데에 참조를 연결했는데 이름 하나 바꿨다고 그 많은 걸 수정한다 생각하면 끔찍하다.

Study/Unity 2024.10.29

이상한 나라의 소켓 옵션

네트워킹 라이브러리를 제작하면서 이상한 오류를 발견했다. 대기 소켓에서 Accept를 처리하려는데 클라이언트의 주소를 얻어올 수가 없었다. 이를 해결하기 위해 임시로 서버를 만든 후 테스트를 해봤다.int main(){ WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); // 1. IOCP 생성 HANDLE iocpHandle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, NULL); // 2. 대기 소켓을 만들고 IOCP에 등록 SOCKET listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); CreateIoComple..

Study/Game Server 2024.10.25

[Unity System Programming Pt.1] 2주차

개요모든 프로그램에서 데이터는 중요하다. 결국 프로그램은 데이터를 조작하는 것에 불과하기 때문이다. 게임에서 사용하는 데이터는 크게 2가지로 나눌 수 있다. 유저 데이터와 게임 데이터다. 유저 데이터는 게임 설정 값, 인벤토리, 육성하고 있는 캐릭터 등이 되고, 기본 값이 있으며 수시로 저장이 이뤄지는 편이다.* 게임 데이터는 몬스터 정보, 던전 정보, 필드 정보 등이 되고, 데이터 테이블로 관리가 되며 불러오기만 있다. 그리고 유저가 게임에 몰입하기 위해서는 적절한 오디오도 필요하다. 게임에서 사용되는 오디오의 종류는 기본적으로 효과음과 배경음이 있고, 그 외에 게임에 따라 종류가 추가되는 편이다. 이번에는 유저 데이터 관리 모듈, 게임 데이터 관리 모듈, 오디오 관리 모듈 설계를 살펴보고자 한다.* ..

Study/Unity 2024.09.24

게임 서버 라이브러리 제작하기 - 교착 상태 탐지 모듈

개요게임 서버를 구축할 때 멀티스레딩은 필수다. 따라서 자연스럽게 락을 사용하게 되는데, 락을 사용하다보면 교착 상태(Deadlock)를 피할 수 없다. 모든 교착 상태를 미연에 방지할 순 없지만 그래도 개발하면서 발생할 수 있는 교착 상태에 대해서는 탐지할 수 있는 모듈을 개발해보자.교착 상태 탐지 원리교착 상태는 자원의 잠금 순서를 지키지 않았을 때 발생한다. 아래의 코드를 보자.#include #include #include using namespace std;mutex lock1, lock2;int main(){ jthread t1([&] { // while()을 하는 이유는 아래의 코드가 엄청 빨리 끝나기 때문에 // 단발성 실행으로는 교..

Study/Game Server 2024.09.23

[Unity System Programming Pt.1] 1주차

개요제자들과 함께 유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지 학습을 시작했다. Unity 엔진에 관한 지식은 매뉴얼과 유튜브 공식 자료를 통해 습득할 수 있는 반면, 효율적인 아키텍처에 대해서는 늘 고민이 많았기 때문이다.Unit Of Work 패턴을 적용하려고 애쓰던 때가 새록새록하다. 사용하는 Unity 버전은 2022.3.45f1으로 글을 쓰고 있는 현 시점에서 가장 최신 LTS 버전이다. 단, 에디터는 계속 새로운 버전이 나올 때마다 업그레이드 할 예정이다. 스터디와 관련된 정보는 이 저장소에서 확인할 수 있다.씬 설계Unity 프로젝트에서 기능이 부여될 수 있는 객체를 게임오브젝트(GameObject)라 한다. 그리고 이러한 게임오브젝트를 묶는 단위가..

Study/Unity 2024.09.10

90%의 사람들이 인정할 수 없는 한 가지 요약

https://www.youtube.com/watch?v=WQmVncXEkAU&feature=youtu.be 1. 내 감정 상태에 따라 나의 태도가 결정되며, 결국 행동에 영향을 미치게 된다. 2. 감정을 다스리는 것은 집중과 관련이 되어 있는데, 머리가 좋고 잘 배우는 사람은 그만큼 정서가 안정되어 있다고 볼 수 있다. 3. 우리의 뇌는 감정과 인지로 구성되며, 이 두 영역이 균형을 이루도록 해야한다. 이에 무드 미터를 사용할 수 있다.

Diary/Note 2022.08.13

Unity에 싱글톤(Singleton) 패턴 적용하기

개요 싱글톤 패턴은 단일의 인스턴스를 보장하고 이에 대한 전역적인 접근점을 제공하는 패턴이다. 이 글에서는 싱글톤 패턴을 Unity에 어떻게 적용시키는지 살펴본다. 싱글톤 패턴에 대한 상세한 정보가 필요하다면 여기를 참고하라. Unity에서 싱글톤을 적용하는 방법은 MonoBehaviour를 상속 받아서 구현하는 방법과 상속 받지 않고 구현하는 방법으로 나뉜다. 후자는 일반 C#에서의 방법과 크게 다르지 않으므로 여기서는 전자 부분만 살펴보려 한다. 구현 우선 싱글톤 추상 클래스를 만들어 원하는 컴포넌트는 해당 클래스를 상속 받아 싱글톤으로 만드는 구조로 갈 것이다. 그럼 아래와 같이 작성할 수 있다. public class SingletonBehaviour : // Unity의 제어를 받기 위해 Mon..

Study/Unity 2022.07.17

Awake / OnEnable / Start의 차이

개요 초기화를 목적으로 제공되는 Unity 이벤트는 아래와 같이 3가지가 있다. Awake: 이 함수는 항상 Start 함수 전에 호출되며 프리팹이 인스턴스화 된 직후에 호출됩니다. 게임 오브젝트가 시작하는 동안 비활성 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않습니다. OnEnable: (오브젝트가 활성화된 경우에만): 오브젝트 활성화 직후 이 함수를 호출합니다. 레벨이 로드되거나 스크립트 컴포넌트를 포함한 게임 오브젝트가 인스턴스화될 때와 같이 MonoBehaviour를 생성할 때 이렇게 할 수 있습니다. Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다. 하지만, 이 3가지에 대해서 차이점을 모른다면 적절하게 초기화를 못할 수도 있다. 이 글에..

Study/Unity 2022.07.17