Decorator Pattern 무기 시스템 구현 - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki

데커레이터 패턴이란

Decorator Pattern 기존 객체를 변경하지 않고 새로운 기능을 추가하도록 구현

  • 원래 클래스를 래핑하는 데커레이터 클래스 생성
  • 객체에 새로운 행동을 부여하거나 분리
    image
    • IWeapon 인터페이스 데커레이팅 된 객체와 데커레이터 간 일관된 메서드 서명 유지하는 구현 계약 설정
    • WeaponDecorator 대상 객체 Weapon을 래핑Wrapping
    • 구체적인 데커레이터 클래스(WithGrip, WithStabilizer) 동작 향상시키는 오버라이팅overriding(재정의)
  • 메서드 서명, 데커레이팅 된 객체의 전체 구조
    • 프로세스 중에 수정X
    • 행동이나 속성 값만 수정
    • 객체에서 데커레이션 삭제 후 초기화가 간편

1. 장·단점

  • 장점
    • 서브클래싱의 대안
      • 상속
        • 정적인 프로세스
        • 런타임에 존재하는 객체의 행동 확장 허용X
        • 원하는 동작이 있는 같은 부모 클래스의 인스턴스만 다른 인스턴스로 교체 가능
      • 데커레이터 패턴 상속의 한계를 극복하며 동적인 대안
    • 런타임 다이나믹
      • 객체에 데커레이터를 추가하여 런타임 시 기능 추가 가능
      • 데커레이터 제거로 객체 원복 가능
  • 단점
    • 복잡한 관계 객체 주변에 다양한 데커레이터 존재할 경우, 초기화 체인과 데커레이터 간 관계 추적이 복잡
    • 복잡해지는 코드
      • 몇 개의 작은 데커레이터 클래스를 유지/관리가 필요한 코드 복잡도↑
      • 단점으로 작용하는 시기/이유는 상황에 따라 변동

설정 가능한 Asset으로 저장하는 ScriptableObject 인스턴스로 극복 가능

2. 사용시기

  • 부착물이 있는 무기 시스템
    • 무기에 다양한 부착물 부착
    • 런타임에 추가/삭제 가능
  • 개별 객체에 행동 추가/삭제하는 기능의 시스템 구현 시 고려

데커레이터 패턴 구현 예제

1. 구현 UML

image

2. 구현 시 고려사항

  • 모든 오토바이 전면에 레이저 빔을 발사하는 총 장착
    • 방해되는 장애물 제거
    • 앞바퀴를 드는 컨트롤로 드론 제거
  • 구매 가능한 부착물
    • 인젝터 플라즈마 인젝터로 무기 데미지 능력 증가
    • 안정 장치 오토바이가 최고 속도일 때 발생하는 진동을 줄이는 안정 장치
      • 무기 사격 메커니즘 안정화 & 사정거리 증가
    • 쿨러 무기 사격 메커니즘에 부착하여 발사 속도 증가 & 쿨다운 감소
  • 각 부착물은 무기의 특정 속성을 수정하거나 데커레이팅