이제 최종 프로젝트에서 절차적 생성을 이용한 필드 확장 기능을 작업하기 시작했다.그러니, 오늘은 절차적 생성에 대해서 정리 해 보자.절차적 생성이란?'절차적 생성', 최근 들어 게임계에서 매우 자주 듣게 되는 단어다.이 절차적 생성 자체를 주요 포인트로 삼은 게임도 있고, 반대로 '손으로 그린' 것을 특징으로 삼은 게임도 있다.그렇다면 절차적 생성이 무엇이길래 이렇게 최근 들어 키워드로서 자주 활용되는 것일까. 일반적으로 '절차적 생성'이라고 말하면 레벨의 절차적 생성을 이야기 하는 경우가 많다.그도 그럴게, 가장 눈에 띄로 체감도 잘 되는 영역이 레벨의 적차적 생성이라서...그렇다 보니, 절차적 생성이 '필드 구성을 자동으로 생성하는 기능'으로 오해하는 경우도 있다고 알고 있다. 결론 부터 말하자면, ..
이번에는 인벤토리 시스템에 대해서 정리 해 볼 예정이다.인벤토리의 시스템의 전체적인 구성본작의 인벤토리는 총 3종류로 나뉜다.Dungeon Inventory던전 탐색 중에 활용되는 인벤토리.던전 탐색 도중에만 유효한 임시 인벤토리로, 던전에서 나갈 경우에는 다음 과정을 거쳐서 초기화된다.사망으로 인하여 탈출하는 경우, '탈출 실패'로 간주하여 소지품과 소지금의 일부가 유실된다.탈출한 경우에는 모든 소지품과 소지금이 유지된다.위 과정의 끝에 남아있는 소지품과 소지금은 Village Inventory로 이동한다.본 인벤토리로 습득되는 아이템은 ItemLog가 표시된다.Village Inventory마을에서 사용 가능한 인벤토리로, 보관함과 상호작용 시 이용 가능하다.인벤토리 UI는 사실상 본 인벤토리에만 존..
유니티를 다루다 보면 자연스럽게 다루게 되는 것이 바로 씬이다.Scene이라는 그 명칭마냥, 하나의 '장면'을 담당하는 요소.이래저래 활용법은 간단하긴 하지만, 플레이 경험에 비교하면, 로딩 최적화를 고려하면 이것도 좀 복잡하게 구성해야 한다. 그렇다면, 어떻게 하면 될 것인가.사실, 여기에는 꼼수가 좀 많이 쓰인다.사실 최적화 요소들도 대부분 '보이지 않는 영역'을 이용한 꼼수이지만 말이다.실내와 실외는 알고보면 같은 공간가장 기초적인 사항. '실내'를 구현한다고 해서 씬을 새로 작성하면 안된다는 내용이다.이유는 간단하다. 그 만큼 씬 로딩이 자주 일어나니까.씬 로딩 자체가 Don't Destroy On Load로 지정된 오브젝트들 이외에는 전부 날려버리고 새로 쌓아올리는 것이다 보니 부하가 크고, 그..
유니티에서 외부 파일을 할당하는 가장 기초적인 방법은 하나는 '인스펙터에서 직접 넣어주는 것'이다.사실상 인스턴스에 직접 배정해 주는 셈이라서 이렇게 구성하면 별다른 복잡한 과정 없이 외부 파일을 할당할 수 있지만, 동적 생성되는 오브젝트나 오브젝트 풀 같은 곳에서 활용하기에는 메모리 최적화 상으로도 그렇고 이래저래 난감한 편이라는 문제가 있다.물론, 스크립터블 오브젝트를 활용해서 구성한다던가 하는 것도 가능은 하긴 한데, 어찌되었건 인스펙터를 건드려야 한다 [= 유니티를 만져야 한다.]는 점에서 기획자가 능동적으로 사용하기는 난감하다. 그렇다 보니, Resources.Load와 Adressable Asset 등의 방법으로 스크립트를 통해서 불러오게끔 구성하고, 이를 Json 등의 문서화 파일과 연동시킴..
유니티로 프로그래밍을 하다 보면은 자주 사용하게 되는 것이 바로 오브젝트 풀이다.공격 오브젝트 부터 시작해서 몬스터 오브젝트 등, 생성과 파괴가 잦은 것들은 일단 오브젝트 풀에다가 넣어버리게 되는 것이 보통이다 보니, 별 수 없지 않나 싶다. 다만, 이 오브젝트 풀에도 난점은 있다.간략하게 알아보자.'오브젝트' 풀오브젝트 풀에 대해서는 일전에 정리한 바 있다.[참고 URL: https://lsu0503.tistory.com/84] 일반적으로 오브젝트 풀을 설명할 때에는 게임 오브젝트를 풀의 내용으로 기술하는 경우가 많다.그도 그럴게, 그렇게 하면 굳이 다른 작업을 할 필요 없이 오브젝트 풀을 구현할 수가 있으니까.그렇다 보니 오브젝트 풀을 처음 접하는 경우에도 GameObject 기반으로 만드는 경우가 ..
※ 오늘은 간단한 내용이 될 예정이다. 간혹가다가 드는 생각.조건문을 만들 떄 마다 라인이 4개 이상이 된다는 것, 조금 불편하지 않은가.물론, 엔터로 정리를 하지 않는다고 하면 2줄으로도 충분히 작성 가능하긴 하다.익숙해지면 if else 정도는 그냥 무감각하게 입력하고 있기도 하다. 그래도 1줄로 줄일 수 있다면 코딩하는 데에 드는 시간이 조금은 줄어들 것이다.조건 연산자피연산자의 개수가 3개인 연산자로, 조건에 따라서 결과물이 달라지는 연산자다.a = b b 여기에 함수를 넣으면 함수가 조건식 혹은 결과값이 되는 형식.물론 if else 구문을 쓰는 방법도 있지만, 이 경우에는 ?와 :만 추가하면 되기 때문에 익숙해지기만 하면 이래저래 편하게 사용할 수 있는 것이 장점. 다만, 너무 길게는 쓰지 ..
금일은 액션 시스템을 어떻게 만들었는 가를 정리해 보고자 한다. 본 프로젝트의 액션 시스템은 다음 구성으로 작성되어 있다.BaseActionActor: 액션의 발동을 담당하는 클래스.ObjectPool에서 ActionObject 프리팹을 가져와서 각도를 설정한다.이후 아래의 ActionObjectContainer 클래스를 초기화한다.ActionObjectContainer: ActionObject의 정물(Pacade)에 해당하는 클래스.ActionPositionHandler: ActionObject의 위치를 담당하는 클래스.Hold: 사용 캐릭터의 하위 오브젝트로 적용. 캐릭터가 이동하면 ActionObject도 함께 움직인다.Projectile: 투사체로 발사. 발사 방향은 사용 캐릭터로 부터의 연장선으..
이번에는 델리게이트의 심화편, event에 대한 글이다.사실, 델리게이트 중에서 가장 많이 쓰이는 형태이다 보니, 어느 의미 기본에 해당하는 영역이기도 하다.그러니까 개념 위주로 간단하게 설명 해 보자. event란?event는 델리게이트의 일종으로, 특정한 상황에 대한 반응을 만들어내는 용도로 사용된다.event로 선언된 델리게이트는 event가 선언된 그 클래스 내부에서만 사용 가능하다. 이러한 구성을 이용해서 '특정 객체의 현상에 대한 반응'을 구성할 때 자주 쓰이는 기능.이제 이걸 선언하는 방식을 정리 해 보자.public event Action OnActionEventpublic event Func OnFuncEventAction은 반환값이 없는 경우에 사용하고, Func는 반환값(Treturn..
프로젝트 진행 중에 엑셀 등의 외부 요소와 연동을 하기 위해서 Json이나 Csv, ScriptableObject 등을 사용하는 건 일전에도 몇 번 설명한 적 있다.다만, 그 때에는 '직렬화/역직렬화 방법' 만을 서술했지, 그래서 어떻게 구성하면 되느냐는 서술한 적이 없다.그러니, 그것을 작성하는 방식에 대해서 '간략하게' 설명 해 보자.직렬화, 역직렬화직렬화는 프로그램 내부의 각종 요소들을 외부 프로그램으로 입/출력 할 수 있도록 '형태 자체를 간략화 시키는' 행위를 말하며, 역직렬화는 이렇게 '간략화 된 형태를 원상 복귀 시키는' 행위를 가리킨다.비단 게임 제작 뿐만이 아니라 프로그램 개발 전체에서 다른 부서와의 협업을 한다거나 자동화 시스템을 구축한다거나 하는 경우에 매우 자주 활용되는 개념으로, ..
상당히 단골 소재로 사용되는 소재인 '초기화'.다만, 실제로 써 보면 이 만큼 머리 아픈 요소도 별로 없다. 당연한 것이, 초기화 순서가 잘못되면 NullException이 뜨는데, 이 순서를 맞추는 것이 조금 만 복잡해 져도 머리가 아파진다.그렇기 때문에 이를 대처하기 위한 초기화 방식에도 종류가 다소 나뉘는 편.이전에는 '게임 오브젝트의 라이프 사이클과 이에 의한 난점'을 중점으로 서술했다면, 오늘은 '초기화' 그 자체에 집중 해 보자.외부 클래스 주체의 초기화초기화를 자기 자신이 시행하는 것이 아닌, 다른 총체 역할을 하는 클래스에서 하는 방식.Pacade 디자인과 함께 쓰면 강력한 초기화 방법으로, 초기화 순서와 시점이 확실하게 명시되기 때문에 이래저래 코드를 파악하기가 수월하다는 특징이 있다.초..