스파르타내일배움캠프TIL 60

[Unity] 강화카드 중복 제한 로직 구현 및 딕셔너리 기반 구조 개선하기

구현 배경타워 디펜스류 게임에서 강화카드를 사용하여 타워의 능력치를 상승시키는 시스템을 만들었습니다.하지만 개발 도중 다음과 같은 문제가 발생했는데요.같은 강화카드를 반복해서 뽑을 경우 능력치가 무한히 상승한다는 문제였습니다.예를 들어 사거리 증가 카드를 계속 뽑는다면, 게임 후반에는 사정거리가 화면 밖까지 닿는 상황도 발생할 수 있었죠.그래서 저는 카드별로 뽑을 수 있는 최대 횟수를 제한하는 구조를 설계하기로 했습니다.기존 방식의 문제처음에는 아래와 같이 SelectedCard() 메서드 내에서 하드코딩된 조건문으로 각각 제한을 걸었습니다:if ((cardKey == 4101 && currentAmount >= 3) || (cardKey == 4103 && currentAmount >= 4) ||..

[Unity] 프로젝트 XSD 중간발표 회고 – 기능 너머의 고민들

오늘은 프로젝트 중간발표 날이었다지금까지 만들었던 시스템을 정리하고, 발표 자료를 준비해 팀원들 앞에서 설명했다.발표는 짧았지만, 그 과정을 통해 무엇을 만들었는지보다어떤 생각으로 만들었고, 어떤 고민이 있었는지를 더 깊이 되돌아보는 시간이 되었다.발표를 준비하며처음 발표 자료를 만들 때는 지금까지 구현한 기능들을 순서대로 나열하고,그 기능이 어떤 역할을 하는지만 간단히 소개하는 방식으로 구성했다.발표에서도 자연스럽게 “이건 이렇게 동작합니다”, “이 기능은 이런 이유로 만들었습니다”라는 식으로 설명했다.하지만 발표 이후 받은 피드백은 예상과 조금 달랐다.단순히 '기능을 소개하는 발표'보다 더 중요한 건,그 기능을 만들 때 어떤 선택을 했고, 왜 그 방법을 택했는지를 설명하는 것이라고 하셨다.예를 들어 ..

[Unity] 타워디펜스 게임에서 2배속 기능과 실시간 타이머 유지 구현

타워디펜스 게임을 만들다 보면적 유닛의 움직임이나 웨이브 진행 속도를 빠르게 하고 싶은 경우가 많습니다.이럴 때 Time.timeScale을 활용한 배속 기능이 유용하지만,실시간으로 흐르는 플레이 타이머까지 함께 빨라져 버리는 문제가 발생합니다.구현 목표버튼 클릭으로 게임 배속을 1배속 ↔ 2배속으로 전환배속 여부와 무관하게 **UI 타이머(GamePlayTimer)**는 실제 시간 기준으로 작동타이머는 게임 진행 시간(분:초)을 표시배속 버튼 구현[SerializeField] private Button speedButton;[SerializeField] private TextMeshProUGUI speedText;private bool isFast = false;private void Start(){ ..

[Unity] NavMeshAgent 장애물 감속 문제 (트러블슈팅)

문제 상황NavMeshAgent가 적용된 적 오브젝트들이 장애물 옆을 지나갈 때 이동 속도가 갑자기 느려지거나 멈칫하는 현상이 발생했습니다.특히 장애물의 모서리나 좁은 통로에서 이 문제가 더 자주 나타났습니다.1차 시도 – NavMeshAgent 속성 조정먼저 NavMeshAgent 컴포넌트의 다양한 옵션을 조절해보았습니다.Angular Speed (회전 속도)Acceleration (가속도)Stopping Distance (정지 거리)Auto Braking (자동 감속)Radius (에이전트 반지름)Obstacle Avoidance Quality (회피 품질)하지만 이 설정들만으로는 문제가 해결되지 않았고, 장애물 옆에서의 감속 현상은 여전히 발생했습니다.2차 시도 – 장애물과의 간격 확보이번엔 장애물..

[Unity] itch.io에 WebGL 빌드 게임 업로드하는 방법

Unity로 만든 게임을 웹에서 빠르게 테스트하거나,외부에 배포하고 싶은 경우, itch.io는 정말 좋은 선택지가 됩니다.저는 이번에 개발 중인 **MVP(최소 기능 제품)**와 프로토타입을직접 WebGL로 빌드해 업로드하면서,빌드 결과를 웹에서 바로 확인하는 데에 itch.io를 활용해 보았습니다.원래 Unity에서도 Unity Play라는 플랫폼을 통해 게임을 올릴 수 있지만,Unity Play는 해상도 설정이 제한적이라 제가 원하는 비율(예: 세로형 9:16)로 제대로 테스트할 수 없었습니다.그래서 직접 해상도와 임베드 설정이 가능한 itch.io를 선택하게 되었어요.이번 글에서는Unity WebGL 빌드부터 itch.io 업로드까지처음 해보는 분들도 쉽게 따라 할 수 있도록 단계별로 정리해 보았..

[Unity] SoundManager 기능 확장 - 씬별 BGM 자동 재생 추가

오늘은 전에 만들었던 SoundManager에 씬에 따라 자동으로 BGM이 재생되는 기능을 추가해봤습니다.게임을 만들다 보면, 로비에서는 로비 음악, 전투에서는 전투 음악을 따로 틀어줘야 하는데요.이걸 매번 수동으로 호출하지 않고 자동으로 바뀌게 만들고 싶어서 이번 업데이트를 진행하게 되었습니다.추가된 주요 기능씬 이름에 따라 BGM 자동 변경새로 추가된 메서드: PlayBGMForScene(string sceneName)씬 이름(MainScenes, BattleScenes 등)에 따라 미리 정한 BGMType을 선택해서 재생합니다.만약 등록되지 않은 씬이면 콘솔에 경고 로그를 출력합니다.public void PlayBGMForScene(string sceneName){ BGMType bgmType..

[Unity] 씬 전환 로딩 화면 구현 (LoadingSceneController)

게임에서 씬이 전환될 때, 사용자에게 아무런 안내 없이 정적 화면이 뜨면 어색하게 느껴질 수 있습니다.이번 글에서는 그런 어색함을 줄이고, 부드러운 씬 전환을 만들기 위한 로딩 UI 시스템을 직접 구현해봤습니다.페이드 인/아웃, 로딩바, 그리고 '로딩중...' 애니메이션까지 포함되어 있어 바로 활용하기 좋습니다.구현 목표 및 개요씬 전환할 때 로딩 화면을 보여줍니다.검은 화면이 서서히 나타나면서 페이드 인/아웃 효과를 줍니다.로딩 진행도를 보여주는 로딩 바를 표시합니다.'로딩중...' 텍스트에 점이 하나씩 추가되는 애니메이션을 적용합니다.외부에서 로딩 완료 후 추가 동작을 지정할 수 있도록 콜백 기능을 지원합니다.코드 설명 (파트별 분리)1. 변수 선언 및 초기화[SerializeField] privat..

카테고리 없음 2025.04.25

[Unity] 경험치 보상 추가 및 보상 시스템 구조 리팩토링

기존에는 TakeReward라는 클래스를 통해 적을 처치했을 때 드랍되는 아이템 보상을 관리하고 있었습니다.해당 구조는 단순한 보상 지급만을 처리하는 형태였기 때문에 다음과 같은 문제점이 있었습니다:보상 아이템의 수량이 고정(항상 1개) 으로 처리됨경험치 보상을 아이템으로 나눠주는 기능이 없음향후 기능을 추가하거나 확장할 때 기존 구조 전체를 수정해야 하는 부담이전에 사용한 구조가 궁금하신 분들은 아래 글을 참고하시면 됩니다.👉 이전 보상 시스템 구조 [Unity] 보상 드롭 시스템 및 UI 구현이번 프로젝트에서는 유니티 기반의 게임에서 몬스터 처치 후 발생하는 보상 아이템을 드롭 테이블 기반으로 계산하고, UI에 시각적으로 표현하는 기능을 구현하였습니다.보상 드롭 로직은 기danpat77.tistor..

[Unity] 경량화와 재사용을 위한 오브젝트 풀 구조 설계하기

게임을 만들다 보면 일정 시간만 화면에 나타나는 오브젝트들이 반복적으로 생성되고 삭제되는 상황이 자주 발생합니다.예를 들어 다음과 같은 것들이 있습니다:적 처치 시 드랍되는 골드나 경험치총알이나 이펙트 등 짧게 등장하는 오브젝트들처음에는 Instantiate()와 Destroy()를 반복해서 사용했지만,이 방식은 성능 저하와 메모리 낭비, 그리고 GC 문제로 이어졌습니다.그래서 이번엔 이를 해결하기 위해 오브젝트 풀링(Object Pooling) 시스템을 직접 구현해 보았습니다.구현 목표 및 개요매번 Instantiate() 없이 오브젝트를 재사용오브젝트 타입별로 구분된 풀을 관리할 수 있는 구조새로운 타입의 오브젝트가 생겨도 쉽게 확장 가능한 구조 설계코드 구현ObjectType 정의public enu..

[Untiy] AudioMixer 기반의 BGM & SFX 사운드 매니저 제작하기

이번에는 사운드를 체계적으로 관리하기 위해AudioMixer를 기반으로 한 BGM / SFX 분리형 사운드 매니저를 제작해봤습니다.슬라이더로 실시간 볼륨 조절도 가능하고,버튼으로 음소거/해제 시 아이콘이 바뀌는 기능까지 구현했습니다.구현 목표 및 개요 BGM과 SFX를 AudioMixer를 통해 개별 제어슬라이더로 실시간 볼륨 조절음소거 버튼 클릭 시 아이콘 변경씬 전환에도 BGM 유지슬라이더 값 0일 경우에도 자동으로 음소거 아이콘 반영1. AudioMixer 설정MainMixer 생성Assets > Create > Audio > Audio MixerGroup 분리Master 하위에 BGM, SFX 그룹 생성Volume 파라미터 Expose각 그룹의 Volume 슬라이더 → 우클릭 → Expose to..