개인 프로젝트/오토체스 디펜스
Project Dice 기술서 (1인개발)
kwan-dev
2024. 2. 18. 04:56
0. 코드 샘플
https://github.com/kwan3854/UnityMultiplayerSample
GitHub - kwan3854/UnityMultiplayerSample
Contribute to kwan3854/UnityMultiplayerSample development by creating an account on GitHub.
github.com
1. 시연 영상
2. 게임의 컨셉
오토체스 류와 비슷하게 상점을 리롤하면서 조합을 갖추고, 던전을 돌아다니며 PvE PvP 전투를 진행하며 자원을 모으며 더 강력한 조합을 갖춰가다가 최종 결투에서 승리한 플레이어가 승리.
3. 개발 기술 스택
- Unity HDRP: PC 플랫폼 타겟
- UniTask: 코루틴 완전 대체
- UniRx(R3): UI와 입력 처리등에 사용 (R3로 migration)
- DOTween: UI 애니메이션, 오브젝트 트위닝
- Odin Editor: 커스텀 에디터, 시리얼라이제이션
- Fishnet V4: 넷코드 사용 (Netcode for gameobject 에서 migration)
- Unity Gaming Service: Dedicated Server, Lobby 등
- PlasticSCM: 버전 관리용도로 사용 (Git에서 migration)
4. 구현시 고려한 기술적 요소
디자인 패턴:
- Singleton Pattern: 게임 내 단 한가지만 존재하는 요소들에 대해 싱글톤 적용. 제네릭 싱글톤 클래스를 구현해 놓고 이를 상속받게 만들어서 코드를 재사용함.
- Wrapper Pattern: 기존에 싱글플레이 게임으로 개발된 코드를 효율적으로 재사용하기 위해 사용, 예시: Unity 기본제공 오브젝트 풀링 라이브러리의 wrapper 작성하여 사용, Netcode 라이브러리의 커스텀 wrapper 를 작성함. https://kwan-dev.tistory.com/99, https://kwan-dev.tistory.com/101
- SOLID: SOLID 원칙에 의거하여 코드를 가독성 높고 재사용 가능하게 작성하기 위해 노력함.
- Factory Pattern: Object Pooling, 커스텀 네트워크 이벤트 구독 등을 구현하기 위해 사용.
- Reactive Programming: UniRx(R3)를 이용, 일부UI 구현과 입력 처리를 위해 사용.
- Observer Pattern: 어떤 동작의 실행 주체와 관찰자가 명확히 구분되는 곳에 Unity event를 사용. 예) 공격 유닛의 공격 실행 시, 이벤트 발생, 이를 구독하고 있던 각종 UI요소와 vfx, sfx 요소들이 반응.
메모리를 고려한 설계:
- 반복적으로 사용되는 오브젝트들을 오브젝트 풀링으로 관리함. Network Object에 대해서도 풀링 사용. 예) 유닛, 투사체, 파티클...
- 코루틴을 대체하여 UniTask사용: 지속적으로 메모리 할당 해제를 발생시키는 코루틴 대신 UniTask 사용.
- 자주 실행되는 코드에 대해서 메모리 동적 할당을 최소화 하기 위해 노력함.
Server Authorotative 설계:
- 클라이언트 측에서 치팅을 할 가능성이 있는 모든 요소를 Server Authorotative 하게 실행되도록 설계.
- ServerRpc(remote procedure call)를 통해 서버에게 실행을 요청 한 후, 서버에서 요청을 validate 한 뒤, 서버 측에서 로직을 실행. Client 측은 Server측에게만 값을 write할 수 있는 권한이 있는 network variable들을 read 함.
- 서버 사이드에서 실행되는 로직과 클라이언트사이드에서 실행되는 로직을 철저히 구분하여 작성하였고, Fishnet에서 제공하는 attribute 와 Assert 등을 이용해 이 로직을 확실히 구분함. Fishnet 제공 attribute로 구분된 서버 로직은 클라이언트 빌드시 자동으로 strip됨.
네트워크 레이턴시:
- Client side prediction/Server side reconciliation 설계를 도입 시도 중. 장르 특성에 의한 기술적 한계 때문에 완전한 도입보다는 옵션 제공 등의 제한적인 도입을 고려 중.
- Collider Rollback: 일부 논 타게팅 스킬들에 대해 collider rollback 을 통한 lag compensation 을 위해 해당 요소를 고려해 개발 중.
개발 편의성:
- 커스텀 에디터와 에디터 자동화 코드를 작성해, 반복작업의 편의성을 높임. 본 게임에서는 50여개의 몬스터 종류를 가지고 출시될 예정이기 때문에 개발과정에서 몬스터나 스킬, 총알 등 비슷한 형태의 프리펩이 많이 필요하게 되는데, 이를 자동화 하기 위한 코드를 작성해서 scalable 하게 프로젝트를 진행할 수 있게함.
- 몬스터나 아이템의 스텟등은 scriptable object 를 사용하여 관리함.
5. 스크린샷






