- Wisp:Survival 후기 아쉬운 점 처음에는 뱀파이어 서바이벌 장르를 선택하면서 리소스에 대한 부담이 적을 것이라 생각했습니다. 여러 종류의 외부 리소스를 이용해서 구현하는 것으로 여러 종류의 스킬을 구현하는 데에는 문제가 없었지만, 스킬의 진화를 시각적으로 표현할 리소스가 부족해 기존 리소스에서 색상 변화와 데미지·쿨타임 조정으로 대체하게 되었습니다. 개발 과정에서 새로운 내용을 학습하고 프로젝트에 적용하는 과정에서, 이전 코드를 리펙토링하는 과정은 개발자로서의 성장에 큰 도움이 되었지만, 그만큼 프로젝트의 출시와 라이브 서비스라는 목적을 이루는데에 많은 시간이 지체되었습니다. 구현하고 싶은 기능과 아이디어, 더 공부해서 적용해 보고 싶은 기술들도 있었지만, 시간적인 여유가 부족해서 일부를 포기하게 되었습니다. 개발 초기에는 .. 2025.11.21
- Wisp:Survival 테스트 및 출시 기록 구글 플레이 콘솔으로 버전을 생성하여서 내부 테스트, 비공개 테스트, 공개 테스트, 프로덕션을 순서대로 진행하였습니다.내부 테스트 진행 비공개 테스트에 앞서서 실제 빌드와 안드로이드 환경에서 오류가 발생하는지 파악하기 위해서 진행했습니다. 내부 테스트를 진행함으로 사용자가 오류를 겪지 않도록 예방하였습니다.비공개 테스트 진행 비공개 테스트는 주변 친구들을 대상으로 진행하였습니다. 내부 테스트에서는 문제가 없다고 생각하였지만, 실제 테스트에서는 다양한 문제들이 추가로 발견되었습니다. UI 비율 문제나 게임의 진행이 멈추는 등의 오류는 수정 버전을 게시하고 검증하는 과정을 여러 차례 반복하여 해결했습니다. 또한, 테스트 과정에서 지적된 게임 밸런스 부분도 조금씩조정하면서 비공개 테스트를 이어갔습니다. 테스터.. 2025.11.21
- Internal 대부분 접근 제한자에 대해서 물어본다면, 아래 3개를 먼저 떠올릴 것이다.private, protected, public 이번에는 위 3개의 접근 제한자와는 다른 하나의 접근 제한자 Internal에 대해서 정리해보겠다.Internal이란?외부가 아닌, 동일한 어셈블리 내부 전역에서만 사용 가능하도록 제한하는 접근 제한자이다. 위의 설명을 처음 보았을 때는 Internal이 어떤 접근 제한자인지 정확히 이해하기 힘들 수 있다. 특히나 ‘외부’와 ‘동일한 어셈블리 내부’가 가리키는 대상을 정확하게 알려주지 않기 때문이라 생각한다.간단히 보기외부 : 기능을 구현한 실행파일 이외의 모든 곳에서의 접근동일한 어셈블리 내부 : 기능이 구현되어있는 실행파일 다시 한번 의미를 정리해 본다면 아래와 같다.기능이 구현된.. 2025.09.29
- Service Locator 우선, 앞서서 Service Locator는 안티 패턴이라는 평가를 받고 있다는 것을 짚고 가겠다. 우선 Service Locator의 Service에 대해서 알아보겠다.Service 인터페이스에 정의된 기능을 미리 구현하거나, 공통된 기능을 묶어서 만든 클래스이다.Service Locator란? 인터페이스 구현부에서 요청한 서비스를 제공하는 정적 클래스(객체)이다. 필요에 의해서 서비스를 생성한다. 생성된 모든 서비스를 Service Locator에서 관리한다. 서비스는 타입당 1개만 생성되며, 같은 타입의 서비스는 기존에 생성된 객체(서비스)로 대체한다. 생성한 서비스를 이용하지 않더라도, 서비스 객체를 제거하지 않는다.Service Locator의 단점 Service Locator는 항상 사용되지 .. 2025.08.16
- Dependency Injection 프로젝트에서 인터페이스를 이용한 구현 과정에서 아래와 같은 문제가 발생하였다."'interface를 상속 받은 모든 클래스에서 똑같은 구현이 되었으면' 하는 것이 발생했다."// 제가 겪은 문제는 IMovealbe의 상속받는 모두가 똑같은 둔화 공식을 가졌으면 좋겠다는 점이었다. 위와 같은 고민을 해보신 분도 있을 거라고 생각된다. 우선, C#에서는 Interface의 Default구현을 만들 수 있다. 단, 유니티가 아닌 C#에서만 지원하는 기능이다. 여기서 이런 의문이 드시는 분도 있으실 것이다."그럼 Interface가 잘못 설계되어 있는거 아닌가요?" Interface를 정의할 때는 구현해야 되는 것만 포함 시켜야된다. 그렇기 때문에, Interface가 잘못 설계되어 있는 것으로 보일 수 있다... 2025.07.10
- 확장 메서드 직접 Tweening 효과를 구현하는 과정에서 처음으로 접하게 되었다.transform.DOScale(3, 1);// Tweening 패키지 DOTween을 사용하는 예시이다. 확장 메서드란?기존에 있는 클래스 외부에서 메서드를 구현하고, 추가되는 메서드이다.확장 메서드는 정적 클래스에서만 구현 가능하다.기존 클래스의 메서드처럼 사용 가능하다.콜라보 상품을 예시로 간단하게 설명해보겠다.회사 'alphabet'과 회사 'number'가 콜라보 제품을 출시하였다.'alphabet'의 콜라보 상품 'A'를 구매하면 'number'의 굿즈 '123'을 받을 수 있다.'123'을 받기 위해서, 무조건 'A'를 구매해야 된다.'alphabet'은 구매하면 '123'을 받을 수 있는 상품 'A'를 만들었지만, '12.. 2025.07.02
- 메서드 체이닝 나는 여러 클래스들에서 사용 가능한 유틸리티 클래스들을 만들어서 사용한다. 제작한 클래스의 메서드를 사용하는 과정에서 아래와 같은 상황이 발생했다.(클래스A).(메서드1);(클래스A).(메서드2);(클래스A).(메서드3);// 사용된 클래스와 메서드는 단순한 예시입니다. 하나의 클래스에서 메서드 여러 개의 메서드를 사용하는 경우, 코드에서 불필요하게 줄 길이가 늘어난다고 느껴졌다.메서드 체이닝이란?한줄에서 클래스의 메서드를 연속적으로 호출하는 것이다.public class Test : MonoBehaviour{ private Collider2D col = null; public void Start() { col = transform.GetChild(0).GetChild(0).GetComponent().. 2025.06.30
- 에디터/빌드 환경에서 Instance의 차이 Addressable Asset을 사용하면서 알게 되었던 Instance 개념에 대해서 정리해 볼 것이다. Addressable Asset에 대해서 모르시더라도, 내용을 이해하는 데에는 문제 없습니다.개요public static async Task LoadingToPath(string path) where T : Object{ AsyncOperationHandle handle = Addressables.LoadAssetAsync(path); // GameObject를 불러온다. await handle.Task; // GameObject를 불러올 때까지 대기한다. GameObject result = GameObject.Instantiate(handle.Result); // 변수에 GameObject의 인스.. 2025.06.25
- Tweening 구현(2) Tweening 구현(1) Tweening 구현(1)이번 글은 기록을 목적으로 작성되었습니다. 게임을 만들면서 다양한 효과 구현이나 연출에 대해서 알아보다가 처음 접하게 되었다. DoTween이라는 에셋도 있었지만, 나는 Unity에서 공식으로 지원fore4022.tistory.com Ease 부분은 이번 글에서 생략했습니다. 아직은 많이 부족한 부분이 있는 것 같습니다. 그래도 만들어진 메서드들을 사용해서 만든 것을 보고난 후에는 기분이 너무 좋았습니다. 더 많은 것을 해보고 싶다는 마음이 드네요.using UnityEngine;public static class TweenSystem{ // Scale public static Component SetScale(this Component co.. 2025.05.12