게임개발 46

[Unity/TIL] 2D 게임에서 특정 오브젝트 바라보도록 회전시키기

타워가 발사하는 발사체가 타겟을 계속 쫓아가게(유도탄처럼) 만들었다. 그런데 어떤 발사체에 애니메이션을 넣고 보니 애니메이션에 방향이 있어서 방향도 회전시켜줘야 한다!! 3D였다면 transform.LookAt()이나 Quaternion.LookRotation()를 사용했을 것 같다. 근데 이 함수들은 2D에서는 안됨!!! 내가 알아서 Z축 회전을 해줘야 한다. (2D Sprite는 XY 평면에서 돌아가므로, Z축 회전을 계산해야 함.) 우선 발사체가 기존에 바라보던 방향에서 얼만큼 회전해서 타겟을 바라봐야하는지를 알아야 한다. 먼저 발사체가 향해야 할 방향 벡터를 구하고, 이 벡터가 원점 기준으로 만드는 각도를 Mathf.Atan2()로 계산한다. 두 벡터 사이각을 구할 때는 아크탄젠트를 쓰면 된다...

[Unity/TIL] DataManager 사용성 개선

우리 프로젝트에서는 기획자님께서 Google Sheet에 데이터 테이블을 작성하기를 희망하셨기 때문에 UGS(Unity Google Sheet)를 사용해서 데이터 테이블을 읽어오고 있다. https://shlifedev.gitbook.io/unitygooglesheets Unity Google Sheet | UGS 개발문서무료 오픈소스 라이브러리 입니다.shlifedev.gitbook.io DataManager에서 데이터를 미리 로드해서 캐싱해놓는 역할을 한다. 팀원들 모두가 가져다 쓸 일이 많은데 사용성이 너무 구려서 조금이나마 개선했다.개선점 1. 데이터 담아두는 Dictionary의 타입 변경이전에 Dictionary> 타입으로 데이터를 받아놨었는데, 키가 string이라서 오류 가능성이 있고 타입..

[Unity/TIL] '오집마' 최종 프로젝트 개발일지

맵 수정맵 스크롤 가능 여부, UI 자리를 고려한 맵으로 수정제작했다. UX에 대해 공부해보고 싶을지도. 타워 Base 제작타워 로직(Brain)과 외형(Body)의 Base들을 완성하고 구체화 테스트를 조금이나마 해봤다. 고민했던 부분들 작성함. RangeTowerController범위형 공격을 하기 때문에 범위 내에 있는 모든 적에게 타워 자신의 Cooldown에 맞춰 공격한다.범위 내 적을 탐지할 때는 콜라이더의 Trigger를 사용했다. Enemy가 OnTriggerEnter 되면 타겟에 포함시키고, OnTriggerExit 될 때는 타겟에서 제거한다. 타겟을 담고 있을 자료구조를 선택할 때 다음과 같은 사항들을 고려했다.삽입, 삭제가 자주 일어난다. 전체 순회를 돌아야 한다.위 두가지를 충족..

[Unity/TIL] MonoBehaviour 상속받지 않는 곳에서 코루틴 사용하는 방법

이전에 MonoBehaviour를 상속받지 않는 클래스에서 코루틴을 사용하고 싶었지만 코드에서 Coroutine이 찾아지지 않았다(에러났다는 뜻). 그래서 이 때 처음 알게 된 사실은 코루틴은 MonoBehaviour에 종속되어 있다는 것이다!!! 당시에는 당황스러워서 그냥 해당 클래스에 MovoBehaviour를 상속받았다..ㅋㅋ  오늘은 Managers에서 통합 관리당하는(?) WaveManager 클래스에서 코루틴을 사용하고 싶었다. 오늘은 다른 방법으로 MonoBehaviour를 상속받지 않는 클래스에서 코루틴을 사용할 수 있었다. 우리팀 팀원분께서 알려주신 방법인데 감동받아서 TIL로 남긴다. 상윤님 천재세요!?!?직접 실행하려면 반드시 MonoBehaviour의 StartCoroutine()을..

[Unity/TIL] 싱글톤 매니저 관리

이번 프로젝트에서는 싱글톤 매니저의 관리 방식을 다르게 한다. 원래 내가 사용하던 방식은 제네릭 싱글톤 클래스를 만들고, 싱글톤으로 만들어져야 하는 매니저 클래스들이 그 싱글톤 클래스를 상속받는 방식이었다.  이번에는 통합 Managers에서 모든 매니저를 관리해주는 방식을 사용하기로 했다. 이렇게 관리했을 때 매니저 클래스들의 초기화 순서를 지정할 수 있다는 점이 큰 장점으로 느껴졌다. 매니저 클래스를 개별 관리할 때 의존성 순서가 꼬이면 골치아팠기 때문에 이 방식이 마음에 들었다!using System.Resources;using UnityEditor.EditorTools;using UnityEngine;public class Managers : MonoBehaviour{ public stati..

[Unity/TIL] Addressable 연구(2)

2025.04.08 - [공부 기록/유니티 Unity] - [Unity/TIL] Addressable 연구 [Unity/TIL] Addressable 연구이번 프로젝트에서는 Addressable을 사용할 것이다. 빌드 시 Resources.Load를 사용하는 것보다 무조건 빌드 용량에 이점이 있기 때문이다. 그외에도 다음과 같은 장점들이 있다. 서버와 Addressable을 함ramenkirby.tistory.com Addressables.ResourceManager.CreateGenericGroupOperation(operations);어드레서블에서 제공하는 위 함수를 사용하면 operations 리스트를 하나의 Group Operation으로 묶어준다. 이것도 로딩이 완료될 때 Completed를 제..

[Unity/TIL] Addressable 연구

이번 프로젝트에서는 Addressable을 사용할 것이다. 빌드 시 Resources.Load를 사용하는 것보다 무조건 빌드 용량에 이점이 있기 때문이다. 그외에도 다음과 같은 장점들이 있다. 서버와 Addressable을 함께 사용하면 빌드 후에 원격에서 리소스를 수정하는 것이 가능해진다. 클라 재배포 없이 패치가 가능한 것이 짱 큰 이점이다. (우리는 서버를 사용하지 않을 수도 있지만)비동기 로딩이 가능하다. 프레임 드랍 없이 자연스러운 로딩화면을 구현할 수 있다. 내부적으로 에셋 번들을 별도로 관리해준다.리소스마다 라벨, 키 지정 가능해서 리소스 그룹 관리 편리하다. Addressable 이해를 도와주신(사실 떠먹여주신) 짱동료 송석호님께 왕큰감사를 드림미댜... (●'◡'●)전반적인 프레임워크 구..

[Unity/TIL] 2D 최적화(2) - 드로우 콜 줄이기, 캔버스 중첩

드로우 콜 줄이기Frame Debugger 에서 지금 화면이 어떤 과정을 거쳐서 그려졌는지 볼 수 있다. Window > Analysis > Frame Debugger현재 예시 프로젝트에서 UI의 드로우콜이 33회 발생하고 있다. Sprite들을 한 번에 묶어서 그릴 수 있게 묶어줄 수 있는 Sprite Atlas가 있다.=> 묶여있는 Sprite끼리는 한 번에 그려짐=> 드로우 콜을 줄일 수 있다.! Sprite Atlas 만드는 방법Sprite Atlas를 Create하고, 한 번에 그릴 Sprite들을 넣어준다. 폴더째로 넣어줘도 된다. Tight Packing 끄기 (선택사항)Tight Packing을 켜주면 가운데가 비어있는 프레임 이미지같은 것들과 다른 이미지가 겹치기도 한다. Tight P..

[Unity/TIL] Grid Building 시스템 만들기 | 트러블 슈팅: 위로 쌓아지지 않는 문제, Grid의 경계면에서 Cell이 의도대로 선택되지 않는 문제 해결

게임에서 자주 볼 수 있는 기능인데, 맞춰진 격자에 맞춰 물건을 배치할 수 있도록 규격을 제시하는 크래프팅 시스템을 만들고 싶었다. 우선 C++로 타일맵 시스템을 만들었던 기억을 되짚어보며 직접 계산할 방법을 떠올려보았다. 임의로 Grid 한 Cell의 크기를 설정하고, 마우스 포인터의 위치를 Cell 크기에 기반한 계산을 통해 몇번째 Cell인지 알아낼 수 있도록 하려고 했다. Cell의 Index를 구하면 [중심값 + Index.x * Cell 크기] 같은 식으로 중심의 point를 알 수 있다.  그런데 유니티에서 Cell의 Index 계산과 특정 Cell의 중심점의 World Position을 구하는 기능을 제공하는 컴포넌트가 있다.!! 바로 Grid이다. 유니티에서는 타일맵 에디터를 제공하는데,..

[Unity/TIL] 인벤토리 / 아이템 구현, FSM, AI Navigation 복습

인벤토리 / 아이템 구현슬롯형 인벤토리를 만들었다.마우스 호버 시 아이템 정보를 보여주고 클릭 시 장착된다. 아쉬운 점아이템은 Scriptable Object로 관리했으나 데이터로서 관리되지 않고 아이템에 각각 붙어있다..ㅎ  이렇게 하면 데이터를 아이템마다 따로 복사해준 것이다. 한 아이템 데이터가 3개씩 3종류니까 SO가 총 9개 복사되어 있는 거다. 원래 SO들을 어딘가에 한 번 로드해두고 참조하는 식으로 해야 효율적이다.!!=> 데이터 개수만큼만 로드하고, 참조해서 사용하기. 애초에 오브젝트 풀도 없이 씬에 아이템 9개를 뿌려놓고 아이템이 사라지고 나면 알아서 3초뒤에 리젠되도록 만들었다.UI 구조플레이어 AI 만들기플레이어가 아이템을 스스로 먹으러 찾아 다니도록 만들고 싶었다. AI Naviga..