전체 글 87

Fusion 2D 이동 로직을 상태머신(FSM) 기반으로 리팩토링

Fusion으로 탑다운 2D 이동을 구현할 때 FixedUpdateNetwork()에서 GetInput(out T)로 입력을 받아 처리하는 것이 튜토리얼에 나와있는 방법이다.입력 종류(이동, 클릭, 스킬, 상호작용 등)가 늘어날 것을 대비해 입력 수집(발행)과 입력 처리(상태별 행동)를 분리하고, 상태머신 구조로 리팩토링한 내용을 정리합니다.1. 리팩토링 목표이동/대기/행동을 상태(State)로 분리해서 책임을 분산Player(NetworkBehaviour)는 입력을 수집하여 이벤트로 발행StateMachine은 현재 상태에 입력/틱 업데이트를 위임HasInputAuthority 조건에서만 입력을 처리하도록 보장2. 전체 구조Player(NetworkBehaviour) ├─ FixedUpdateNetwo..

Unity 2025.12.12

C# 최대공약수 찾기 - 유클리드 호제법

유클리드 호제법(Euclidean Algorithm) 정리프로그래머스 같은 코딩 테스트 문제를 풀다 보면 최대공약수(GCD, Greatest Common Divisor)를 계산해야 할 때가 자주 있습니다.그 과정에서 자주 사용하는 대표적인 알고리즘이 바로 유클리드 호제법입니다.아래에서는 유클리드 호제법의 원리, 간단한 증명 아이디어, 그리고 C# 구현을 정리합니다.1. 유클리드 호제법이란?두 양의 정수 A, B에 대해 다음이 성립합니다.A를 B로 나눈 나머지를 r이라고 할 때 gcd(A, B) = gcd(B, r)여기서 gcd는 최대공약수(greatest common divisor)를 의미합니다.유클리드 호제법은 이 성질을 반복해서 적용하여나머지가 0이 될 때까지 진행하고, 그 직전에 등장한 수를 최대..

C# 2025.12.10

InputSystem을 이용한 Photon Fusion 이동

네트워크 게임에 대한 공부용으로 저장해두는 내용입니다.sdk 설치 및 연동은 스킵! 입력 흐름: Unity Input System → Fusion OnInput → GetInput이번 구조에서는 Unity Input System을 사용하고, 별도의 InputManager를 통해 Fusion에 입력을 전달하도록 구성했다.1) InputManager: Unity 입력을 받아서 NetworkInputData로 래핑using Fusion;using UnityEngine;using UnityEngine.InputSystem;public class InputManager : MonoBehaviour, IManager{ private PlayerInput inputAsset; private Vector2 ..

Unity 2025.12.09

Unity 씬 전환 후 남아 있는 이벤트 구독 때문에 NullReference 오류가!

0. 문제 상황 요약구조는 대략 이런 형태였습니다.InputManager새 Input System 기반public event Action onClick;마우스/터치 클릭이 발생하면 onClick(mousePos) 호출GameSceneManager : BaseSceneManager게임 씬 전용 매니저OnEnter()에서 GameManager.Input.onClick += OnMouseClick; 구독타일 클릭 처리, UI 열고 닫기 등 담당TileManagerTilemap을 들고 있고, GetTileNode()에서 tilemap.WorldToCell(worldPos) 호출씬 흐름은:StartScene → LobbyScene → GameScene → (게임 종료) → StartScene → … → 다시 Ga..

Unity 2025.12.02

Unity UI - Atomic Design 패턴

atom / molecule 단위로 UI 생산성 올리기인턴 경험 중 인상 깊었던 것 중 하나가 UI를 atom / molecule 단위로 쪼개서 재사용하는 패턴이었습니다.이번 프로젝트에서도 이 방식을 Unity에 다시 적용해 보았고, 그 과정과 느낌을 정리해 봅니다.※ 용어Atom(원자): 더 이상 쪼개기 어려운 최소 UI 단위Molecule(분자): 여러 atom이 모여 하나의 역할을 하는 작은 컴포넌트Organism(유기체): 화면의 한 영역(팝업, 카드, 셀 등)을 이루는 비교적 큰 단위 1. Unity에서 Atom 설계하기먼저 각 UI 요소를 작은 단위(Atom)로 쪼개는 것부터 시작했습니다.자주 사용되는 기능들이 포함된 것들을 우선적으로 적용합니다.1-1. 이미지 + 텍스트 Atom – atom..

Unity 2025.12.01

Unity ObjectPool로 만드는 제네릭 오브젝트 풀 매니저

유니티에서 Instantiate / Destroy를 반복하면 GC와 메모리 할당이 자주 일어나고, 이는 곧 성능 저하로 이어집니다.특히 몬스터, 투사체, 이펙트처럼 반복해서 생성·삭제되는 오브젝트는 오브젝트 풀링(Object Pooling)이 거의 필수에 가깝다고 생각합니다. 또한, 씬마다 필요한 풀링 오브젝트들이 다 다르기때문에 오브젝트 풀은 씬마다 파괴되지 않는 싱글톤의 자식 컴포넌트로 생성하는것을 규칙으로 삼았습니다. 이번 글에서는 유니티에서 제공하는 UnityEngine.Pool 를 활용해 제네릭 오브젝트 풀과 전역에서 사용하는 ObjectPoolManager의 설계를 설명해보고자 합니다.1. 전체 구조 개요구현한 풀 시스템은 크게 네 부분으로 나뉩니다.IPoolable 인터페이스풀에 들어가는 오..

Unity 2025.11.28

싱글톤의 Awake vs SceneLoaded / 타일맵 타일마다 스크립트 작성하기

과제로써 스타디펜스라는 게임의 모작을 만들게 되었다.과제를 진행하면서 오랜만에 생각해야할것들이 생겼고 이를 정리해보고자 한다. 1. Awake와 SceneLoaded의 타이밍 차이나는 하나의 매니저(Don't Destroy on load, 이하 GameManager) 하에 여러 매니저를 두고 이곳에서 초기화 및 여러 작업을 진행하고있다.그러던 중 TileManager(타일맵관련)을 만들게 되었는데 이 매니저는 로비나 게임 시작화면엔 존재하면 안되는 매니저이다.따라서 기존의 틀에서 벗어나야했고 다음과 같은 틀로 변경하게 되었다. - 각 씬에는 BaseSceneManager를 상속받는 하나의 씬 매니저가 존재한다.- 각 씬에서 참조해야할것은 해당 씬 매니저에서 처리하도록 한다.- GameManager에서는 ..

Unity 2025.11.19

NHN게임 공채 코딩테스트 pre-test 1차 불합 후기

NHN 게임 공채에 서류 전형을 통과한 뒤, 코딩테스트를 준비하며 알고리즘 공부를 했습니다. 몇가지 기억에 남는 몇 가지를 후기로 정리해 봅니다. 1. IDE 환경의 아쉬움코딩테스트가 프로그래머스에서 진행되다 보니 평소에 익숙하게 사용하던 Rider를 쓸 수 없었던 점이 정말 아쉬웠습니다. 처음에는 Rider에서 문제를 풀고 결과를 복사해서 제출하는 방식으로 연습했는데, 막상 실전에서는 프로그래머스 웹 에디터에서 바로 코딩하려니 불편한 점이 많았습니다.특히, 자주 쓰던 라이브러리의 스펠링이 헷갈리거나, Rider에서 자동으로 잡아주던 오류나 using문을 직접 처리해야 하는 부분에서 손이 많이 갔습니다. IDE에 많이 의존하고 있었던 걸 다시 느꼈고, 환경에 적응하는 연습이 필요하겠다는 생각이 들었습니다..

Etc 2025.08.27

Lit Shader 제작 복습

지금까지 공부해온 것들을 복습하면서 Lit Shader를 만들어보자.1. Lambert(Diffuse)빛을 받아오는 기본적인 계산 2. 환경광 및 환경차폐(Ambient, Ambient Occlusion)환경에 반사된 빛에 대한 추가적인 빛과 가려짐에 의한 환경차폐 (AO 맵 활용) 3. 퐁 반사(Specular)빛의 정면일수록 빛나는 하이라이트 4. 프레넬 반사(Rim)바라보는 방향에 수직일때 나오는 빛 5. Fake Specular프레넬을 이용한 하이라이트로, '내가 바라보는 방향에 하이라이트'를 주어 빛의 영향이 없는 뒷면에서도 보인다. 음영지역에서도 음영과 질감을 좀 더 잘 보이게 하는 장점이 있다. 그리고 셰이더는 보기 좋은게 좋은것이다~.문제발생회색 돼지가 나와버린다?!원인 분석 빛 해결결과물..

셰이더 2025.08.18

오픈월드 게임의 월드 관리 방식과 시간 처리

나는 유튜브중 100일 챌린지를 하는 유튜버 '치랜'을 좋아한다. 그 중, 좀보이드 영상을 보는데 갑자기 이런 생각이 들었다.“이렇게 넓은 맵을 하나의 씬(Scene)으로 다 담아두는 걸까?아니면 여러 개의 씬을 나누어, 플레이어 주변만 활성화하는 걸까?” "전기가 끊기고 시간이 지나면 '신선한' 음식들은 '상한' 음식이 되어버린다. 비활성화 된 혹은 현재 없는 씬에 존재하는 음식들에게도 전기가 끊기고 시간이 지났다는 메시지를 보낼 수 있는 걸까?1. 방대한 월드, 어떻게 관리할까?오픈월드 게임을 하나의 씬으로 통째로 유지하는 것은 메모리와 성능 부담이 크다.그래서 대부분의 게임은 스트리밍(Streaming) 기법을 사용한다고 한다. (ChatGPT 피셜)플레이어 주변은 활성화된 게임 오브젝트로 유지조금..

Unity 2025.08.13