"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

2025/02 12

트러블 슈팅 상속으로 인한 프로시저 꼬임

문제 발견 : Player와 상호작용을 할 수 있는 객체들의 부모클래스 InteractObject와 그 자식 클래스 NPC를 작성하는 중 예상과 다르게 런타임에서 infoImage의 SetActive를 변경하는 시점에서 Null ref 에러 발생.문제 분석.   1.  infoImage를 가져오는 메서드 GetComponentInChildren이 호출되는 Awake시작점에 로그작성                     -> Awake 호출됨                   2. GetComponentInChildren 메소드 이후 로그 작성                     -> GetComponentInChildren 호출 안됨,  base.Awake에서 문제발생 확인.                  ..

내일배움캠프 2025.02.20

Unity] LayerMask, Layer, 비트연산

Unity에서 LayerMask는 특정 레이어를 감지하거나 제외하는 기능을 제공하는 중요한 개념이다.이는 충돌 감지(Collision Detection), Raycast 처리, AI 시스템 등에서 자주 사용되며,불필요한 연산을 줄이고 게임의 성능을 최적화하는 데 큰 역할을 한다.LayerMask를 올바르게 활용하려면 **비트 연산(Bitwise Operation)**을 이해하는 것이 중요하다.이 글에서는 LayerMask의 기본 개념부터 비트 연산을 이용한 효율적인 레이어 필터링 방법,그리고 Layer Collision Matrix를 활용한 최적화 방법까지 심층적으로 다뤄보겠다.1. Layer와 LayerMask의 개념Layer(레이어)란?Unity에서는 **최대 32개의 레이어(0~31번까지)**를 사..

객체지향 맥락잡기

1. 절차형 프로그래밍 패러다임의 탄생프로그래밍의 근본을 탐구하면 결국 메모리와 연산으로 귀결되지만, 이 글에서는 절차형 프로그래밍의 핵심 구조인 변수와 프로시저부터 시작하겠다.명령형 프로그래밍 패러다임에는 데이터와 커맨드라는 두 가지 요소가 근본적으로 존재한다. 모든 코드는 데이터이거나 커맨드이다.(물론 더 본질적으로는 다 데이터이지만 넘어가자.) 단순히 데이터를 나열하고 커맨드를 실행하면 프로그램은 동작하지만, 이는 인간이 이해하고 유지하기에는 지나치게 복잡하다.인간의 인지적 한계를 극복하기 위해, 우리는 개념을 도입했다. 데이터를 쉽게 다루기 위해 변수(variable) 를, 커맨드를 쉽게 다루기 위해 프로시저(procedure) 를 정의했다.이제 데이터는 변수를 통해, 커맨드는 프로시저를 통해 다..

[프로그래밍] 자주 쓰는 클래스 개념과 간략한 설명

1. 데이터 및 모델 관련 클래스1-1. Entity – 데이터베이스의 테이블과 매핑되는 도메인 객체1-2. Model – 비즈니스 로직에 맞게 가공된 데이터를 표현하는 객체1-3. DTO (Data Transfer Object) – 계층 간 데이터 교환을 위한 가변(mutable) 객체1-4. VO (Value Object) – 변경 불가능한(immutable) 값 객체, 도메인 로직을 포함할 수도 있음1-5. Repository – 데이터베이스에서 Aggregate 또는 Entity를 조회하고 저장하는 인터페이스1-6. AggregateRoot – DDD에서 Aggregate의 루트 역할을 하며, 자신을 통해서만 내부 엔티티에 접근 가능1-7. State – 상태 패턴에서 객체의 상태를 표현하는 클래..

TIL 250213 팀 프로젝트 아이템 장착 메서드 최적화

오늘은 EquipEquipItem 메서드를 최적화하면서 불필요한 코드 제거, 성능 향상, 가독성 개선을 진행하였다. 기존 코드와 개선된 코드의 차이점을 정리했다. 기존코드public void EquipEquipItem(ref int itemIndex){ if (itemIndex >= 0 && itemIndex  개선 전 코드의 문제점불필요한 인덱스 검증 (itemIndex 범위 체크)기존 코드에서는 itemIndex가 equipItemList의 범위를 벗어나지 않는지 검사하는 코드가 존재하였으나, 메서드를 호출하는 시점에서 이미 유효한 인덱스라는 가정이 가능하다면 이러한 체크는 불필요하다.중복된 isEquipped 상태 체크기존 코드에서는 isEquipped 상태를 별도로 저장하고 조건문에서 여러 번 ..

카테고리 없음 2025.02.13

TIL 240212 매니저 클래스의 싱글톤 패턴 개선

오늘은 싱글톤 패턴을 적용한 매니저 클래스를 더 효율적으로 작성하는 방법을 배웠다. 기존에는 일반적인 정적 프로퍼티 방식으로 싱글톤 패턴을 구현했지만, 이를 Lazy를 활용하여 보다 성능적으로 개선할 수 있음을 알게 되었다.기존 코드 (일반적인 싱글톤 패턴)기존에는 다음과 같은 방식으로 싱글톤 패턴을 적용한 매니저 클래스를 작성하였다.class GameManager{ public static GameManager Instance { get; } = new GameManager();}이 방식은 객체를 정적으로 생성하여 Instance 프로퍼티를 통해 접근할 수 있도록 한다.하지만 이 방식에는 몇 가지 문제점이 존재한다.즉시 초기화(Eager Initialization)GameManager 클래스가 참..

내일배움캠프 2025.02.12

Console.Clear()과 화면 깜빡임 문제 해결

1. Console.Clear()를 사용하면 화면이 깜빡이는 이유C# 콘솔 애플리케이션을 개발할 때 Console.Clear()를 사용하여 화면을 새로 고칠 수 있다. 그러나 **사용자의 입력을 받아 화면을 지속적으로 갱신해야 하는 프로그램(예: 메뉴, 게임, UI 갱신)**에서 Console.Clear()를 반복적으로 호출하면 심각한 깜빡임 문제가 발생할 수 있다.그 이유는 다음과 같다:전체 화면을 삭제 후 다시 출력Console.Clear()는 콘솔의 모든 내용을 지운 후 다시 그리기 때문에, 순간적으로 화면이 비어 보인다.이는 프레임이 새로 그려지는 과정에서 "깜빡이는" 효과를 유발한다.비효율적인 렌더링 방식기존 UI를 단순히 업데이트하는 것이 아니라, 모든 요소를 처음부터 다시 출력하므로 불필요한..

게임 개발의 가장 큰 맥락

게임 개발의 가장 큰 맥락게임은 복잡하다. 영화같기도, 스포츠같기도, 세계같기도, 철학같기도 하다. 게임을 개발하며 무엇에 기준을 두고 어떠한 자원을 투입하느냐에 따라 상황에 맞는 프로젝트도 상황에 맞지 않는 프로젝트도 된다. 또한 각각의 개발 요소는 복잡하게 얽혀 손쉽게 말하기 어렵다. 그러나 아주 간단하게 일반화하고자 한다.1. 게임의 핵심: 세계관, 콘텐츠, 플레이, 기능구현게임 개발은 네 가지 주요 요소로 요약할 수 있다. 세계관, 콘텐츠, 플레이,기능구현이다. 이들 요소는 상호의존적이며, 각 요소가 게임의 전반적인 방향성을 결정한다.세계관은 게임의 배경이자 스토리를 결정짓는다. 영화 같은 게임은 세계관과 컨텐츠가 중심이다. 이러한 접근은 플레이어가 몰입할 수 있는 서사적 요소와 감정적 유대감을 ..

TextRPG의 필수기능 기본 구조 및 분석

TextRPG의 기본 구조 및 분석1. 개요C# 콘솔 환경에서 TextRPG를 구현하기 위해, 모듈화된 구조를 설계하였다. 이 구조는 게임매니저(GameManager), 배틀매니저(BattleManager), 그리고 **유틸리티 모듈(Utility Module)**로 구분된다. 이를 통해 게임의 흐름을 명확히 정의하고 유지보수성을 높이는 것이 목표이다.2. 구조 설명(1) 게임 매니저게임의 전반적인 흐름을 관리하는 중심적인 클래스이다. 주요 구성 요소는 다음과 같다:메인화면: 게임의 시작 화면으로, 상태보기 및 전투 화면으로 이동하는 역할을 한다.상태보기: 캐릭터 정보를 확인할 수 있는 메뉴이다.게임로직: 게임의 전반적인 데이터 및 규칙을 관리하는 모듈이다.캐릭터: 플레이어 캐릭터의 상태와 관련된 데이터..

내일배움캠프 2025.02.06

TIL 0205 TextRPG 의존성 주입

Today I Learn:TextRPG GameManager 의존성 주입을 통한 구조 개선1. 문제게임 개발 중 GameManager.I()를 여러 번 호출하면서 코드의 결합도가 높아지고, 유지보수성이 낮아지는 문제가 발생했다. GameManager는 싱글톤 패턴을 사용하고 있지만, 여러 클래스에서 직접 참조하면서 코드의 가독성이 떨어지고, 변경 시 수정해야 할 부분이 많아지는 문제가 있었다.2. 시도해본 것GameManager.I()를 줄이기 위해 **의존성 주입(DI, Dependency Injection)**을 고려했다.기존의 정적(static) 방식에서 생성자 주입(Constructor Injection) 방식을 적용하여 GameManager의 인스턴스를 필요한 클래스에 전달하도록 시도했다.Vie..

내일배움캠프 2025.02.05