개요
컴포넌트 패턴은 한 개체의 기능을 한 클래스에 몰아 넣는것이 아닌 여러 컴포넌트 클래스로 나누어 구현하는것을 말한다.
개체 클래스는 여러 컴포넌트를 소지하게 된다. 각 컴포넌트는 메소드와 데이터를 가져 동작과 상태를 모두 나누어 가지게 된다. 특정 기능을 컴포넌트로 분리하여 구현하면 개체에 몰려있던 커플링을 분리할 수 있고 한 클래스에 코드가 몰리는것도 막을 수 있다. 또한 독립적으로 작동하는 컴포넌트라면 일반화하여 다른곳에 재활용 할 수도 있다. 언리얼 엔진의 컴포넌트나 유니티의 컴포넌트도 비슷한 개념인 것 같다.
컴포넌트간 상호작용
각 컴포넌트가 완전히 독립적으로 동작하면 좋겠지만 서로 통신이 필요할 수도 있다. 이때 다음 세가지 방식으로 구현할 수 있다.
개체의 멤버 데이터를 통해 통신
개체가 가진 멤버를 특정 컴포넌트에서 수정하고 다른 컴포넌트에서 읽어 통신하는 방식이다. 예를 들어 개체가 속도라는 변수를 가질때 개체가 입력 컴포넌트에 개체 포인터, 또는 속도 포인터를 넘겨주며 속도를 조정받고, 이후 렌더 컴포넌트에 속도를 넘겨주며 속도에 따른 렌더링을 수행하는 식이다.
컴포넌트 간 직접 통신
두 컴포넌트가 긴밀하게 상호작용할때는 억지로 위 방식으로 통신하기 보단 서로의 포인터로 직접 통신하는 것도 한 방법이 될 수 있다. 다만 너무 많은 컴포넌트가 거미줄처럼 통신하면 오히려 복잡해질 수 있기에 적당히 잘 사용해야한다. 내가 생각하기엔 복잡한 컴포넌트 간 통신이 될빠엔 개체쪽에서 컴포넌트들을 컨트롤하여 전체적인 움직임을 만드는 것도 괜찮을 것 같다.
메세지
각 컴포넌트가 메시지 구분 및 데이터를 전달 받을 수 있는 매개변수를 가진 recieve 가상 메소드를 구현하고 개체는 자신이 가진 모든 컴포넌트의 recieve 메소드를 넘겨받은 매개변수를 그대로 전달하며 호출하는 send 메소드를 제공한다. 각 컴포넌트는 자신의 소유 개체에 send메소드에 데이터를 넣어 호출하여 다른 컴포넌트들에 메세지를 전달 할 수 있다.
참고서적
게임 프로그래밍 패턴
'디자인 패턴 > 게임 프로그래밍 패턴' 카테고리의 다른 글
[게임 프로그래밍 패턴][16]서비스 중개자 (0) | 2024.05.05 |
---|---|
[게임 프로그래밍 패턴][15]이벤트 큐 (0) | 2024.05.05 |
[게임 프로그래밍 패턴][13]타입 객체 (0) | 2024.04.30 |
[게임 프로그래밍 패턴][12]하위 클래스 샌드박스 (0) | 2024.04.29 |
[게임 프로그래밍 패턴][11]바이트 코드 (0) | 2024.04.28 |