Component 사용하기
앞에서 Unity에서는 GameObject가 비어 있는 박스라고 설명드린 것 기억나시나여? 잠깐 복습하자면 Component는 그 박스안에 들어가는 조각이고! GameObject안에 그 Component가 여러 개 들어갈수 있으며 이 Component중에 제일 중요한것이 Transform Component라고 애기했는데 어렴풋이 생각나시나여!!!! Transform Component가 없이는 그 어느누구도 GameObject를 월드상에 위치 시킬수가 없습니다.
GameObject와 Compoent 관계에 대해서 잘모르시겠다면 제 1강 GameObject 부분을 한번 읽고 오세여. 그럼 Component를 생성해볼까여! 앞의 GameObject 설명부분에서도 했는데 한번 더 해보져. 아래 그림처럼 Menu->Game Object -> Create Empty를 누릅니다.
그리고 나서 Heiarchy에서 GameObject를 누르시고 Inspector에 보면 Transform Componet이 보이는데여. 아래 그림처럼 빨간색 부분이 바로 Transform Component입니다.
앞의 과정을 유심히 보시면 선택한 GameObject에 연결된 Component를 보기 위해서는 항상 Inspector를 보게 된다는 것을 아시게 될것입니다. 이처럼 GameObject에 Component가 어떤게 있는지를 볼려면 언제나 Inspector 부분을 보아야 합니다. 언제나 주시하는 놈이 Inspector이니 당연히 이 Inspector는 민감하겠져. 그래서 GameObject에 Component가 추가되고 삭제되면 그 즉시 Inspector에 보여집니다. 결국 우리는 Inspector부분만 보면 GameObject에 Component의 변화여부를 알수 있습니다. 또한 Inspector에서는 Component의 값 (속성)을 변경시킬 있습니다.
Component 추가하기
비어 있는 GameObject를 생성하고 디폴트로 Transform Component까지 봤으니 이제 Component를 추가해보도록 해봅시다. 비어 있는 GameObject안에 Rigidbody Component를 추가해보겠습니다. 이 Component는 어디에 있을까여? 아래 그림을 한번 보세여.
메뉴에서 RigidBody를 클릭하는 순간 우측 Inspector에는 어떤 변화가 일어났을까여? 아래그림을 한번 보세여. Transform Component밖에 없었는데 Rigidbody Component가 추가됐네여.
이런식으로 메뉴에 있는 Component를 GameObject에 추가할수 있습니다. 하지만 몰 알아야지 추가하는데 지금은 Component가 모가 있다는것만 아실뿐입니다. 아직도 갈길이 멀군여. 참고로 Rigidbody쪽은 Ageia PhysX 라는 최신의 물리 엔진라이브러리가 내장되어 돌아가고 있습니다. 이 물리 엔진 라이브러리는 유명한 게임엔진 언리얼3, Crysis 엔진에서도 사용하는 물리엔진입니다. 여기서는 그냥 Component를 추가하는 방법만 아시면 됩니다. 컴포넌트에 대한 세세한 설명은 나중에 살펴볼것입니다.
Component 편집하기
Component의 멋진점이 모냐고 저한테 물어보시면 저는 주저말고 유연함(Flexibility)을 뽑겠습니다. GameObject에 Component를 붙이고 나면 게임실행중 스크립트에서나 에디터에서 Component의 값을 수정해서 게임을 빌드할 수가 있습니다. 대부분 이런 값들은 프로그래머가 코드에서 값을 변경시키고 이것을 컴파일해서 디자이너가 그 결과를 보았는데 이제는 그냥 에디터에서 값만 변화면 그 변경된 값을 바로 바로 확인할수 있으니깐 말이져… Unity의 이런 유연함에 저는 감동한 나머지 눈물을 흘렀습니다.
여기서 Component의 값을 속성이라고 하는데 Values와 Referneces라는 두가지 타입이 있습니다. 아래 그림을 한번봅시다. 여기서는 Audio Source라는 Component가 추가됐네여. Inspector내에 Audio source의 모든 값들은 디폴트 값입니다.
여기 값들을 보면 Reference 속성이 하나, Value속성이 7개가 있습니다. Audio Clip은 Reference속성입니다. 무슨 소리인가 생각하시겠지만 Mp3파일을 한번 생각해보세여. 각각 Component마다 그것들을 가지고 있으면 Mp3파일을 가지고 있으면 이 얼마나 낭비겠어여. Mp3파일을 담은 이름만 알고 있어서 그 이름을 플레이하면 되는데 별도로 Component에 가지고 있으니깐 말이져..이처럼 이름만을 가져와서 쓰는 것을 Reference라고 합니다. 물론 실제 Mp3파일을 가리키고 있어야 겠져. 오디오 Clip에 사운드를 추가하는 것은 아주 쉽습니다. 아래 그림을 보세여.
Project 패널을 보시면 Sound부분에 소리 아이콘 보이시나여. 그중에 파일 하나를 선택하시고 마우스로 드래그에서 Inspector부분의 Audio Clip부분에 갖다대고 마우스 왼쪽 버튼을 떼보세여. 어때여!
여러분이 Play Mode로 게임을 하는중간에도 Inspector에서 속성값을 자유롭게 변경할수 있습니다. 예를들면 캐랙터의 점프 높이가 있다고 한다면 여러분은 게임을 중단하지 않고 계속 값을 수정해서 그 결과값을 실시간으로 반영해서 볼수있습니다. 내부적으로 돌아가는 프로그램적인 로직은 우리가 신경안써도 툴에서 알아서 자동으로 반영해주니 이 얼마나 고마운 일입니까!!
또 스크립트에서 전에도 말했다시피 Public 변수로 해놓아면 툴에서 볼수있으니 Unity에서 만든것뿐만 아니라 내가 만든것까지 값을 툴에서 수정해줄수 있다니 이 얼마나 유연한 툴이예여..사실 말이 나왔으니 말이지. 비싼 엔진 (Unreal Engine,Crisys 엔진)에서는 당연히 제공해주는 기능이져. 그렇지만 이 정도 가격의 엔진에서 이런 비싼 엔진에서 제공해주는 기능을 주니 저희로서는 감사할 따름입니다.
물론 실시간으로 수정된 값들은 게임이 멈추면 원래 있었던 값으로 돌아옵니다. 당연하겟지여. 임시로 테스트하는 값들이니깐 말이져. 이러한 방식은 기획자로 하여금 반복적이고 시험적인 것들에 대해서 외부의 도움없이 시험볼수 있는 환경을 제공합니다. 한번 해보세여. 정말로 게임중에 값이 변경되는지 여러분도 저와 같은 감동을 받았으면 하네여.
Component 제거하기
Component를 제거하는것은 식은죽 먹기입니다. 그냥 Inspector에서 지우려고 하는 Component 머리부분에 마우스를 딱 갖다대고 우측 버튼을 누르면 화면에 Remove Component가 보입니다. 그부분을 그냥 클릭만 눌러주세여. 그럼 순식간에 Component가 사라집니다. 그전에 있던 Component의 값들도 사라지는건 안봐도 당연지사져!
게임 오브젝트-스크립트간의 관계
얼핏보면 스크립트는 Component가 아닐 것 같습니다만 앞의 GameObject강좌에서 말한 것처럼 스크립트도 Component입니다. 이렇게 보이는 이유는 스크립트가 컴파일되고 나면 Component의 한 타입으로 저장되어 이것이 다른 Unity 엔진내의 Component 처럼 다뤄지게 되기 때문입니다.
스크립트에서 직접 접근할 수 있는 많은 Component들이 있습니다. 그중에서도 제일 많이 사용되는 것은 Transform Component입니다. 이 Component중에 Translate 함수를 사용하려면 그냥 transform.Translate() or gameObject.transform.Translate()로 쓰시면 됩니다. 이게 되는 이유가 GameObject안으로 모든 Component 여기서는 Script가 붙여지기 때문에 이것이 가능하게 됩니다. 벌써 누군지 아니깐 말이져. 그래서 앞에 gameObject를 안써도 암묵적으로 컴파일러는 눈치를 까는거져..애가 모라는 것을.. 앞에 gameObject를 붙이던지 이것을 빼던지 이것은 여러분의 자유입니다. 편안대로 하세여.
GetComponent() 사용하기
GameObject 멤버에 포함되지 않는 어떤 Component에 접근하려면 GetComponent("component name") 를 사용해서 얻어옵니다. 다른 GameObject의 Script를 참조하려고 할 때 사용하는 방법입니다. “백문이 불여일견” 한번 예를 들어서 살펴봅시다.
아래 코드는 자바스크립트로 된 코드인데여. test1.js 에서 test2의 PrintTest()함수를 불러오려고 합니다. 이때 GetComponent() 함수를 사용해서 PrintTest()함수를 호출할수 있습니다.
GetComponent안에 인자가 Component 이름이 온다고 했는데 스크립트 이름이 들어가 있네여. 당연합니다. 스크립트도 Component 니깐 말이져!!
test1.js
test2.cs
Game Object
Game Object는 Unity엔진에서 가장 중요한 오브젝트입니다. 따라서 여러분은 Game Object가 무엇인지 또 이것을 사용하는 방법을 아는 것이 이번 강의의 핵심입니다.
GameObjects 란?
그럼 먼저 Game Object가 무엇인지 알아볼까여? Game Object는 여러분의 게임내에 있는 모든 오브젝트를 Game Object라고 합니다. 하지만 Game Object 자체로는 아무것도 하지를 못하는데여. 그래서 Game Object가 무엇인가를 하기 위해서는 여러분은 특별한 속성을 이 Game Object에 주어야 합니다. 이 속성에 따라서 Game Object가 캐랙터가 될수도 있고 맵이 될수도 있고 환상적인 이펙트가 될수도 있습니다. 그런데 Object들이 GameObject가 될텐데 방과 방안에 있는 전등을 어떻게 구별짓게 할수있을까여? 무엇이 GameObject들을 서로 다른것으로 구별되게 만드는 것일까여?
답을 말하기 전에 한번 상상해 봅시다. 비어있는 박스가 여러분 앞에 놓여 있습니다. 이 비어 있는 박스에는 여러가지 것들을 담을수 있습니다. 그림자가 들어간 섬 이나 물리가 적용된 차가 들어갈수도 있습니다. 이 박스는 무엇이든지 담을 수 있기 때문에 저장소라는 의미로 Container라고 불리웁니다. 이 Container를 Unity에서는 GameObject라 합니다. Game Object에 담을수 있는 것(Piece)을 Unity에서는 Component라고 합니다. 이 Component에 따라서 Game Objet의 성격이 변합니다. 물론 하나의 Game Object안에 여러 개의 특징을 가진 Component를 추가할수도 있습니다. 이펙트 Component에 소리 Component를 같이 혼용하는것 처럼 말이져!!
좀더 쉬운 예를 들자면 Game Object를 비어 있는 비어 있는 냄비라고 가정하고 게임이라는 요리를 만드는데 필요한 다양한 재료가 Component라고 생각하시면 됩니다.
GameObject와 Component와의 관계
이제 우리는 Game Object가 Component를 가지고 있다는 것을 알았습니다. 그럼 이제 이러한 Component중에서 제일 많이 사용하는 있는 Component에 대해서 살펴보게 될텐데여!!!!
여기서 퀴즈~~~ 제일 많이 사용하는 컴포넌트가 무엇일까여?
네! 바로 Object를 이곳저곳 이동할수 있게 해주는 Transform Component입니다. 당연한게 아니겠어여. 항상 게임은 상호작용해야하는데 오브젝트가 움직이지 않고서는 아무것도 하지못할 테니 말이져!
그럼 먼저 Transform Component가 Unity에서 어디에 있는지 한번 찾아볼까여?
단축키는 Ctrl + Shift + N을 클릭하시거나 아래 그림처럼 Menu->Game Object -> Create Empty를 누르시면 됩니다.
그리고 나서 Heiarchy에서 GameObject를 누르시고 Inspector에 보면 Transform Componet이 보이는데여. 아래 그림처럼 빨간색 부분이 바로 Transform Component입니다.

비어 있는 GameObject를 생성했는데도 불구하고 이름과 Tag, Layer까지 있는점을 눈여겨 보세여.
모든 GameObject는 Transform Component를 가지고 있습니다. Transform Component가 없는
GameObject는 망고없는 찐빵일 뿐입니다.
모든 게임 오브젝트의 변환 속성은 이 Transform Component를 사용하는 것에 의해 변환이 이뤄
집니다. 이처럼 Transform Component는 GameObject에 있어서 꼭 필요한 것이며 각 GameObject
에 하나만 존재합니다. Transform component가 하나만 있다는 것이지 GameObject에 Component
가 하나만 있어야 하는 의미가 아닙니다. GameObject에는 다른 Component들이 여러 개 올수도
있습니다.
Main Camera GameObject를 한번 살펴볼까여! 아래 그림을 한번 봅시다.

기본적으로 모든 씬에 더해지는 Main Camera
그림을 보면 Main Camera는 여러 개의 Component을 가지고 있다는 것을 알수 있습니다.
Camera Component, GUILayer, Flare Layer, Audio Listener가 바로 Component입니다.
이러한 Component 들은 GameObject 에 추가적인 기능을 제공합니다. 이러한 Component들이 없다면 우리는 게임을 하는 플레이어를 볼수가 없습니다. Rigidbody(강체),collider(충돌체), Particle (파티클), 그리고 Audio(오디오) 등은 모두 GameObject에 추가할수 있는 Component입니다.
Transform Component
Transform Components는 가장 중요한 구성요소 중 하나입니다. 그것은 게임월드/장면내에서 게임 오브젝트의 위치와 회전, 확대/축소를 정의 합니다. 만약 GameObject가 Transform Component가 없다면 컴퓨터의 메모리상에 있는 어떤 정보일 뿐이며 게임월드에 존재하지 않게 될것입니다. Transform Component 는 Parenting(상.하위 개념)이라고 하는 것을 할수도 있는데 이것은 Unity 에디터에서 사용하는 것으로 GameObject로 작업을 하는데 있어서 매우 중요한 부분입니다. 이부분은 나중에 좀더 자세히 살펴보도록 합시다. 일단은 넘어갑니다.
게임 오브젝트-스크립트간의 관계
여러분이 스크립트를 짜고 GameObject에 이것을 붙일 때 마치 Component처럼 Inspector 패널에 보이게 될것입니다. 이렇게 보이는 이유는 스크립트가 저장될 때 Component로 바뀌기 때문입니다. 좀더 자세히 말하면 스크립트가 컴파일되고 나면 Component의 한 타입으로 저장되어 이것이 다른 Unity 엔진내의 Component 처럼 다뤄지게 됩니다.
스크립트 코드에서 선언한 Public Variable(변수)들은 GameObject에서의 Inspector 패널에서 그 변수들이 보이게 되서 이 변수들을 여러분은 수정할 수가 있습니다. 어때여! 꽤 놀라운 기능이지 않습니까? 변수들을 public으로 선언만 하면 툴에서 고칠수 있으니깐 말이져!
스크립트를 작성할 때 여러분은 GameObject 클래스의 멤버들을 바로 접근할수 있습니다. 임의의 클래스가 하나의 Component로서 GameObject에 붙여진다면(attatch) 여러분은 스크립트에서 단순히 멤버 이름을 타이핑해서 Component에 직접 접근할수 있습니다. 예를 들어 transform 은 gameObject.transform와 같습니다. 컴파일러는 여러분이 별도로 다른 GameObject 이름을 지정하지 않는다면 멤버앞에 gameObject가 있다고 가정하고 일을 처리합니다.
this 를 타이핑하는 것은 여러분이 짜고 있는 스크립트 component에 접근하는 것입니다. this.gameObject 를 타이핑하는 것은 script에 붙여진 GameObject를 가리키는 것입니다. 여러분은 그냥 gameObject를 단순히 타이핑해도 GameObject에 접근할수 있습니다. this.transform 과 transform 은 같습니다. 여러분이 GameObject 멤버에 포함되지 않는 어떤 Component에 접근하려면 여러분은 앞으로 설명하게 될 gameObject.GetComponent() 을 사용해야만 합니다.