새소식

인기 검색어

개인 프로젝트/오토체스 디펜스

Project Dice 기술서 (1인개발)

  • -

0. 코드 샘플

https://github.com/kwan3854/UnityMultiplayerSample

GitHub - kwan3854/UnityMultiplayerSample

Contribute to kwan3854/UnityMultiplayerSample development by creating an account on GitHub.

github.com

1. 시연 영상

https://youtu.be/-uOAfE42V2I

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. 스크린샷

상점 UI
네트워크를 통한 멀티플레이 밀리 전투
RTS 방식의 컨트롤
아웃라인, X-ray 효과
디버깅과 개발 용이성을 위한 인게임 콘솔과 커스텀 커맨드 사용
커스텀 에디터와 scriptable object 적극 사용
컴포지션 기반의 설계

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.