GAME DEV
-
[ 게임 개발 ] Unity - 명명백백한 최적화의 왕 Burst Compiler
버스트 컴파일러가 무엇일까?버스트 컴파일러는 Unity 엔진에서 사용하는 고도로 최적화된 네이트브 코드를 생성하는 컴파일러이다.주로 Unity의 C# Job System과 함께 사용되어, CPU, 집약적인 코드의 성능을 크게 향상하는데 목적이 있다.예를 들어서 Data Oriented Design 활용 중에 ECS 패턴으로 대규모 시뮬레이터를 을 구현한다고 했을 때.물리 로직은 굉장히 간소화되고 가볍게 돌아가야 한다. 이러한 성능이 중요한 작업을 메인스레드에서 분리하고멀티 코어 CPU를 효율적으로 활용하여 랙 없이 부드러운 게임 경험을 제공할 수 있다. (멘트 좀 광고 같구먼) 어떻게 이것이 가능하냐.버스트 컴파일러는 Unity의 C#코드(정확히는 고성능 C#(HPC#)이라고 불리는 C#의 특정 부분집합..
-
[ 게임 개발 ] 내가 보려고 만든 Unity - Android Debug Bridge 연결 및 활용 (Window환경)
게임 모바일 빌드하고 테스트할 때 어떻게 함?빌드해서 apk 드라이브 올린 다음에 다운로드하여서 하기?그냥 빌드 안 해버리고 Unity Remote?다 말해봤더니 사수님이 다 아마추어적인 방법이라고개발자 다운 방법을 보여주겠다면서 Adb라는 기능을 멋지게 가르쳐주셨다. 생각이상의 신세계였기에 신기했고 편해서 정리해보려 한다. (필자가 윈도우 유저라 Window로만 정리할 거다 수고용 하하하하 근데 생각을 해보니 Mac쓰는데 안드로이드 폰 테스트를 하려고? 어림도 없지ㅋㅋ) 일단은 게임개발 블로그이기 때문에,대충 정의부터 설명하고 유니티 빌드 디버깅을 어떻게 하는지에 대해 다룰 거다. Adb가 머임? 안드로이드 디버그 브리지 (Android Debug Bridge).줄여서 Adb라고 부른다. 안드로이드 ..
-
[ 게임 개발 ] 클라이언트 보안 - 코드 난독화 / 바이너리 보호
유니티로 만든 게임을 하다 보면 드는 의문점들이 있다.그중에서 유니티로 개발된 게임이 유독 모드와 확장을 많고 다양하게 지원하는 이유가 무엇일까?그것은 유니티의 빌드 스크립팅 백엔드와 관련이 있다. 유니티는 Mono라는 스크립팅 백엔드를 사용하여 코드를 컴파일한다.Mono는 Unity가 C# 스크립트를 실행하기 위해 사용하는. Net Framework의 오픈소스 구현체이다.Unity는 C#스크립트를 빌드하면 IL형태로 컴파일하고 이를 Mono런타임이 JIT(Just-In-Time) 컴파일하여 실행한다.JIT기반이라 빠른 iteration으로 수정 → Play → 테스트 속도가 빠르다는 장점을 가지고있다. 하지만 여기서 컴파일 형태가 IL형태라는 것이 문제인데.IL이 남게 되면 해커 또는 모더가 ILSpy..
-
[ 게임 개발 ] 클라이언트 보안 - 클라이언트는 항상 뚫린다
게임하면서 핵을 만나본 적 있는가?게임에는 규칙이 있고, 정해진 로직을 통해 철저히 계산된 움직임으로합법적인 플레이를 해야 모두가 게임을 즐겁고 평화롭게 즐길 수 있다. 하지만 핵을 만나게 되면 그런 평화는 사라진다. 게임은 불합리해지고 일방적으로 뚜드려 맞기만 할 것이다. 뭐 게임하다가 핵 만나서 화나서 쓰는 글은 아니고, 최근 회사를 다니면서 게임 개발에 보안을 신경 써야 한다는 사실을 새삼 깨닫고 있다.문제는 핵만이 아니라 게임을 리버스 엔지니어링 하여 해적판 같은 무단 사용 및 배포가 일어나는 것이 문제이다. 여태까지는 개발하면서 내 클라이언트 패키지로 된 코드뭉탱이 게임이어떻게 털리든 상관없었고 그냥 깃 워크플로우도 그냥 오픈소스비슷하게 개발하고 있어서 깃허브 네트워크 암호화나이런 것에 대한 ..
개발 잡소리
-
[ 개발 잡소리 ] 렌더링 최적화 - 면접 질문 : " DrawCall이 뭔가요? "
아 드로우콜은 말이죠.DrawCall에 대해 알아보자 # 정의와 목적꽤 직관적인 이름을 가지고 있다. Draw + Call, 그리는 명령이다.드로우 콜은 CPU가 GPU에게 렌더링 명령을 내리는 하나의 호출, 명령 단위를 의미한다.만약 맵에 오브젝트가 3개 있으면 3개의 드로우콜이 일어나는 것이다. 게임 개발을 함에 있어서 맵과 레벨에 수많은 오브젝트들이 배치되는데.단순 개별 오브젝트만이 아니라 메테리얼 마다도 DrawCall이 발생하기 때문에 이들의 수가 많아지면CPU의 오버헤드가 커지고 성능저하로 이어진다. 그렇다면 이런 DrawCall이 나쁜 게 아니라 꼭 필요한 놈인데. 어떻게 최적화할 수 있을까? # DrawCall 최적화 (렌더링 최적화)# Batching가장 대표적인 DrawCall 최적화..
-
[ 개발 잡소리 ] 캐시 히트/미스 (Cache HIT MISS)
캐시 히트인지 뭔지 를 설명하기 위해서는 우선 캐시(Cache)가 무엇인지 알아야 하는데.........바로 알아보자.........................# 캐시 메모리가 뭐임????? (EAZY 난이도 설명)가장 간단한 예시로는 작업 표시줄을 예시로 들 수 있다.작업 표시줄은 최근에 사용했거나 자주 사용하는 프로그램을 하단 바에 띄울 수 있게 하는 기능이다. 하지만 최근에 사용한적도 없고 자주 쓰지 않아서 컴 어딘가에는 있는데 그걸 켜고 싶으면 어떻게 함??어쩌긴 어째. 검색을 해야한다.그럼 이제 일시적으로 작업 표시줄에 추가되고 나중에 프로그램을 끄면 빠진다. 이때 이 작업표시줄을 캐시 메모리라고 볼 수 있다.# 캐시 메모리가 뭐임22????? (진짜)우리 컴퓨터는 여러 하드웨어들로 이루어져 ..
-
[ 개발잡소리 ] bool + int 는 총 몇 바이트? - Memory Alignment
.." 페른, Struct 에 bool과 int 멤버변수를 선언하면 이 멤버변수 필드는 총 몇의 메모리를 차지하는지 알고 있니? " " 당연히 1Byte + 4Byte니까 5Byte 아닙니꺼? "" 틀렸단다." 메모리 패딩과 정렬에 대해 알아보자. # 정의 & 이론(딱히 정의랄게 없어서 거의 이론중심) CPU가 메모리 접근을 빠르게 하기 위해서 각 필드들을 특정 정렬 바운더리에 맞추어 배치한다.이 작업을 정렬(Alignment)라고 하고. 그 결과로 생길 수 있는 빈 공간을 패딩(Padding)이라고 한다. 아래와 같은 코드가 있다고 치자public struct TestStruct{ public byte a; // 1 byte public int b; // 4 bytes publi..
-
[ 개발 잡소리 ] 데이터 지향적 설계 Data-Oriented Design(DOD)
DOD가 뭘까?DOD는 Data-Oriented Design. 데이터 지향적 설계라는 프로그래밍 패러다임의 일종이다. 바로 알아보자 # 정의전통적인 객체 지향적 설계(OOP)와 달리,데이터가 실제로 어떻게 메모리에 배치되고 접근되는가에 집중하는 설계 패러다임이다.즉, 데이터의 구조와 접근 패턴을 CPU와 메모리 계층 구조등에 최적화하는 방식이다. # 목적 / DOD의 아이디어 1. CPU 캐시 친화적 구조를 가진다.현대의 CPU의 연산속도는 충분히 빠르지만. 일반적으로 객체지향(OOP) 프로그래밍을 하는 경우,객체들을 생성하고 이들을 메모리의 새로운 위치에 할당하는데. 이러한 경우 이 객체가 배열처럼 연속된 지정된 위치에 있는 것이 아니라 메모리 어딘가에 흩어져서 존재한다. 따라서 이런 객체들을 다루..
최근에 올린 글
-
[ 게임 개발 ] Unity - 명명백백한 최적화의 왕 Burst Compiler
버스트 컴파일러가 무엇일까?버스트 컴파일러는 Unity 엔진에서 사용하는 고도로 최적화된 네이트브 코드를 생성하는 컴파일러이다.주로 Unity의 C# Job System과 함께 사용되어, CPU, 집약적인 코드의 성능을 크게 향상하는데 목적이 있다.예를 들어서 Data Oriented Design 활용 중에 ECS 패턴으로 대규모 시뮬레이터를 을 구현한다고 했을 때.물리 로직은 굉장히 간소화되고 가볍게 돌아가야 한다. 이러한 성능이 중요한 작업을 메인스레드에서 분리하고멀티 코어 CPU를 효율적으로 활용하여 랙 없이 부드러운 게임 경험을 제공할 수 있다. (멘트 좀 광고 같구먼) 어떻게 이것이 가능하냐.버스트 컴파일러는 Unity의 C#코드(정확히는 고성능 C#(HPC#)이라고 불리는 C#의 특정 부분집합..
2025.12.09 15:22 -
[ 게임 개발 ] 내가 보려고 만든 Unity - Android Debug Bridge 연결 및 활용 (Window환경)
게임 모바일 빌드하고 테스트할 때 어떻게 함?빌드해서 apk 드라이브 올린 다음에 다운로드하여서 하기?그냥 빌드 안 해버리고 Unity Remote?다 말해봤더니 사수님이 다 아마추어적인 방법이라고개발자 다운 방법을 보여주겠다면서 Adb라는 기능을 멋지게 가르쳐주셨다. 생각이상의 신세계였기에 신기했고 편해서 정리해보려 한다. (필자가 윈도우 유저라 Window로만 정리할 거다 수고용 하하하하 근데 생각을 해보니 Mac쓰는데 안드로이드 폰 테스트를 하려고? 어림도 없지ㅋㅋ) 일단은 게임개발 블로그이기 때문에,대충 정의부터 설명하고 유니티 빌드 디버깅을 어떻게 하는지에 대해 다룰 거다. Adb가 머임? 안드로이드 디버그 브리지 (Android Debug Bridge).줄여서 Adb라고 부른다. 안드로이드 ..
2025.12.08 18:01 -
[ 개발 잡소리 ] 렌더링 최적화 - 면접 질문 : " DrawCall이 뭔가요? "
아 드로우콜은 말이죠.DrawCall에 대해 알아보자 # 정의와 목적꽤 직관적인 이름을 가지고 있다. Draw + Call, 그리는 명령이다.드로우 콜은 CPU가 GPU에게 렌더링 명령을 내리는 하나의 호출, 명령 단위를 의미한다.만약 맵에 오브젝트가 3개 있으면 3개의 드로우콜이 일어나는 것이다. 게임 개발을 함에 있어서 맵과 레벨에 수많은 오브젝트들이 배치되는데.단순 개별 오브젝트만이 아니라 메테리얼 마다도 DrawCall이 발생하기 때문에 이들의 수가 많아지면CPU의 오버헤드가 커지고 성능저하로 이어진다. 그렇다면 이런 DrawCall이 나쁜 게 아니라 꼭 필요한 놈인데. 어떻게 최적화할 수 있을까? # DrawCall 최적화 (렌더링 최적화)# Batching가장 대표적인 DrawCall 최적화..
2025.12.08 16:41 -
[ 게임 개발 ] 클라이언트 보안 - 코드 난독화 / 바이너리 보호
유니티로 만든 게임을 하다 보면 드는 의문점들이 있다.그중에서 유니티로 개발된 게임이 유독 모드와 확장을 많고 다양하게 지원하는 이유가 무엇일까?그것은 유니티의 빌드 스크립팅 백엔드와 관련이 있다. 유니티는 Mono라는 스크립팅 백엔드를 사용하여 코드를 컴파일한다.Mono는 Unity가 C# 스크립트를 실행하기 위해 사용하는. Net Framework의 오픈소스 구현체이다.Unity는 C#스크립트를 빌드하면 IL형태로 컴파일하고 이를 Mono런타임이 JIT(Just-In-Time) 컴파일하여 실행한다.JIT기반이라 빠른 iteration으로 수정 → Play → 테스트 속도가 빠르다는 장점을 가지고있다. 하지만 여기서 컴파일 형태가 IL형태라는 것이 문제인데.IL이 남게 되면 해커 또는 모더가 ILSpy..
2025.11.19 10:36 -
[ 게임 개발 ] 클라이언트 보안 - 클라이언트는 항상 뚫린다
게임하면서 핵을 만나본 적 있는가?게임에는 규칙이 있고, 정해진 로직을 통해 철저히 계산된 움직임으로합법적인 플레이를 해야 모두가 게임을 즐겁고 평화롭게 즐길 수 있다. 하지만 핵을 만나게 되면 그런 평화는 사라진다. 게임은 불합리해지고 일방적으로 뚜드려 맞기만 할 것이다. 뭐 게임하다가 핵 만나서 화나서 쓰는 글은 아니고, 최근 회사를 다니면서 게임 개발에 보안을 신경 써야 한다는 사실을 새삼 깨닫고 있다.문제는 핵만이 아니라 게임을 리버스 엔지니어링 하여 해적판 같은 무단 사용 및 배포가 일어나는 것이 문제이다. 여태까지는 개발하면서 내 클라이언트 패키지로 된 코드뭉탱이 게임이어떻게 털리든 상관없었고 그냥 깃 워크플로우도 그냥 오픈소스비슷하게 개발하고 있어서 깃허브 네트워크 암호화나이런 것에 대한 ..
2025.11.18 15:27 -
[ 개발 잡소리 ] 캐시 히트/미스 (Cache HIT MISS)
캐시 히트인지 뭔지 를 설명하기 위해서는 우선 캐시(Cache)가 무엇인지 알아야 하는데.........바로 알아보자.........................# 캐시 메모리가 뭐임????? (EAZY 난이도 설명)가장 간단한 예시로는 작업 표시줄을 예시로 들 수 있다.작업 표시줄은 최근에 사용했거나 자주 사용하는 프로그램을 하단 바에 띄울 수 있게 하는 기능이다. 하지만 최근에 사용한적도 없고 자주 쓰지 않아서 컴 어딘가에는 있는데 그걸 켜고 싶으면 어떻게 함??어쩌긴 어째. 검색을 해야한다.그럼 이제 일시적으로 작업 표시줄에 추가되고 나중에 프로그램을 끄면 빠진다. 이때 이 작업표시줄을 캐시 메모리라고 볼 수 있다.# 캐시 메모리가 뭐임22????? (진짜)우리 컴퓨터는 여러 하드웨어들로 이루어져 ..
2025.11.13 01:00 -
[ 개발잡소리 ] bool + int 는 총 몇 바이트? - Memory Alignment
.." 페른, Struct 에 bool과 int 멤버변수를 선언하면 이 멤버변수 필드는 총 몇의 메모리를 차지하는지 알고 있니? " " 당연히 1Byte + 4Byte니까 5Byte 아닙니꺼? "" 틀렸단다." 메모리 패딩과 정렬에 대해 알아보자. # 정의 & 이론(딱히 정의랄게 없어서 거의 이론중심) CPU가 메모리 접근을 빠르게 하기 위해서 각 필드들을 특정 정렬 바운더리에 맞추어 배치한다.이 작업을 정렬(Alignment)라고 하고. 그 결과로 생길 수 있는 빈 공간을 패딩(Padding)이라고 한다. 아래와 같은 코드가 있다고 치자public struct TestStruct{ public byte a; // 1 byte public int b; // 4 bytes publi..
2025.09.30 19:59 -
[ 게임 개발 ] Unity 런타임 리소스 로드(Resources, AssetBundle, Addressables)
부제 : Resources를 쓰면 안 되는 이유# 서론런타임 리소스 로드(Runtime Resource Load)가 뭘까?뭐 말 그대로 프로그램 실행 중에(Runtime)에 리소스를 로드하겠다는 뜻이다. 그런데 런타임에서 에셋을 로드할 필요가 있을까?유니티 같으면"컴포넌트에서 직렬화해서 딸깍 끼워 넣으면 굳이 동적으로 에셋을 로드할 필요 없는 거 아님??"이런 궁금증을 해결하는 게 최종 목표라고 볼 수 있다. 유니티에는 이를 자체적으로 지원해 주는 기능 세 가지가 있다.Resources, AssetBundle, Addressables이 이에 해당한다.이들에 대해 설명하면서 런타임 리소스 로드에 대해 알아보자.Resources란?▶ 참고자료 : [Unity공식 문서 : 런타임 리소스 로드]# 정의Resou..
2025.09.17 12:51 -
[ 개발 잡소리 ] 데이터 지향적 설계 Data-Oriented Design(DOD)
DOD가 뭘까?DOD는 Data-Oriented Design. 데이터 지향적 설계라는 프로그래밍 패러다임의 일종이다. 바로 알아보자 # 정의전통적인 객체 지향적 설계(OOP)와 달리,데이터가 실제로 어떻게 메모리에 배치되고 접근되는가에 집중하는 설계 패러다임이다.즉, 데이터의 구조와 접근 패턴을 CPU와 메모리 계층 구조등에 최적화하는 방식이다. # 목적 / DOD의 아이디어 1. CPU 캐시 친화적 구조를 가진다.현대의 CPU의 연산속도는 충분히 빠르지만. 일반적으로 객체지향(OOP) 프로그래밍을 하는 경우,객체들을 생성하고 이들을 메모리의 새로운 위치에 할당하는데. 이러한 경우 이 객체가 배열처럼 연속된 지정된 위치에 있는 것이 아니라 메모리 어딘가에 흩어져서 존재한다. 따라서 이런 객체들을 다루..
2025.09.12 15:23 -
[ 개발 잡소리 ] 님들이 보고 있는 색깔은 사실 가짜임 - 색 공간과 sRGB(Standard RGB)
시작에 앞서 퀴즈아래 두 0 ~ 1 보간 Gradient 중에서 무엇이 기계적으로 완벽한 선형보간일까?????? 정답은 1번이다.하지만 우리가 눈으로 인식하기에는 2번째 이미지가 좀 더 뭐랄까. 이상적인 보간 같다.이처럼 컴퓨터는 모니터가 색상을 출력할 때일종의 사람을 위한 시각 친화적 보정을 거칠 필요가 있다는 아이디어에서 시작한다. 따라서 우선 '감마보정'(gamma correction)에 대하여 알아보자 # 감마 보정과 CRT 색 공간감마보정이 등장한 것은 흔히 브라운관이라고 알려져 있는 음극선관(CRT) 모니터의 출력이 비선형적특성을 가지고 있었기 때문에 그것을 보정하기 위해 카메라의 선형 입력을 비선형으로 만들어주기 위해 탄생된 것으로 알려져 있다. 하지만 실제 목적은 인간 시각의 비선형성에 맞..
2025.09.11 10:10 -
[ 게임 개발 ] 유니티 쉐이더 그래프 6 - Posterization
포스터라이즈가 머임???포스터라이즈란 이런 것이다....텍스쳐, 픽셀에서 표현 가능한 색상값을 양자화하여 색을 줄이는 과정이다.# 접근 (포스터라이징 왜 쓰지 이거?)# 색상 표현우선 포스터라이즈를 위해서는 색상 표현에 관한 기본적인 이론을 알아야 한다.일반적으로 픽셀은 RGB 채널에서 각각 Red, Green, Blue 삼원색에 의해 표현된다.각 채널 값은 보통 0 ~ 1의 범위로 값을 가지며 1은 최대 밝기, 0은 최소 밝기이다.현대의 디스플레이는 수많은 중간 값을 표현할 수 있어 부드럽고 자연스러운 색상을 만들 수 있다. # 포스터라이징의 의의그럼 포스터라이징의 목표는 무엇일까?앞서 현대의 디스플레이가 다양하고 풍부한 색감을 표현할 수 있다고 했었는데.그게 오히려 뭐랄까. 어떤 고전스럽고 레트로한 ..
2025.09.11 00:31 -
[ 게임 개발 ] 유니티 쉐이더 그래프 5 - PIXELIZE
픽셀라이즈고해상도 이미지나 렌더링 된 화면을 의도적으로 뭉개서 픽셀화를 시키는 작업을 의미한다.일반적으로 도트 픽셀 그래픽을 주로 사용하는 2D게임이나 복셀 그래픽 스타일 게임에서 자주 사용된다.최근에 진행 중인 프로젝트 중에 2D, 3D 복셀프로젝트가 좀 있었어서 생각나서 글을 써보려 한다.뭐 암튼 그럼 예 # 이론# 모자이크 어떻게 하는 거임???픽셀을 뭉개버리는 방법에는 여러 가지가 있다. 블러나 모자이크가 대표적인 픽셀을 부숴서(?) 원래의 형태나 온전한 색을 알아보기 힘들게 하는 방식이긴 한데.둘은 차이가 좀 있다. 블러는 일반적으로 주변 픽셀의 색상값을 평균내거나 가중치를 부여하여 혼합하는 방식이다.하지만 모자이크(Pixelize)는 특정 구역 내의 픽셀을 전부 같은 색상으로 강제통일 시키는..
2025.09.10 11:33 -
[ 개발 잡소리 ] 타입 객체 패턴(Type Object Pattern)이 무엇일까?
타입 객체 패턴 (Type Object Pattern)이 무엇일까? 생각보다 많이 단순해서 글이 그렇게 길지도 않다. 타입 객체 패턴은 객체의 유형(타입) 을 별도의 객체로 분리하여 정의하는 디자인 패턴이다.여기서 유형이란. 여러 다양한 객체가 가질수 있는 공통된 요소가 될수있다. 잠깐. 이러면 객체지향의 상속구조는 뭐가되는거냐? 이런식으로 하면 전통적인 객체지향적 상속 구조로는 이런식으로 표현가능하다.public class Enemy { public string Name; public int Health; public int AttackDamage; public Enemy(string name, int health, int attackDamage) { Name = na..
2025.07.15 20:19 -
[ EDGE 개발 기록 ] 탄막 회피 AI - DFS + 백트래킹 기반
그냥 냅다 Enemy 뭐 만들지 생각하다가." 아. 엄청 많은 탄막을 그냥 슉슈슉 피해버리는 사기적인 에너미가 하나 있으면 간지 나고 좋지 않을까 "라는 생각을 떠올렸다. 그리고 실제로 그것을 만들게 되었는데. 일단 여러 조건이 존재했다.# 조건1. 피할 대상인 탄막들이 멈춰있거나 작은 속력을 가지고 있을 것.이것은 왜이런가 하면. 만약 탄이 엄청 빠른 속도로 날아오는데. 이를 피하려면 탄막의 속력에 따른 다음 위치까지 미래예지처럼 계산을 한 다음 그 위치를 기준으로 피해야 하는데. 이게 너무 성능이 구리게 나올 것 같다.애초에 단순한 회피 알고리즘 치고 기능이 너무 딥해지는 것 같다. => 이를 해결하기 위해 시간을 감속하고 이동하는 스킬의 연출로 만들기로 정했다. 2. 성능이 좋아야 한다이전에 살짝 ..
2025.05.30 23:52 -
[ 개발 잡소리 ] DP(Dynamic Programming)란 무엇인가?
서론 - DP가 뭐임?DP는 Dynamic Programming의 약자를 의미한다.동적 프로그래밍, 동적 계획법 등 여러 이름으로 불리고 오늘날의 개발자들에게 필수적인 덕목이라고 볼 수 있고,게임 개발자라면 더더욱 알아야만 하는 중요한 지식이다. 이런 멋진 기술의 기원을 타고 올라가면..DP라는 개념은 1950년대 '리처드 e 벨먼'이라는 굉장하신 수학자께서 만드셨다.당시에는 복잡한 문제를 작은 세부 문제들로 나누어 효율적으로 푸는 방법을 찾기 위해서 제시되었다. 핵심 아이디어는. " 같은 연산을 여러 번 하지 않을 것 "이다.DP는 같은 연산을 하지 않기 위해 이전에 했던 연산을 기억해 두고. 후에 다른 연산을 할 때이를 꺼내 쓰면서 문제를 해결해 나가는 방식이다. 이런 식으로 앞서 계산했던 것을 기..
2025.05.19 13:59 -
[ 게임 개발 ] Stack구조 기반 TimeScale관리
# 문제 상황게임을 개발할 때. Time.timeScale을 수정할 일이 생긴다. 예를 들자면 일시정지 Pause UI가 켜졌을 때, TimeScale을 0으로 만들어, 게임의 진행 상황을 정지시킨다.또한 액션게임에서 시간을 정지 혹은 감속, 배속시키는 경우도 있을 것이다. 하지만, 각각의 경우가 중첩된다면 어떻게 할까? DIO가 "더 월드! 시간은 멈춘다!"를 사용할 때 TimeScale은 8초간 0f 일 것이다.하지만 그 사이에 죠타로가 잠시 게임 일시정지를 사용하고 일시정지를 해제하면?PausePanel의 코드 내에서 패널이 단순히 켜질 때 정지, 꺼질 때 재개로 만들어두었다면.디오의 스킬이 끝나지 않았음에도 TimeScale이 1f로 돌아오는 참사가 발생할 수 있다. 시간이 느리게 흐르는 연출이 ..
2025.05.18 23:36 -
[ 게임 개발 ] FAKE(가짜) NULL이 존재한다고????
졸작 개발을 하다가 기괴한 버그를 발견했다. Scene을 비동기로 넘길 때 다음과 같은 문제가 발생되었다.유니티의 주장에 따르면 저 Overlap부분에서 MissingReference 오류가 발생한다고 한다.하지만 저기서 유일하게 참조객체인 놈은 transform 뿐....왜 이러는가?근데 transform이 null이면 아예 Grab()을 호출한 쪽에서 missingReference가 떠야 하는 거 아닌가?그럼 transform은 파괴되었는데 컴포넌트 객체는 파괴가 안되어서 이런 일이 발생하는 것인가? 일정 부분 맞는 말이다.하지만 transform과 컴포넌트는 동일한 생명주기를 가지고 있기 때문에, 독립적으로 먼저 파괴될 수는 없다.씬이 변경될 때에 모든 GameObject들을 파괴하는데. 이때 파괴..
2025.05.08 14:53 -
[ EDGE 개발 기록 ] 플젝 개요와 Enemy AI SO분리 시스템
개요Edge가 무엇인가.. 그것은 동계 게임잼 프로젝트에서 기원한 게임인 것이다.(이때 만든 게임인.) [ 팀 프로젝트 후기 ] 동계 게임잼 시즌2를 마치며왜 시즌 2냐면 올해 1월에도 동계 게임잼을 했었다.그때는 고1 신분으로 참여하게 된 행사이지만 같은 해인 2024년 진행했기 때문에 이번에 한 게 시즌2라고 볼 수 있다.12월 18~20 일까지 동계 게임dev-vcs.tistory.com 여러 프로젝트들을 끝내고 나서. " 아 나중에 다시 리메이크해야지 "라는 생각을 해왔고.실제로 프로젝트를 파기까지는 성공한 프로젝트들이 수두룩 하지만.진심으로 개발을 지속한 프로젝트는 거의 없었다. 하지만 동계 게임잼 프로젝트였던 Edge? 게임성도 좋았고. 실제로 결과도 좋았던 프로젝트였기 때문에,여기다 시간을..
2025.04.23 01:15 -
[ 개발 잡소리 ] StringBuilder를 사용해보자
StringBuilder를 알고 있는가?StringBuilder는 문자열을 효율적으로 다루기 위한 C# 내장 클래스이다.간단히 말해서 문자열을 반복적으로 수정하거나 추가할 때에 StringBuilder를 사용하면 성능이 훨씬 좋아진다.그냥 String을 쓰면 안 되나??string을 쓰면 안 되는 게 아니다. 일반적인 경우에서는 그냥 string을 넣는 게 맞다.다만. 몇 가지 경우에 string을 쓰는 것이 엄청난 오버헤드가 발생한다. C#에서 string은 불변(immutable) 객체이기 때문에. 기존 문자열을 수정하면, 기존 문자열을 바꾸는 게 아니라새로운 문자열을 새로 만들고 기존의 문자열은 버리는 식으로 작동한다.string result = "";for (int i = 0; i 내부적으로 매..
2025.04.09 09:29 -
[ 졸업작품 개발 기록 ] 로프 스윙과 벡터 내적
졸업작품은 돌고 돌아 누구나 개발하기를 꿈꾸는 2D 플랫포머 액션 게임을 만들게 되었다. 그중에서도 레퍼런스 게임은 2D 플랫포머액션 개발의 진입장벽을 무자비하게 올려버린바로 산나비라는 게임이다. 이 게임은 로프액션이라는 신박한 이동방식과 이를 이용한 속도감 있고타격감 있는 전투를 진행하는 게임이다. 정말 재미있게 플레이한 게임이고 그렇다 보니 비슷한 메커니즘의 게임을 너무나 만들고 싶었다. 그를 위해 필요했던 여러 시스템중 고민이 되던 부분이 있다.그것은 로프 체공 중에 스윙방향을 연산하여 그 방향으로 가속을 하는 시스템이다.이런 연산을 해주지 않으면옆으론 비교적 빠르게 스윙하는데 위로는 속도가 엄청 안 나오는 그냥 구린 조작감이 탄생한다.그리고 특정 위치에서 스윙을 사용할 때 의도되지 않은 이동을 하..
2025.03.26 19:47 -
[ 게임 개발 ] Caster 시스템 - Damage, Knockback
요즘 게임 코드 구조들을 짤 때 유니티 컴포넌트 시스템을 적극 활용하여기능분할과 깔끔한 종속성 구조를 만드는 것을 즐기고 있다. 그중에서 제일 실용적으로 쓸만하고 마음에 드는 구조가 이 Caster라는 놈인데현 졸업 작품 개발에도 활용하고 있는 기능이다. 말은 뭐 되게 대단한 거 소개하는 뉘앙스인데 꽤 간단하다이런 식으로 각각 물리 캐스팅을 통해 감지했던 캐스트 구조를 이런 식으로 감지는 Caster가 하고 기능별로 필요한 기능은 기능 캐스터들이감지된 Target에 대한 정보만 받아 처리하는 방식이다. 그래서 이런 식으로 Caster구조를 만들어두면기능에 따라 깔끔하게 분할된다. 캐스팅 시에 기능을 추가하고 싶다면 아래에기능 캐스터들만 추가로 달아주기만 하면 되는 것이다. 이제 구현을 해볼..
2025.03.05 10:28 -
[ 게임 개발 ] Normal 벡터, Normal Map은 무엇일까
Normal벡터를 알고 있는가?평범함, 보통을 의미하는 Normal이 아닌 조금 더 수학과 게임 개발에 관련된 개념이라 볼 수 있다. Normal은 국산말로 법선이라고 한다.법선? 물리나 기하학 혹은 선형 대수학을 공부해 보았다면 기억에 남을 수도 있다. 쉽게 설명하자면 어떤 면이 바라보고 있는, 즉 평면에 수직인 벡터를 의미한다. 꽤 익숙하지 않은가? 물리시간에 했던 입사각, 반사각사이의 법선이라는 개념이 존재하는데이 법선과 같은 것이다. Blender에서 노말벡터를 Gizmos로 그려주는 기능이 있는데 이것으로 정육면체를 보면이런 식으로 표시된다.이 면에 대한 Normal은 외적을 통해 구할 수 있는데.삼각형을 나누고 각 삼각형에서 두 벡터를 만들어 외적을 해주면 그 삼각형에 대한 Normal이 나..
2025.02.03 19:15 -
[ Shader ] 유니티 쉐이더 그래프 4 - 버텍스 쉐이더로 파도 만들기
버텍스 쉐이더는 무엇일까?이것을 알아보기 위해서는 '버텍스' ( '정점'이라고도 한다)가 무엇인지 알 필요가 있는데이는 이전 글에서 설명했었으니 관련 정보를 습득하고 읽는 것을 추천.Vertex 관련 글 [ 게임 개발 ] 정점? Vertex? 가 무엇인Vertices는 무엇일까? (Vertex의 복수형인.) 보통 3D 모델을 어떻게 저장할까? 를 생각해 본다면 그 속에서 답을 얻을 수 있다.컴퓨터는 모델의 구성요소와 파일 형식에 따라 조금씩 차이가 있지만 공dev-vcs.tistory.com 대충 우리가 사용하는 오브젝트 모델링과 2D패널 들은 모두 아래와 같은 단계로 나누어져이루어져 있다.결론적으로는 모든 오브젝트들은 이 Vertex라는 점들로 이루어져 있는데이 버텍스를 가지고 움직이거나 어떻게 수학..
2025.01.27 20:23 -
[ 게임 개발 ] FSM 구조와 이벤트 호출에 대한 고찰
최근 여러 게임잼들을 겪으며 Player구동 로직으로 FSM을 아주 애용을 했었다.또한 그런 로직을 통해 외부의 이벤트를 호출할 일이 많았다. 이건 왜 그러냐 하면 Feedback이라는 Create 핸들함수를 실행시키면 정해진 동작,사운드 재생, VFX 재생, 카메라 효과, 볼륨 효과들을 컨트롤하는 기능들을 수행해 주는데이 Create함수를 발행할 때 UnityEvent가 쓰였기 때문이다. 그런데 기존에 사용 중인 FSM은 MonoBehaviour기반이 아니기 때문에 이벤트고 뭐고직렬화가 되어있지 않아 직렬화된 다른 대상을 매개로 이벤트를 Invoke 해주어야만 했다.그 매개의 대상이 마침 모든 State들이 가지고 있는 Player였다.그러다 보니 Player에 모든 Event들이 다 박혀있고, Pl..
2025.01.11 00:55 -
[ 팀 프로젝트 후기 ] 동계 게임잼 시즌2를 마치며
왜 시즌 2냐면 올해 1월에도 동계 게임잼을 했었다.그때는 고1 신분으로 참여하게 된 행사이지만 같은 해인 2024년 진행했기 때문에 이번에 한 게 시즌2라고 볼 수 있다.12월 18~20 일까지 동계 게임잼을 진행했다. 주제는 무제한 (무하한 아님)내게 있어 팀 편성이라는 재앙은 11월 초인가 중순쯤에 일어났다. 12월 17일 주제를 발표하고 개발에 들어갔고 마지막날인 20일 금요일은 아침 8시 제출이었기에사실상 17 ~ 19 게임잼이라고 봐도 무방하다. 기간이 약 3일이지만 실질적인 개발기간은 2일 정도였고 시간 동안 약 5시간을 수면한 것 같다.작업을 그렇게까지 힘들게 했어야 했나라고 생각할 수 있는데. 우리 팀의 포지션을 생각하면 당연한 것이다.우리 팀은 아무리 좋게 봐도 개발역향이 떨어지는 팀이..
2024.12.23 10:59 -
[ 게임 개발 ] 정점? Vertex? 가 무엇인
Vertices는 무엇일까? (Vertex의 복수형인.) 보통 3D 모델을 어떻게 저장할까? 를 생각해 본다면 그 속에서 답을 얻을 수 있다.컴퓨터는 모델의 구성요소와 파일 형식에 따라 조금씩 차이가 있지만 공통되는 부분은수학적(기하학적) 데이터와 메타데이터들을 통해 모델의 구조와 모양을 데이터로써 가지고 있는다. 그 데이터의 기하학적 데이터 내에 Vertex가 있다. 정점(Vertex)은 하나의 점,이를 이어 붙여서 선(Edge)을 만들고,선을 또다시 모아 면(Face)을 이룬다. 더 나아가서 면을 모아 모아 하나의 메쉬 덩어리를 이루게 된다.앞서 말한 점, 선, 면은 결론적으로 모두 메쉬의 구성요소들인 것이다. 유니티에서는 Scene창에서 Wireframe을 활성화하면 이것들을 좀 더 가시적으로 볼..
2024.11.16 19:31 -
[ BLAST 개발 기록 ] Effect System 개발
내가 만들어야 하는 것은이런 기능이다. 일반적인 버프도 있지만. 불이나 전기 같은 속성대미지를 입으면그에 따른 디버프를 걸고 효과를 띄우는 기능으로도 활용할 것이다. 모든 Agent들이 기능을 가지고 있어야 하고 개발하고 있는 BLAST는 뱀서라이크 장르이다.뱀서라이크는 기본적으로 에너미가 엄청나게 많이 나오고 이 개체 하나하나가 모두가지고 있어야 하는 기능이기 때문에 나름 최적화를 필요로 하는 기능이다. 여러 방법을 고민해 봤으나 제네릭으로 Agent마다 달린 어떤 컨트롤러가 효과를 가지고 업데이트해 주는 방식 외에는 나은 방법이 떠오르지 않아 그 방법을 채택해서 그대로 개발을 해보기로 했다 우선 이 방법의 원리를 대강 설명하면 우선 Controller를 하나 만들고 그걸 Agent가 가지고만 있게 만..
2024.11.01 11:09 -
[ 팀 프로젝트 후기 ] STA+C을 마치며
Smart Teen App Challenge STAC 2024가 끝났다. 좀 많이 늦게 쓰는 감이 있지만..(10월 초 이후로 이미 끝남) 나름 한해의 절반을 투자한 만큼 정도 들고 오래 힘썼던 프로젝트였지만아쉽게도 결선에서 떨어지게 된..나름 발표에도 질문이 없었고 칭찬뿐이었어서 긴장은 어느 정도 풀고 있었으나기대를 하면 배신을 당한다 했던가 처참히 떨어졌다고 한다. 개인적으로 (팀원들도 그랬지만) 정신적 피해가 강했기에,결과 발표되고 한두 시간 정도 무기력증에 시달렸으나 발표날이 금요일이라집에 가겠다는 동기부여로 다시 일어날 수는 있었다. 하 나쁜 일만 있는 것은 아니다. 오랫동안 붙잡고 있었던 프로젝트인 만큼,실제로 출시하고 조금이나마 수익도 내본 포트폴리오도 하나 만들어졌고. 추가로 얻은 경험,..
2024.10.18 01:40 -
[ 개발 잡소리 ] 제네릭과 템플릿
이게 뭐지?제네릭은 C#에 존재하는namespace인데 이는 여러 유용한 자료구조 클래스들을 지원해 주고이런 것들에는 List, Queue, Stack, Dictionary가 있다. 이런 자료형에 대한 부분 중에 Stack과 Queue는 다른 글에서 앞서 설명한 적이 있으니 생략하고List와 Dictionary에 대한 설명을 하겠다. ListList는 길이에 제약을 받지 않는 가변길이 배열이다.C++로 치면 vector에 해당하는 개념인 것이다.사용 예제는 이러하다. List numberList = new List();일반적인 정적 배열과는 달리 가변길이 배열이기 때문에Add나 Remove와 같은 메서드를 통해 리스트의 요소들을 쉽게 관리할 수 있다. 하지만 이 List가 편하고 좋다고 완전히 배열을 대..
2024.09.10 23:49 -
[ STAC 개발일지 ] 스택 개발일지 4 - Player Skill System
전투 시스템 개발에 관한 글을 4번으로 쓰려했으나너무 빨리 단시간에 많은 내용을 개발해 버려서 쓸 엄두가 나지 않아 스킵하고다음으로 개발하는 스킬 시스템에 대한 글을 쓸 예정이다. 우선 구조를 좀 고민했다. SO만 끼우면? 알아서 Controller가 쿨타임마다 스킬을 활성화해주고스킬 버튼을 누르면 알아서 지정된 스킬을 사용하게끔, 그리고 교체에용이하도록 진짜 Change함수 같은 거 하나만 실행시켜 주면 바로바로교체가 가능한 수준의 무언가를 만들어야 한다. 고민해 본 결과 지금은 전투시스템 개편으로 사라졌지만.기존에 있던 무기시스템에 영감을 받아 SO가 들어가면스킬을 실질적으로 실행해 주는 프리팹을 생성하여 스킬을 구현하도록 구조를 짤 것이다. 일단 스크립트를 이렇게 3개정도 만들어 둔다PlayerSk..
2024.08.10 16:17