여러 컴포넌트의 집합이라고 할 수 있다.
GameObject 자체는 "빈 상자"이며, 별다른 기능을 갖고 있지않다.
따라서 빈 상자에 여러 기능(위치,물리,렌더링 등)을 추가해야하는데 이때 사용하는 것이 "컴포넌트"이다.
컴포넌트는 GameObject가 특정 역할을 수행하도록 만들어주는 핵심 요소이다.
컴포넌트를 가져올때에는
GameObject obj = GameObject.Find("object_0"); // 씬에서 오브젝트 가져오기
Rigidbody rb = obj.GetComponent<Rigidbody>(); // Rigidbody 가져오기
GetComponent<T>()를 사용하여 가져온다. 이때 T에는 특정 타입을 지정함으로써, 해당 타입의 컴포넌트를 찾아 반환하도록 한다.

위 코드처럼 Image 컴포넌트를 가져올 수도 있고,
컴포넌트를 가져오는 동시에 컴포넌트에 특정 처리를 할 수도 있다. (ex, fillAmount)

다만 위 코드에서 transform 또한 컴포넌트에 속하지만, GetComponent를 사용하지 않았는데 그 이유는 "유니티에서 모든 오브젝트는 공간(위치,회전,크기) 정보가 있어야 하기 때문"이다.
즉 자주쓰이는 것이기에 컴포넌트임에도 바로 obj.transform과 같이 접근할 수 있도록 한 것이다.
Destroy(obj.GetComponent<Rigidbody>()); // Rigidbody 제거
Destroy(컴포넌트)를 사용하여 GameObject에서 해당 컴포넌트를 삭제하도록 한다.
GameObject director = GameObject.Find("GameDirector");
director.GetComponent<GameDirector>().DecreaseHp();
여기서의 GameObject는 Hierachy에 존재하는 실제 오브젝트. 
GetComponet를 통해 가져오는 컴포넌트는, 해당 오브젝트에 설정해둔 c# script, 이미지 등을 말함

즉, 컴포넌트를 가져오면 c# script내에 있는 변수나 메서드에 접근 가능하다.
이를 통해 GameObject간 상호작용을 할 수 있다.