Zenject Zenject(ExZenject)는 Unity에서 사용할 수 있는 무료 DI 프레임워크이다. 이 글에서는 DI가 무엇이며, 이를 왜 사용하는 것이고, 어떻게 활용할 수 있는지에 대해 정리했다. 의존 관계 역전 원칙(DIP, Dependency Inversion Principle) 프로그래머는 추상화에 의존해야 하고, 구체화에 의존하면 안 된다. 게임을 개발을 예시로 들어보자. 각 유닛은 무기를 가지고 있고, 무기는 각각의 대미지가 있다. 여기서 상대를 공격하는 코드를 작성하면 다음과 같다. public class Unit { private int _hp; private Normal_weapon; public void ReceiveDamage(int amount) { _hp -= amount..
이번에 만든 건 카드 시스템이다. 카드 시스템을 만들 때에는 1. 원형으로 카드가 정렬되어야 함 2. 카드의 다양한 능력을 구현할 수 있어야 함 3. 힘, 약화 등 버프/ 디버프와 디펙트의 스택과 같이 값이 계속해서 바뀌는 카드도 대응해야 함 4. 타게팅이 필요한 카드와 필요하지 않은 카드를 구분해야 함 5. 포식/의식용 단검/불태우는 일격 등 효과에 조건문을 고려해야 하는 카드가 있음 등 여러 요소들을 고려하면서도, 일반화를 잘 해서 에디터로 뺄 수 있게끔 만드는 게 목표였다. 그래서 우선 에디터를 만들기 전 필요한 필드를 정리하고, 카드 시스템을 구현해 보았다. ScriptableObject와 함께 사용해서 에디터 확장으로 만들까 했지만... 유니티 내부에서만 관리 가능한 에셋이라는 점도 아쉬웠고, ..
Slay the Spire라는 게임을 카피해보기로 했다. 이제는 20승천을 밥먹듯이 깰 만한 정도의 실력이 되어서 나름 시스템에 대해 잘 알고있다고 자부하기도 하고, 기왕 만들거면 좋아하는 게임을 만드는 게 즐겁지 않을까 하는 생각이다. 오늘은 가장 먼저 절차적 맵 생성 시스템을 만들어봤다. 내가 사용한 방법은 다음과 같다. (a) 경로 생성 1. 7x15 크기의 Grid를 만든다. 2-1. 가장 아래층의 방을 하나 선택한다. 2-2. 선택한 방을 기준으로 위 층에 있는 인접한(x-1, x, x+1) 방을 하나 선택한다. 2-3. 15층이 될 때까지 이 과정을 반복한다. 3. 이 과정을 총 6번 수행한다. 하지만, 최소 2개의 시작지점이 보장되어야 한다(1층에서 처음으로 선택하는 두 개의 방은 다른 방이..