728x90

전체 글 146

[Unity] 나만의 확장 메서드 모음 ver.2 — Shuffle (피셔-예이츠 셔플)

프로젝트에서 자주 쓰이는 코드들을 확장 메서드로 하나씩 정리하는 글입니다. ver.2에서는 배열이나 리스트를 편향 없이 무작위로 섞는 Shuffle() 확장 메서드를 소개하겠습니다.1. Shuffle이 필요한 이유게임 개발에서 리스트나 배열을 무작위로 섞어야 하는 상황은 자주 발생합니다. 카드 게임의 덱 셔플, 퀴즈 문제의 랜덤 출제, 아이템 드롭 순서 무작위화, 스폰 위치 랜덤 배치 등 다양한 곳에서 필요합니다.흔히 사용하는 방식의 문제점셔플을 직접 구현할 때 가장 흔하게 보이는 방식은 OrderBy와 Random을 조합하는 것입니다.// LINQ를 이용한 셔플 - 간단하지만 문제가 있음using System.Linq;List shuffled = myList.OrderBy(x => Random.Rang..

Unity/코드 연구 2026.04.11

[Unity] 나만의 유틸리티 함수 모음 ver.1 — WaitSeconds (코루틴 대기 캐싱)

프로젝트에서 자주 쓰이는 헬퍼 함수를 하나씩 정리하는 시리즈입니다.ver.1에서는 코루틴에서 자주 사용하는 WaitForSeconds 객체를 캐싱하여 재사용하는 WaitSeconds() 메서드를 소개하겠습니다.1. WaitSeconds가 필요한 이유기존 방식의 문제점IEnumerator AttackRoutine(){ while (true) { Attack(); yield return new WaitForSeconds(1.5f); // 매 호출마다 새 객체 생성 }}이 코드는 동작에는 문제가 없지만 yield return new WaitForSeconds(1.5f)가 호출될 때마다 새로운 WaitForSeconds 객체를 생성합니다.WaitForSeconds는 클..

Unity/코드 연구 2026.04.11

[Unity] 나만의 확장 메서드 모음 ver.1 - GetOrAddComponent

프로젝트에서 자주 쓰이는 코드들을 확장 메서드로 하나씩 정리하는 글입니다.ver.1에서는 가장 활용도가 높은 GetOrAddComponent()에 대해 작성하겠습니다.1. GetOrAddComponent가 필요한 이유Unity에서 런타임에 컴포넌트를 다룰 때 이미 붙어 있으면 가져오고 없으면 새로 추가해야 하는 상황이 발생합니다. 예를 들어 특정 오브젝트에 AudioSource를 사용해야 하는데, 인스펙터에서 미리 붙여둔 경우도 있고 아닌 경우도 있을 수 있습니다. 기존 방식의 문제점// 매번 null 체크와 AddComponent를 직접 작성해야 함AudioSource source = gameObject.GetComponent();if (source == null){ source = gameObj..

Unity/코드 연구 2026.03.31

[Unity] 폰트 용량 경량화 방법 (Static TMP)

게임을 빌드하면 폰트 파일의 용량이 생각보다 크다는 것을 확인할 수 있습니다.한글 폰트의 경우 폰트 하나에 수 MB에서 수십 MB까지 차지할 수 있습니다. 모바일 게임이나 텍스트가 적게 쓰이는 게임에서는 이 중 실제로 사용하는 글자가 수십~수백 자에 불과한 경우가 많습니다. 사용하지 않는 수천 자의 글자 데이터가 빌드에 그대로 포함되어 불필요한 용량을 차지하고 있는 셈입니다.이번 글에서는 필요한 글자만 골라서 TMP 폰트 에셋을 생성하여 폰트 용량을 획기적으로 줄이는 방법을 소개하겠습니다.1. 폰트 경량화란?폰트 경량화란 폰트 파일에서 실제로 사용하는 글자만 추출하여 폰트 에셋을 만드는 것을 말합니다.예를 들어 게임 내에서 시작, 설정, 종료, 확인, 취소 등 고정된 텍스트만 사용하는 UI가 있다면, 한..

Unity/정보 2026.03.29

[Unity] 플레이어블 광고(Playable Ad) 제작 가이드 - Playworks(Luna) 빌드

게임을 개발하고 나면 그 게임을 광고로 만들어 유저에게 직접 체험시키고 싶을 때가 있습니다. 이때 사용하는 것이 바로 플레이어블 광고(Playable Ad)입니다.플레이어블 광고란 앱을 설치하기 전에 미니게임 형태로 직접 플레이해볼 수 있는 광고입니다. 일반 영상 광고보다 전환율이 높아 현업에서도 많이 활용된다고 합니다.이번 글에서는 Unity로 만든 미니게임을 WebGL 빌드 → 용량 최적화 → Unity Playworks Plugin(Luna)를 이용한 플레이어블 광고 배포까지의 전체 과정을 단계별로 정리하겠습니다.1. 빌드 리포트 분석 - 용량의 구조 이해하기Unity에서 WebGL로 빌드를 완료하면 Console 또는 Editor Log에서 Build Report를 확인할 수 있습니다. Build..

Unity/정보 2026.03.12

[Unity] 동적 팝업 UI 구현 (PopupUI)

게임을 개발하다 보면 "정말 삭제하시겠습니까?", "게임을 종료하시겠습니까?" 처럼 사용자의 확인을 받아야 하는 팝업이 곳곳에 필요합니다.팝업이 필요한 상황마다 별도의 팝업 프리팹을 만들어 관리하는 방식도 있지만, 이 방법은 비슷한 팝업이 늘어날수록 프리팹 수가 폭발적으로 늘어나고 유지보수도 어려워집니다. 이번 글에서는 제목, 설명, 확인/취소 버튼을 코드에서 동적으로 설정할 수 있는 PopupUI 클래스를 소개하겠습니다.1. 동적 팝업이란?일반적인 팝업은 씬에 미리 배치해두거나 각 상황별로 전용 프리팹을 따로 만드는 방식입니다.동적 팝업은 이와 달리 팝업의 외형(프리팹)은 하나로 고정하되, 제목, 메시지, 버튼의 동작을 코드에서 호출 시점에 주입하는 방식입니다. 하나의 팝업으로 게임 전체의 모든 확인/..

Unity/코드 연구 2026.03.08

[Unity] ReactiveProperty 구현 (반응형 프로퍼티)

게임을 개발하다 보면 값이 바뀔 때 자동으로 UI가 갱신되거나 다른 시스템에 변경을 알려야 하는 상황이 자주 생깁니다.예를 들어 플레이어의 HP가 깎였을 때 HP바 UI를 업데이트해야 하는 경우엔 가장 단순한 방법은 HP를 바꾸는 코드 옆에 직접 UI 갱신 코드를 함께 작성하는 것입니다. 하지만 이 방식은 로직과 UI가 서로 강하게 묶이는 강한결합 문제를 일으킵니다.이번에는 이 문제를 해결하는 ReactiveProperty 클래스를 소개하겠습니다.1. ReactiveProperty란?ReactiveProperty는 값이 변경될 때 등록된 콜백(Action)을 자동으로 호출하는 프로퍼티입니다.값을 관찰하고 있다가 변화가 생기면 반응한다는 의미에서 반응형 프로퍼티라고 부릅니다. 옵저버 패턴(Observer ..

Unity/코드 연구 2026.03.06

[Unity] 싱글톤 패턴 구현 (MonoSingleton)

게임을 개발하다 보면 게임 매니저, 사운드 매니저, UI 매니저 등 게임 전체에서 단 하나만 존재해야 하는 오브젝트가 필요할 때가 많습니다.이런 상황에서 사용하는 것이 바로 싱글톤 패턴(Singleton Pattern) 입니다. 이번 글에서는 제가 직접 만들어 사용하는 MonoSingleton 제네릭 클래스를 통해 싱글톤 패턴의 개념부터 실제 활용법까지 자세히 알아보겠습니다.1. 싱글톤 패턴이란?싱글톤 패턴은 클래스의 인스턴스가 오직 하나만 존재하도록 보장하는 디자인 패턴입니다. 그리고 그 인스턴스에 전역적으로 접근할 수 있는 방법을 제공합니다.게임 개발에서 싱글톤이 필요한 대표적인 예시는 다음과 같습니다.GameManager : 게임의 상태(점수, 스테이지 등)를 전역으로 관리SoundManager :..

Unity/코드 연구 2026.03.06

[Unity] Unity Editor 컴포넌트 ContextMenu 추가 방법

유니티에서 개발하다 보면 특정 함수를 버튼처럼 실행하고 싶을 때가 있습니다.물론 OnInspectorGUI()를 이용해 인스펙터에 직접 버튼을 만들 수도 있지만, 더 간단한 방법이 있습니다.바로 ContextMenu를 사용하는 방법입니다. 이걸 쓰면 인스펙터의 케밥 메뉴(점 3개)나 컴포넌트 우클릭 메뉴에서한 줄의 코드로 함수를 바로 실행할 수 있습니다.1. 케밥 메뉴가 무엇인가?인스펙터 상단 우측의 점 3개 버튼(컴포넌트 컨텍스트 메뉴)입니다.기본적으로 제공되는 항목 외에, 개발자가 원하는 함수에 [ContextMenu("메뉴 이름")]를 이용해 메뉴를 추가할 수 있습니다.디버그용 기능이나 툴 제작 등, 에디터 확장이 필요한 상황에서 매우 유용합니다.2. 기본 예제using UnityEngine;pub..

Unity/정보 2025.10.28

내일배움캠프 Unity - TIL : 25.04.24

오늘 학습한 내용1) 저장&불러오기 시스템에서의 마이그레이션 기능 구현 저장 데이터 구조 변경 시 이전 버전의 데이터를 자동으로 변환해 최신 구조에 맞추는 마이그레이션 시스템을 도입했습니다. 이를 통해 유저 데이터의 호환성과 안정성을 확보했습니다. 문제 및 해결 과정1) 문제 (게임 업데이트 후 이전 저장 데이터가 불러와지지 않음) 게임의 저장 데이터 구조가 변경되며, 구버전에서 저장된 데이터를 역직렬화할 때 오류가 발생하거나 필드가 누락되는 문제가 있었습니다. 시도한 해결 방법SaveData 구조체에 version 필드 추가불러오기 시 version을 기준으로 데이터 구조를 점진적으로 변환하는 MigrateData() 함수 작성필드 삭제/추가에 대비하여 [JsonExtensionData]를 사용해 ..

내일배움캠프 2025.04.24
728x90