Unity 77

[Unity] 랜덤 스킬 카드 선택

스킬 데이터를 가져와 랜덤 스킬 3가지를 뽑고, 새로 고침 했을 경우 해당 랜덤스킬을 제외하고 나머지 스킬에서 랜덤으로 뽑되 만약 부족할 경우에는 랜덤 스킬에서 어쩔수없이 뽑는 형식의 카드 뽑기를 구현하는 코드이다. 스킬의 경우 플레이어가 현재 가지고 있다면 1레벨 높은 스킬을, 그렇지 않다면 새로운 스킬을 뽑는 형식이다. 스킬 데이터스킬 데이터의 경우 스킬 레벨이 1 ~ 5 까지 있다는 것에 가정하면 10001 ~ 10005 까지 skillid로 설정하여 스킬 데이터를 생성한다. "skills": [ { "Id": 10001, "Name": "파이어 볼", "PrefabName": "FireBall", "SpriteName": "FireballTexture"..

Unity 2025.07.19

[Unity] typeof(T) 와 GetType()의 차이

1. 개요 Projectile의 lifeTime에 따라 해당 시간이 지나면 알아서 파괴되게끔 설정하는 Despawn코드를 적용해 주었는데, 코루틴의 시간이 지나도 사라지지 않는 버그가 발생하였다. 그래서 디버깅을 해봤더니 T 제네릭이 ProjectileController의 부모 클래스인 SkillController로 해석되는 현상이 발생했다. 아래는 ObjectManger의 Despawn 메서드 중 if문에서 type이 SkillController가 들어오는 모습이고, 타고 올라가보면 StartDestroy() 함수에서 왔는데 이는 ProjectileController에서 상속을 받아 사용하고 있는 모습이다.  2. 문제 해결 생각보다 간단하게 해결되었다  typeof(T)를 사용하니 상속 클래스를 가져..

Unity 2025.02.18

[Unity] CSV 파일 적용하기

데이터 관리 방식에는 JSON, Scriptable Object, CSV 등이 있는데 각 사용처가 다르다. 그 중 CSV의 경우 보통 텍스트에 대한 데이터를 다룰 때에 CSV파일을 사용하게 되는데, 이를 적용하는 방법에 대해 알아보도록 하자. CSV 파일을 적용하는 방식은 시중에 나와있는 코드가 있기 때문에 적용만 시킨다면 쉽게 사용할 수 있다. 1. 구글 스프레드 시트구글 스프레드 시트를 이용해 액셀에서 필요한 값을 넣고, 이를 CSV파일로 변환하여 CSV파일을 만든다.   그렇다면 아래와 같은 파일명.csv라는 csv파일이 생성될 것이다. Key,TextsAttack1,공격력이 증가합니다 (소)Attack2,공격력이 증가합니다 (중)Attack3,공격력이 증가합니다 (대)Money1,플레이어의 돈 획..

Unity 2024.12.11

[Unity] Mathf.Clamp를 이용한 슬로우 적용

Mathf.Clam(value, min, max) 는 value라는 계산식을 min부터 max사이값만 허용시켜주는 함수이다. value가 min보다 작을 경우 min 값, max보다 넘어갈 경우 max값으로 반환한다는 상한선을 정해주는 함수이다. 해당 함수를 통해 슬로우를 최대 80퍼센트 적용하여 공격력에 비례하여 슬로우를 적용시킬 수 있다.  public void OnDeBuffed(CharacterStat stat) { if (_isDead || _isSlowed) return; float slowPercent = Mathf.Clamp(stat.Attack * 0.8f, 0f, 80f); float slowSpeed = Mathf.Max(0.2f, _mo..

Unity 2024.11.26

[Unity] Sprite Atlas 및 스프라이트 동적 변화

프로젝트 중 원래는 텍스트로 처리하던 방식을 스프라이트로 된 숫자로 변화를 줘서 만들고 싶다는 생각이 들어서 시도해 보았다. 플레이어의 돈이 변화할 때 Action을 통해 구독해둔 UI가 증감에 따라 함께 변하는 식으로 했는데, 텍스트의 경우 ToString() 으로 int를 string으로 변화하여 .text를 통해 전달하면 되지만, 스프라이트의 경우 이미지의 스프라이트를 동적으로 변화시켜줘야 하기 때문에 다르다.  Sprite Atlas 스프라이트 아틀라스는 프로젝트 세팅에서 Sprite Packer의 Mode를 Always Enable로 하면, Resource에서 Craete -> 2D -> SpriteAtals 항목이 생긴걸 볼 수 있다. 이를 생성하면 아래와 같이 보이는데, 밑에 Objects ..

Unity 2024.11.25

[Unity] EventSystem.current.IsPointerOverGameObject()

EventSystem.current.IsPointerOverGameObject()  EventSystem.current.IsPointerOverGameObject() 는 Unity의 EventSystem에서 제공하는 메서드로 현재 마우스 커서나 터치 입력이 UI요소 위에 있는지 확인하는데 사용된다. UI와 월드의 상호작용을 구분할 경우에 사용된다. 마우스 클릭 또는 터치가 UI위에서 일어날 경우 true를 반환하고, 아닐경우에 false를 반환한다. 어떤 경우에 사용되고 왜 사용했나?마우스 클릭으로 이동하는 게임의 경우 가장 많이 사용되는데, 필자의 경우도 디펜스 게임에서 상자 오브젝트에 캐릭터를 배치해야 하는 경우가 있다. 상자를 클릭하면 어떤 캐릭터를 배치할 지 목록이 나오는데, 문제는 해당 버튼 U..

Unity 2024.11.20

[Unity] Pooling에서 Queue와 Stack 의 선택 (지시어 사용)

오브젝트 풀링에서 최초에 Stack을 통한 오브젝트 풀링을 사용하고 있었다. Stack을 사용하는 방식과 Queue를 사용하는 방식의 차이점에 대해서 설명 및 왜 이러한 선택을 했는지에 대해 아래에 서술하겠다. 1. Stack과 Queue의 주요한 차이점Stack은 LIFO 으로 나중에 들어온게 처음 나가는 형식이다. 택배 상자를 쌓는다는 느낌으로 보면된다. 가장 아래에 있는걸 꺼내려면 이전에 넣었던 것들을 먼저 꺼내야 하기 떄문이다. Queue는 FIFO 으로 처음 들어온게 먼저 나가는 형식이다. 이는 양 쪽이 뚫린 기다란 원통에 당구 큣대로 공을 하나씩 밀어넣는 느낌 으로 생각하면 된다. 그러면 입구에 처음 들어간 당구공이 반대쪽 출구에 먼저 나가기 때문이다. Stack의 경우 마지막으로 생성된 객체..

Unity 2024.11.19

[Unity] Coroutine Manager

코루틴은 유니티에서 비동기적인 작업이나 순차적인 시간 작업을 효율적으로 처리하기 위해서 사용하는 방식이다. 코루틴을 활용하면 실행을 잠시 멈췄다가 다시 이어 실행할 수 있다는 특징이 있다.  코루틴 매니저를 만드는 이유여러가지 이유가 있지만, 가장 큰 이유는 특정 오브젝트가 활성화 비활성화가 반복되는 경우 (예시 오브젝트 풀링) 코루틴을 사용하게 되면 문제가 생긴다. 코루틴은 비활성화된 오브젝트 상대로는 작동하지 않기 때문에 풀링되는 오브젝트의 경우 중간에 코루틴이 동작하지 않는 치명적인 문제가 발생할 수 있다. 그리고 코루틴을 매니저를 통해 한곳에서 관리해준다면, 매번 코루틴 함수를 만들고 start를 하는 귀찮음에서도 벗어날 수 있고, 문제 생겼을 경우 참조로 빠르게 버그를 찾을 수 있기 때문이다. ..

Unity 2024.11.18

DataManager

Json을 불러와 줄 DataManager 생성 DataManger에서 적용할 데이터 (예시: 캐릭터 스탯)의 경우 Dictionary를 이용해 key와 value로 id값을 가지고 있게 하여 언제든 필요한 정보를 불러올 수 있게끔 저장해 둔다. ILoader 인터페이스로 ILoader를 생성해 상속받은 클래스를 Key와 Value를 가지는 Dictionary를 반드시 생성하게 끔 구현해 준다. public interface ILoader{ Dictionary Dict();}  LoadJsonLoader라는 새로운 함수를 파서 제네릭을 이용해 다양한 데이터를 받을 수 있게 구현한다. 이 Loader는 Json으로 역직렬화 한 정보를 return해주는 역할이다. Loader LoadJson(strin..

Unity 2024.11.16

[Unity] 몬스터 데미지 구현 (UI Pooling)

몬스터에 가하는 데미지를 구현하는데 추후에 수많은 캐릭터들이 수많은 몬스터를 때린다고 가정했을 때 데미지를 나타내주는 텍스트를 계속해서 생성하고 파괴했을 경우 비용이 적지않아 들거라 생각이 들어서 몬스터 각각에게 생성시에 데미지 Pooling UI를 달아주면 해결이 된다고 생각되어 이를 구현하게 되었다. 1. 기존 Pooling기존에 오브젝트를 풀링하는 방식은 오브젝트를 Instantiate 할 때 클래스 (Poolable) 이 달려있다면, 이를 Pop하여 풀링하는 오브젝트로 만들어주는 방법으로 Pooling을 구현하였다. 이때 Pooling할 오브젝트의 프리팹 이름으로 Dictionary에 저장하여 Key값을 통해 Pop 과 Push를 불러오게끔 구현하는 방식이다. 2. Pooling 구현GameMan..

Unity 2024.09.23