종속성 분석 툴 제작설계나 리팩토링 과정에서 AI에게 코드를 분석해 달라고 요청했더니 클래스를 도식화하여 종속성을 나타내 보여주었는데 이러한 툴이 있다면 참 편할 것 같다고 생각하여 툴을 제작하려 한다.언리얼 엔진의 경우에는 참조 그래프를 그려주는 내장 툴이 있는데 유니티는 그래프는 아니고 다음과 같이만 표시를 해줬다.이걸로 어느 정도 알 수 있지만 클래스 간의 참조 관계를 알 수 없다.어디에 사용되는지 정도만 표시되는 것 같다.그래서 간단하게 스크립트를 지정하면 종속성을 그래프로 표현해 주는 툴을 제작하려 한다. 필요 기능 정리해당 툴에 필요한 기능을 간단하게 정리해보자.에디터 윈도우스크립트 선택종속성 검사그래프 그리기 에디터 윈도우해당 툴은 에디터에서 구조를 편하게 확인하려는 목적이기 ..
오브젝트 생성 최적화오브젝트를 여러 개 생성할 때 프레임 드롭이 일어나는 것을 발견하였다.30초 정도 게임을 진행시켰을 때 연출을 위해 쌓아둔 바둑돌들이 많이 쌓이며 프레임이 20대까지 떨어진다.이를 해결하는 방법을 연구해보자. 원인 분석우선, 씬에 존재하는 오브젝트는 거의 UI이고 성능에 크게 문제 될 것들이 없다.앞에서 말했듯이 바둑돌이 많이 쌓이는 것이 근본적인 문제인 것 같다. 첫 번째 시도단순하게 물체가 너무 많은 것 같아 움직이지 않는 바둑돌을 삭제하려는 시도를 했다.이때, 단순히 삭제하지 않고 바둑돌을 생성하는 객체에서 오브젝트 풀을 이용하여 관리하며 불필요한 생성을 막으려 했다.바둑돌의 RigidBody의 Sleep을 이용하여 Threshold를 적절히 조절하여 객체를 반환하..
VContainerVContainer는 Unity를 위한 경량화된 DI(Dependency Injection) 컨테이너이다.DI는 객체 간의 의존성을 외부에서 주입하는 디자인 패턴으로, 코드의 결합도를 낮추고 유지보수성을 향상시키는데 도움을 준다.주요 특징가볍고 빠른 성능Unity의 컴포넌트 시스템과의 원활한 통합직관적인 API 제공코드의 모듈화와 테스트 용이성 향상https://vcontainer.hadashikick.jp/ About | VContainerVContainer - the fastest DI (Dependency Injection) for Unity Game Enginevcontainer.hadashikick.jp 기본 구성요소LifetimeScopeLifetimeScope는 VC..
Scirptable ObjectScriptableObject(SO)는 Unity에서 제공하는 데이터 컨테이너 클래스이다.MonoBehaviour와 달리 GameObject에 부착되지 않는 독립적인 데이터 에셋이다.즉, Prefab과 같이 에디터상에 유일하게 존재하는 것이다.또한, Scene과 독립적으로 존재하며 런타임에 변경된 내용을 정적으로 저장하여 가져갈 수 있다.Scene 전환 시에도 데이터가 유지되며 한 번 로드된 SO는 메모리에 캐싱되어 재사용할 수 있다.빌드 시 에셋으로 포함되어 배포되게 된다. Unity 에디터에서 직접 데이터를 수정하고 저장할 수 있기 때문에 밸런싱같은 작업에서 사용하기 매우 좋다. Data Container SOSO는 기본적으로 데이터 컨테이너이다.즉, 순수하게..
MonsterURR은 다양한 몬스터가 존재한다.스테이지가 시작하면 미리 설정한 데이터에 의해 몬스터의 종류, 수, 간격 등의 정보가 초기화된다.해당 웨이브에 스폰된 몬스터가 모두 죽거나 목적지에 도착해 플레이어에게 피해를 입혀 월드에 존재하지 않으면 다음 웨이브가 실행된다.모든 웨이브의 몬스터를 처치하면 해당 스테이지를 클리어한다. Monster 생성설정된 정보를 통해 GA를 실행하여 몬스터를 생성한다.몬스터를 스폰하면 타이머를 설정해 몬스터끼리의 간격을 설정한다.void UURRGA_SpawnMonster::StartSpawnMonster(){ FActorSpawnParameters params; params.SpawnCollisionHandlingOverride = ESpawnActorColl..
Unit 클래스유닛을 초기에는 SkeletalMesh에 맞춰 애님 인스턴스를 지정하기 위해 분리하여 관리하였다.하지만, UAssetManager를 통해 Asset을 불러와 지정할 수 있기에 통합해도 된다고 생각했다.각 유닛에는 추가적으로 부착되는 SkeletalMeshComponent가 있어 이에 대한 조정이 필요했다.따라서, Rank에 따라 각 부위에 대한 AssetLoad를 요청하고 모든 Asset이 로딩되었다면 Callback을 주어 DeferredSpawn이 완료하게 되었다.UnitMeshHandle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(UnitMeshes[UnitMeshIdx], FStreamableDelegate::Cr..
UnitURR은 숫자별로 유닛이 달라진다.예를 들어, 1은 권총을 든 군인이고 2는 라이플을 든 군인이다.각 유닛은 공격력, 사거리, 공격 속도 등 다양한 스탯을 가지고 있으며 숫자가 높을수록 강해지도록 설계하였다. Unit 생성플레이어는 보유하고 있는 코인을 소모하여 생성할 수 있다.GE를 통해 coin을 소모하며, GA를 통해 유닛을 생성한다.GE에서 coin을 소모할 때, cost라는 메타 어트리뷰트를 사용해 확장성을 열어두었다.또한, GA에서는 확률에 따라 스폰할 유닛의 단계와 위치를 정하고 해당 타일에 Spawn요청을 한다. Unit 초기화유닛이 생성되면 스탯을 초기화해야 한다.유닛은 각 단계에 따라 스탯이 다르며 GE를 통해 초기화한다.초기화하는 시점은 ASC가 최기화되어야 하기..
Board URR은 4 x 4의 타일을 통해 숫자(유닛)를 나타내며, 사용자 입력에 의해 해당 숫자들이 합쳐지는 형식이다. 숫자를 나타내는 타일 16개가 따로 존재하면 입력에 의해 합쳐지거나 움직이는 등의 동작이 쉽지 않을 것이다. 따라서, 타일들을 하나의 Pawn으로 묶어 관리하고 해당 클래스에서 사용자 입력을 받아 처리할 예정이다. Tile Tile은 유닛과 해당 유닛의 숫자를 나타내는 액터이다. 해당 액터에서 타일의 유닛의 포인터를 관리하여 Spawn, Destory 등을 처리한다. Board의 BeginPlay에서 총 16개의 Tile을 생성하여 이차원 배열을 통해 관리한다. 이차원 배열을 사용한 이유는 네 방향의 이동이 가능한데, 이 작업에서 간편하게 계산하기 위함이다. 또한, 유닛의 단계(1,..
Level URR은 크게 보면 로비가 존재하고 로비에서 여러 스테이지를 골라 플레이할 수 있는 구조이다. 물론, 스테이지는 순차적으로 진행해야 한다. 로비는 크게 어려운 부분이 없으니 게임 로직부터 구현하기 위해 Stage를 우선적으로 구현할 예정이다. Stage Level Design LandScape를 통해 경사로와 언덕을 만들었고 페인팅을 통해 자연스럽게 연출하였다. 또한, 언덕의 경계선이 어색하지 않게 돌로 막아 놓았다. 주변에는 폴리지를 통해 숲 같은 느낌을 주었다. 유닛으로 사용하는 에셋이 군인들이라 풀, 자연 같은 분위기를 사용하였다. 하얀 타일위에 유닛들이 생성되고 타일에는 각 유닛의 단계(1, 2, 4...,1024)를 나타낼 것이다.
URR Defence GAS를 적용한 Defence게임을 만들 예정이다. URR 프로젝트 기간 2024.04.07 프로젝트 인원 1명 UE 버전 UE 5.3 git https://github.com/minhvvan/URR IDE VisualStudio 게임 시스템 URR은 우르르라는 뜻이다. 우르르라는 이름을 지은 이유는 2048게임을 응용하기 때문이다. 2048게임은 1, 2, 4등 2의 제곱수가 적힌 타일을 하나의 방향으로 움직이고, 서로 같은 수가 만나면 합쳐진다. 이러한 원리를 통해 최종적으로 2048을 만들어내는 게임이다. 이런 콘셉트를 이용하여 디펜스게임을 만들면 재밌을 것 같다는 생각을 했다. 하나의 방향으로 모든 타일이 우르르 몰려가기 때문에 URR라고 이름을 지었다. 이 프로젝트의 핵심은..