1. 클래스의 상속 한계
부모 클래스에서 자식 클래스에 공통적으로 필요한 기능을 구현
그러나 나중에 구현할 자식 클래스에 무엇이 필요한지 처음부터 정확하게 추측하기 어려움
부모 클래스의 기존 기능이 나중에 구현한 자식 클래스의 기능과 오히려 충돌 가능
또 상속에만 의존하면 기획자가 새로운 오브젝트를 만들 때 매번 프로그래머에게 부탁해야하는 문제
2. 컴포넌트 패턴
미리 만들어진 부품을 조립하여 완성된 오브젝트를 만드는 방식
미리 만들어진 부품은 컴포넌트이고 컴포넌트는 저마다의 대표적인 기능을 가짐
기본적으로 게임 오브젝트는 속이 빈 껍데기이며 개발자는 빈 게임 오브젝트에 컴포넌트를 조립하여 기능을 추가
동물을 만들고 싶다면 게임에 등장할 모든 동물을 사전에 기획할 수 없으므로 동물에 사용할 다양한 종류의 부품을 미리 만들어놓는다

코뿔소를 만들고 싶으면 코뿔소를 먼저 생성하는데 기본적으로 아무 기능이 없는 껍데기임

그리고 만들어진 컴포넌트 주머니에서 코뿔소에 필요한 기능을 추가하는 방식으로 코뿔소 만든다

마찬가지로 상어, 독수리도 만들고 싶으면 빈 껍데기 만들고 여기에 상어, 독수리에 맞는 컴포넌트를 추가함

유연한 재사용이 가능하고
기획자의 프로그래머 의존도가 낮아지며, 컴포넌트가 있으면 기획자가 직접 게임 오브젝트를 만들 수 있음
코드의 독립성으로 서로 다른 기능이 충돌하지 않아 기존 기능이 망가질까봐 걱정할 필요가 없음
3. 예시
큐브 만들면 inspector쪽에 큐브에 담긴 컴포넌트들이 보임
transform은 오브젝트의 위치, 크기, 회전
mesh filter은 오브젝트 외곽선 지정
mesh renderer은 메시에 따라 색을 채워 그래픽 외형을 표시
box collider은 다른 물체가 부딪칠 수 있는 물리적인 표면을 생성
rigidbody는 오브젝트가 물리 엔진의 통제를 받게함

rigidbody가 없으면 물체가 중력의 영향을 받지 않아 플레이 해도 그대로 공중에 있는데
rigidbody가 있으면 공중에서 중력의 영향을 받아 떨어지게 됨
마찬가지로 box collider은 물체의 표면을 지정하는데 이게 없으면 물체의 물리적 표면이 없어져서,
밑바닥과 충돌하지 않고 그대로 영원히 아래로 떨어짐


4. MonoBehaviour
유니티의 모든 컴포넌트는 MonoBehaviour 클래스를 상속
유니티에서 미리 만들어 제공하는 클래스이고 컴포넌트에 필요한 기본 기능을 제공함
MonoBehaviour을 상속해서 만든 컴포넌트는 유니티의 제어를 받는다.
MonoBehaviour을 상속해서 만든 컴포넌트는 유니티의 제어를 받게 됨
MonoBehaviour을 상속받지 않은 클래스는 게임 오브젝트에 컴포넌트로 추가할 수 없다

MonoBehaviour를 상속한 클래스는 new로 인스턴스를 생성할 수 없음(이전에 실습에서 MonoBehaviour을 지운 이유)
MonoBehaviour를 상속한 클래스는 컴포넌트로 동작, 게임 오브젝트에 드래그&드롭 등으로 스크립트를 게임 오브젝트에 컴포넌트를 추가하는 방법으로만 인스턴스 생성 가능
new 연산자로 MonoBehaviour를 상속한 클래스를 오브젝트로 생성하면 필요한 초기화 과정과 게임 오브젝트에 추가되는 과정을 전부 생략하고 즉시 오브젝트가 생성되어 정상적으로 동작하지 않는다
5. 메시지와 브로드캐스팅
컴포넌트 패턴에서 컴포넌트들은 서로 관심이 없음
유니티 역시 어떤 컴포넌트들이 추가되었는지 모든 명단을 미리 파악하고 있지 않음
그래서 발동시키고 싶은 기능의 이름을 담은 메시지를 게임에 제공
오브젝트가 100개 있다면 100개 오브젝트 모두 이 메시지를 수신
만약 오브젝트가 메시지에 명시된 해당 기능을 가지고 있다면 해당 기능을 실행
없다면, 자기와 상관 없으므로 무시함
이렇게 여러 오브젝트에 무차별적으로 메시지를 뿌리는 방식을 브로드캐스팅이라고 부름

Start(), Update(), OnTriggerEnter() 등과 같이 유니티에서 미리 만들어둔 메소드명의 이름 철자만 똑같이 구현해두면
메시지에 의해 자동으로 실행되는 메소드들이 있는데, 이를 유니티 이벤트 함수라고 부름
Start()같은 경우 게임 오브젝트가 처음 활성화될 때 자동으로 한번 실행되는 함수로,
게임 오브젝트가 활성화될 때 유니티가 Start라고 적힌 메시지를 브로드캐스팅하여 실행되기 때문
그래서 Start()는 수동으로 실행할 필요가 없음
'프로그래밍 > Unity&C#' 카테고리의 다른 글
사용자의 입력을 감지하는 프로그램 (0) | 2024.12.23 |
---|---|
Unity의 Material 만들기 (0) | 2024.12.21 |
Unity 오브젝트 생명주기 익히기 (0) | 2024.11.14 |
Unity를 위한 C# 기초 핵심 강의 보며 정리하기 (0) | 2024.11.10 |
Unity 게임 빌드하기 (0) | 2024.06.22 |