부트캠프/Unity [ 스파르타 ] 62

[스파르타 ][TIL] 유니티 스파르타 7기 60일차 - 애널리틱스

🎮 게임 애널리틱스란?게임 플레이 중 수집되는 데이터(이벤트)를 분석해서 게임의 품질과 수익성을 향상시키는 작업입니다.📊 예를 들어 어떤 데이터를 수집하는가?유저가 게임에 접속한 시간, 플레이 시간어떤 스테이지에서 많이 죽는지아이템 구매 여부 / 결제 기록광고 시청 횟수튜토리얼 완료 여부이탈(탈주) 시간과 이유 추정📈 분석 결과로 뭘 할 수 있는가?유저 이탈 구간 개선 (ex. 너무 어려운 스테이지 난이도 조정)인기 없는 아이템 삭제 또는 리워크광고 전략 최적화 (언제 광고를 넣는 게 효과적인지)결제 유도 UX 개선🛠️ 어떻게 사용하는가?Unity 기준으로 설명하면:1. Unity Analytics (Unity에서 제공하는 기본 애널리틱스 서비스)간단한 설정만으로 자동 수집 가능 (플레이 시간, ..

[스파르타 ][TIL] 유니티 스파르타 7기 58일차 - UniTask

🔷 1. 왜 UniTask를 쓰는가?Unity는 기본적으로 Coroutine 기반의 비동기 처리를 제공하지만, 다음과 같은 단점이 있습니다:Coroutine의 단점UniTask의 장점반환값을 가질 수 없음UniTask로 반환값을 가짐예외처리가 번거로움 (try-catch 안됨)try-catch로 자연스럽게 예외처리 가능중첩 호출 시 복잡하고 유지보수 어려움await로 직관적인 비동기 흐름 가능GC 발생 없음(좋음)이지만 타입 제약 있음UniTask는 GC 거의 없음 + 제네릭 지원🔷 2. UniTask 기본 사용법✅ 단순 지연using Cysharp.Threading.Tasks;public async UniTaskVoid DelayExample(){ Debug.Log("Start"); aw..

[스파르타 ][TIL] 유니티 스파르타 7기 57일차 - 어드레서블

전투에 필요한 유닛 로직을 먼저 생성하고, 외형 리소스는 비동기로 따로 로드하는 구조를 사용하면,방치형 게임에서 빠르고 효율적인 유닛 스폰이 가능하다.- 왜 어드레서블을 사용했는가방치형 게임에서 전투는 멈추지 않고 유닛이 자주 등장한다. 유닛을 생성할 때 프리팹 전체를 로드해서 스폰하면 다음과 같은 문제들이 있다.Addressable에서 비동기로 받아와서 생성하기 때문에 완전히 로드될 때까지 딜레이가 발생. (-> 그동안 전투를 시작할 수 없음)메모리 낭비 및 프레임 드랍 가능성 발생. 문제를 방지하려면 모든 유닛의 애니메이션, 사운드, VFX와 같은 외형 데이터를 미리 로드해야 함. - 우리 프로젝트에서 어드레서블을 사용했을때 이점빠른 전투 시작 - 로딩을 기다리지 않고 즉시 전투 시작 가능메모리 최적..

[스파르타 ][TIL] 유니티 스파르타 7기 56일차 - 대미지 계산법

대미지=내 공격력×(log10​(적 방어력내 공격력​)×10)내 공격력적 방어력\frac{\text{내 공격력}}{\text{적 방어력}}적 방어력내 공격력​ : 공격력과 방어력의 비율을 계산합니다.log⁡10(비율)\log_{10}(비율)log10​(비율) : 이 비율의 로그를 취합니다 (밑은 10입니다).log⁡10(비율)×10\log_{10}(비율) \times 10log10​(비율)×10 : 이 결과에 10을 곱합니다.마지막으로, 내 공격력에 곱해 최종 대미지를 구합니다.주의할 점:공격력이 방어력보다 작으면, log⁡\loglog 값이 음수가 되기 때문에 대미지가 음수로 나올 수 있습니다.보통 게임에서는 음수 대미지를 허용하지 않고, 최소 0 이상으로 처리하거나, 수식을 수정합니다.방어력이 0이면..

[스파르타 ][TIL] 유니티 스파르타 7기 55일차 - 유니티 커스텀 에디터

🔥 Unity 커스텀 에디터 기본 이해커스텀 에디터란, Unity의 Inspector 창에 컴포넌트를 개발자가 원하는 대로 편집할 수 있도록 만드는 기능입니다.기본 Editor 대신 내가 만든 Editor 클래스를 연결해서 특정한 UI 구성이나 특별한 로직을 삽입할 수 있습니다.🛠️ 커스텀 에디터 많이 사용하는 기능기능설명EditorGUILayout 사용자동으로 레이아웃을 조정하는 다양한 입력 필드를 만듦 (TextField, Toggle, Slider 등)serializedObject, SerializedProperty 사용Undo, 멀티 오브젝트 편집, Prefab 수정 지원을 위한 안전한 데이터 접근버튼(GUILayout.Button) 추가버튼을 눌렀을 때 특정 메서드 실행조건부 필드 표시특정 ..

[스파르타 ][TIL] 유니티 스파르타 7기 54일차 - Atan2 활용

✅ 기본 개념🎯 목표:두 벡터 A와 B 사이의 각도를 **아크탄젠트 (Mathf.Atan2)**를 사용해서 구하는 방법🧮 수학 공식: atan2 방식🔹 atan2(y, x)는 "x축 기준으로 벡터가 이루는 각도(라디안)"를 반환합니다.즉, 방향 벡터의 각도를 구할 때 유용합니다.✅ 벡터 사이의 각도 구하는 순서🎯 두 벡터: A, B1.두 벡터의 방향 차이 구하기Vector2 delta = B - A;2. 아크탄젠트로 각도 구하기 (라디안)float radian = Mathf.Atan2(delta.y, delta.x);3. 라디안을 각도로 변환 (도 단위로) float degree = radian * Mathf.Rad2Deg; 🎮 예제 코드 (Unity C#)Vector2 A = new Vecto..

[스파르타 ][TIL] 유니티 스파르타 7기 53일차 - 신고 결과 받기

using System;using System.Linq;using System.Collections.Generic;public class Solution { public int[] solution(string[] id_list, string[] report, int k) { int[] answer = new int[id_list.Length]; // 실질적으로 필요한 메모리공간 int[] reportedCount = new int[id_list.Length]; Dictionary dict = new Dictionary(); Dictionary keys = new Dictionary(); // 키값저장 for(in..

[스파르타 ][TIL] 유니티 스파르타 7기 51일차 - 커맨드 패턴

🧠 TIL - 커맨드 패턴 (Command Pattern)📌 학습 내용커맨드 패턴은 요청을 객체로 캡슐화하여 서로 다른 요청, 큐잉, 로깅, 취소 등의 기능을 제공할 수 있는 디자인 패턴이다.**요청을 보낸 사람(Invoker)과 요청을 수행할 대상(Receiver)를 분리시켜, 실행 요청을 커맨드 객체로 전달한다.대표적인 구조는 다음과 같다:ICommand: 커맨드 인터페이스, Execute() 메서드 정의ConcreteCommand: 실제 실행 로직을 가진 커맨드 클래스Receiver: 실제 작업을 수행하는 클래스Invoker: 커맨드를 실행하는 주체 (예: 버튼, 메뉴 등)public interface ICommand{ void Execute();}public class MoveComman..

[스파르타 ][TIL] 유니티 스파르타 7기 50일차 - 인벤토리 UI 초기화 시 AddListener 중복 등록 이슈

🧩 문제 요약인벤토리 UI를 초기화하는 로직이 2번 호출되었음그 과정에서 Button.onClick.AddListener()도 두 번 호출결과적으로 버튼에 이벤트 리스너가 중복 등록되어, 버튼 클릭 시 메서드가 2번 실행됨특히 일괄 선택/해제 기능에서 비정상 동작(두 번 선택되거나 해제되는 현상)이 발생함✅ 해결 방법AddListener() 전에 기존 리스너 제거 필요→ button.onClick.RemoveAllListeners() 또는 특정 리스너 제거button.onClick.RemoveAllListeners();button.onClick.AddListener(OnClick);UI 초기화가 중복 호출되지 않도록 UI 초기화 위치를 명확하게 제어하거나 중복 호출 방지 조건 추가🤔 느낀점이벤트 등록..