티스토리 뷰
이번에 만든 건 카드 시스템이다.
카드 시스템을 만들 때에는
1. 원형으로 카드가 정렬되어야 함
2. 카드의 다양한 능력을 구현할 수 있어야 함
3. 힘, 약화 등 버프/ 디버프와 디펙트의 스택과 같이 값이 계속해서 바뀌는 카드도 대응해야 함
4. 타게팅이 필요한 카드와 필요하지 않은 카드를 구분해야 함
5. 포식/의식용 단검/불태우는 일격 등 효과에 조건문을 고려해야 하는 카드가 있음
등 여러 요소들을 고려하면서도, 일반화를 잘 해서 에디터로 뺄 수 있게끔 만드는 게 목표였다.
그래서 우선 에디터를 만들기 전 필요한 필드를 정리하고, 카드 시스템을 구현해 보았다.
ScriptableObject와 함께 사용해서 에디터 확장으로 만들까 했지만... 유니티 내부에서만 관리 가능한 에셋이라는 점도 아쉬웠고, 앞으로 구현해야 할 카드의 수를 고려해 보면 그냥 에디터를 하나 만들어서 익스포트하게끔 만드는 게 낫겠다 싶었다.
우선 카드 정렬은 그냥
[-a, a]의 값(위치, 회전)을 선형 보간을 통해 카드의 인덱스에 따라 적용하는 방식으로 간단하게 작성했다.
그런데 카드가 회전값이 있으니 y 오프셋의 값을 조금만 주면 카드가 원형으로 정렬되었다는 느낌이 적었고,
y 오프셋의 값을 늘리면 특정 인덱스의 카드만 엄청나게 튀어 이쁘게 보이지 않았다.
그렇다고 또 저기에 코드를 덕지덕지 붙이는 건 기분이 나쁘고...
그래서 코드 수정을 많이 하지 않는 선에서 세부적인 조정을 할 수 있는 방법이 뭐가 있을까~ 고민하다 애니메이션 커브를 하나 만들어 커브값을 조절해줬다.
정말 이게 최선의 방법이었을지는 아직도 고민하고 있기에, 나중에 더 좋은 방법이 생각나면 고칠 것 같다.
카드의 타겟을 정하는 화살표는 간단하게 베지어 곡선을 사용했다.
벡터의 선형 보간을 세 번 써도 되지만, 그럼 미분한 값이 필요할 때 굳이 계산을 다시 해야 하기에 전개한 값으로 함수를 만들었다. 라이브러리로 만들어서 프로젝트마다 불러와서 쓰고 있는데, 유용하게 쓰고 있다.
나는 게임 로직을 구현하는 것보다 프레임워크나 에디터를 만드는 과정을 더 좋아하는데
사실 카드 시스템 만들면서도 빨리 에디터 만들고 싶어서 집중이 안됐다.
슬더스에는 힘/약화같은 버프/디버프 외에도 의식용 단검이나 디펙트의 스택처럼 카드의 효과가 적용되는 수치가 계속해서 바뀌는 카드가 엄청나게 많다.
지금은 편집기에서 만든 변수밖에 사용하지 못하지만, 앞으로 몇몇 변수는 전역변수같은 느낌으로 캐릭터의 특정한 값에 접근할 수 있게끔 만들 예정이다. {DiscardPile}은 현재 버린 카드 더미에 있는 카드의 수에 접근한다던가 하는 느낌으로..
지금은 변수를
d=5,attack
이런 식으로 만들고 있다. 아직은 키워드를 그냥 내부적으로 처리했지만,
#def attack(value)
value={value}+{strength}
if {weak} > 0:
value={value}*0.75
뭐 이런식으로 키워드 자체를 미리 만들어 놓는 파일도 추가할 것 같다.
아니면 이런 단순한 구조 말고 좀 더 신경써서 xml로 다른 부분에도 사용할 수 있게 만들던가...
다음에는 적을 만들어보자