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 하게 프로젝트를 진행할 수 있게함.