안녕하세요. 박민성입니다. ☺️
오늘은 Unity의 RequireComponent에 대해서 글을 쓰고자 합니다. 🤔
그냥 평소에 GetComponent를 사용할때 실수로 컴포넌트를 추가하지 않을 것을 방지하여
무조건 있다는 것을 보장하기 위해서 스크립트로 보장하는? 컴포넌트를 추가해주는? 것으로 알고 있었습니다.
1. RequireComponent란?
RequireComponent는 해당 스크립트가 동작하기 위해 필요한 다른 컴포넌트를 자동으로 추가하도록 지정하는 Unity Attribute입니다.
[RequireComponent(typeof(Rigidbody))]
public class PlayerMovement : MonoBehaviour
{
}
PlayerMovement를 GameObject에 붙이면 같은 GameObject에 Rigidbody가 없다면 Unity가 자동으로 추가해줍니다.
RequireComponent는 특정 컴포넌트에 대한 의존성을 코드에 명시하고 스크립트가 추가될 때 필요한 컴포넌트가 없다면 Unity가 자동으로 추가하도록 하는 기능입니다.
2. 기본 사용법
형태는 간단합니다.
[RequireComponent(typeof(필요한컴포넌트))]
public class 클래스이름 : MonoBehaviour
{
}
클래스 위쪽에 어트리뷰트로 리콰이엇컴포넌트를 추가해서 typeof를 적고 Rigidbody나 Collider2D 같은 컴포넌트를 명시해주면 됩니다.
[RequireComponent(typeof(Rigidbody))]
public class PlayerMovement : MonoBehaviour
{
private Rigidbody rb;
private void Awake()
{
rb = GetComponent<Rigidbody>();
}
}
예를 들어서 이런식으로 작성하고 GameObject에 PlayerMovement를 추가하게 되면 자동으로 그 오브젝트에 컴포넌트가 추가 되게 됩니다.
3. 정확히 언제 자동으로 추가될까요~?
RequireComponent가 매 프레임 검사하는 게 아닙니다.
[RequireComponent(typeof(Rigidbody))]
이렇게 코드가 있다면 개념적으로 Unity는
PlayerMovement 추가 요청 -> RequireComponent 정보 확인 -> Rigidbody가 있는지 확인 -> 없음 -> Rigidbody 추가 -> PlayerMovement 추가 이러식으로 의존성을 만족시킵니다.
private void Update()
{
// 매 프레임 RequireComponent를 검사하는 것 XXX
}
그냥 RequireComponent는 계속 감시하는 기능이 아니라 스크립트를 붙이는 순간 한 번 체크하는 기능이라는 겁니다.
4. RequireComponent 자체는 어떻게 동작할까요~?
여기서 C#의 Attribute 개념하고 연결됩니다.
[RequireComponent(typeof(Rigidbody))]
RequireComponent는 일반 메서드를 실행하는 문법이 아니라 클래스에 메타데이터를 붙이는 Attribute입니다.
typeof(Rigidbody)
typeof(Rigidbody)는 Rigidbody 타입 자체에 대한 정보를 넘겨주는 겁니다.
RequireComponent는 개념적으로 클래스에 필요한 컴포넌트 타입 정보를 Attribute 형태로 기록하고 Unity는 컴포넌트를 추가할 때 그 의존성 정보를 확인합니다.
5. RequireComponent 사용 시
이미 컴포넌트가 있으면 어떻게 될까요~?
[RequireComponent(typeof(Rigidbody))]
public class PlayerMovement : MonoBehaviour
{
}
오브젝트에 이미 Rigidbody가 있다고 해도 아무런 오류나 일이 일어나지는 않습니다.
RequireComponent는 “무조건 새 컴포넌트를 생성해라”가 아니라 이 컴포넌트가 존재하도록 보장하는 것입니다.
없으면 추가하는 것이고 있으면 아무런 일이 안 일어납니다.
그리고
RequireComponent로 여러 개 컴포넌트를 추가할 수 있습니다.
[RequireComponent(typeof(Rigidbody),typeof(BoxCollider),typeof(AudioSource))]
public class Player : MonoBehaviour
{
}
RequireComponent 생성자는 한 번에 최대 세 개의 타입을 받을 수 있는 형태를 제공합니다.
그리고
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(BoxCollider))]
public class Player : MonoBehaviour
{
}
나중에 RequireComponent를 추가하면 기존 GameObject도 자동 수정될까요~?
결론부터 말하자면 안됩니다.
public class PlayerMovement : MonoBehaviour
{
}
[RequireComponent(typeof(Rigidbody))]
public class PlayerMovement : MonoBehaviour
{
}
코드를 이렇게 바꾸어도 Rigidbody가 추가되지 않습니다.
왜냐하면 RequireComponent는 컴포넌트를 추가하는 시점에만 의존성을 검사하기 때문입니다. Unity 공식 문서도 기존 인스턴스에는 새로 추가한 의존성이 자동 적용되지 않는다고 명시하고 있습니다.
이러한 의존성 때문에 RequireComponent으로 의존성이 보장된 컴포넌트라면

이런식으로 메시지가 뜨며 지울 수가 없습니다.
이상으로 Unity의 RequireComponent에 대해서 알아보았습니다.
몰랐던 부분도 있었고 문서 보면서 내부적으로 어떻게 동작하는지 어떠한 역할을 하고 있었는지 정확하게 알게되어
오늘도 굉장히 알찬 하루였던 것 같습니다. ☺️
오늘의 노래 추천은
087. Hopes And Dreams - Toby Fox 라는 노래입니다.
꿈과 희망.
언더테일에서 가장 좋아하고 언더테일 게임 하면서 딱! 이 노래가 나올 때... 그 장면....
인상 깊었습니다.
내일은 더욱 알차게 보내고 작성해 보도록 하겠습니다.
봐주셔서 감사합니다. ☺️