2025/04 18

[스파르타 ][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기 52일차 - 비트 연산

비트 연산은 정수 값을 이진수(0과 1)의 조합으로 보고, 이 비트들을 직접 조작하는 연산입니다. Unity에서 레이어 마스크 처리, 플래그 체크, 퍼포먼스 최적화 등에 자주 사용됩니다.✅ 1. 주요 비트 연산자연산자이름설명&AND두 비트가 모두 1이면 1``OR^XOR서로 다르면 1~NOT (반전)0 → 1, 1 → 0왼쪽 쉬프트비트를 왼쪽으로 밀기 (2의 제곱배 증가)>>오른쪽 쉬프트비트를 오른쪽으로 밀기 (2로 나누기 효과) ✅ 2. 예제: 기본 비트 연산int a = 5; // 00000101int b = 3; // 00000011int and = a & b; // 00000001 => 1int or = a | b; // 00000111 => 7int xor = a ^ b; /..

카테고리 없음 2025.04.23

[스파르타 ][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 초기화 위치를 명확하게 제어하거나 중복 호출 방지 조건 추가🤔 느낀점이벤트 등록..

[스파르타 ][TIL] 유니티 스파르타 7기 49일차 - Variant

✅ 1. Addressables의 Variant (유니티 기준)의미: Addressables에서의 Variant는 리소스의 다른 버전을 의미합니다.예를 들어, 같은 프리팹이지만 고해상도 버전과 저해상도 버전이 있을 수 있고, 이들을 Variant로 구분해서 빌드/로딩할 수 있습니다.Assets/└── Prefabs/ ├── Character.prefab ├── Character_HD.prefab ← 고화질 Variant └── Character_LD.prefab ← 저화질 Variant사용법 개념:어드레서블 그룹에서 "Character"라는 키로 여러 Variant를 등록하고, 런타임 시점에 필요한 Variant를 로드합니다.// 유니티 Addressables 예시Addressab..

[스파르타 ][TIL] 유니티 스파르타 7기 48일차 - DoTween 시퀀스

✅ 상황 1: 부모 클래스에서 필드로 선언하고 인스턴스마다 생성하는 경우public class Parent{ protected Sequence mySequence; public Parent() { mySequence = DOTween.Sequence(); }}이 경우, Parent를 상속받은 각각의 자식 인스턴스는 자기만의 시퀀스를 갖습니다. 인스턴스를 만들 때마다 새로운 Sequence가 생성되기 때문입니다. ❌ 상황 2: 부모 클래스에서 static으로 선언한 경우public class Parent{ protected static Sequence mySequence = DOTween.Sequence();}이렇게 static으로 선언했다면, 모든 자식 클래스 인스..