스크립트들 사용하기 Using Scripts

이 페이지는 한 프로젝트에서 어떻게 스크립트들을 생성하고 활용하는지에 관한 짧은 소개입니다. 더 자세한 스크립팅 API에 관한 정보는 Scripting Reference를 참조하시길 바랍니다. 스크립팅을 통한 게임 플레이 생성에 관해 더 자세한 정보는 이 매뉴얼의 Creating Gameplay 페이지를 참조하십시오.

유니티 내에서의 스크립팅은 JavaScript, C#, 또는 Boo. 에서 간단한 행동 스크립트(behavior script)를 작성함으로써 이루어 집니다. 한 프로젝트에서 하나 또는 여러 개의 스크립팅 언어들을 같이 사용할 수 있고, 하나 이상을 사용한다고 해서 문제점이 생기지 않습니다. 특별히 언급되지 않는 한, 여기에 사용된 모든 스크립팅의 예들은 자바 스크립트로 사용됩니다.

새로운 스크립트들 생성하기 Creating new scripts

메쉬들이나 텍스쳐들과 같은 다른 에셋 들과는 달리, 스크립트 파일들은 유니티 내부에서 생성될 수 있습니다. 새로운 스크립트를 생성하기 위해서는 메인 메뉴로부터 Assets→Create→JavaScript를 엽니다 (또는Assets→Create→C Sharp Script 또는 Assets→Create→Boo Script). 이는 NewBehaviourScript 라고 불리는 새로운 스크립트를 생성하고 프로젝트 뷰Project View 내의 선택된 폴더로 이 스크립트를 위치시킵니다. 프로젝트 뷰에서 아무 폴더도 선택되지 않으면, 스크립트는 루트 레벨 (root level) 에서 생성됩니다.

사용자는 프로젝트 뷰에서 스크립트를 더블클릭 해서 수정할 수 있습니다. 이는 유니티의 환경설정 (Preferences)에서 디폴트로 선택된 에디터를 실행시킬 것입니다. 사용자는 스크립팅을 유니티 안에서 직접 하는 것이 아니라, 어떤 외부 텍스트 에디터에서 하게 됩니다. 디폴트 스크립트 에디터를 설정하기 위해서는, Unity→Preferences→External Script editor에서 드롭다운 (drop-down) 아이템을 변경하십시오.

다음은 새롭게 생성된 비어있는 행동 스크립트(behavior script)의 콘텐츠들입니다:

function Update () {
} 

새로운 빈 스크립트는 혼자서는 할 수 있는 것이 많지 않습니다. 그러므로 몇몇 기능들을 추가해 보겠습니다. 스크립트들이 다음을 읽도록 변경합니다:

function Update () {
    print("Hello World");
} 

실행 시에, 이 코드는 콘솔에 "Hello World"를 출력 print 할 것입니다. 그러나, 코드를 실행시키는 것은 아직 없습니다. 사용자는 스크립트를 실행 하기 위해 스트립트를 씬 Scene에서 활성화된 게임 오브젝트GameObject에 야 (attach) 합니다.

스크립트를 객체에 붙이기 Attaching scripts to objects

위의 스크립트를 저장하고 GameObject→Create Other→Cube를 선택해서 씬에서 새로운 객체를 만드세요. 이것은 "Cube"라는 새로운 게임오브젝트를 생성하게 될 것입니다.

이제 스크립트를 프로젝트 뷰에서 큐브(씬이나 계층 뷰 Hierarchy View나 상관 없음)로 드래그하세요. 사용자는 또한 큐브를 선택하고 Component→Scripts→New Behaviour Script를 고를 수도 있습니다. 이들 중 어떤 방법이든 스크립트를 큐브에 붙일 (attach) 수 있습니다. 사용자가 생성한 모든 스크립트는 Component→Scripts 메뉴에 보일 것 입니다. 만약 사용자가 해당 스크립트의 이름을 바꿨다면, 그 새 이름이 보일 것입니다. 만약 사용자가 큐브를 선택하고 인스펙터 Inspector를 본다면, 사용자는 스크립트를 이제 볼 수 있음을 알 수 있습니다. 이는 스크립트가 붙여졌음을 의미합니다.

만약, 큐브를 선택하고 Inspector를 본다면, 스크립트가 이제 보여짐을 알 수 있습니다. 이는, 스크립트가 부착되었음을 의미합니다.

만든 것을 테스트 하려면, Play를 누르세요. Play/Pause/Stop 버튼들 옆에 "Hello World" 텍스트가 보이는 것을 알 수 있습니다. 그게 보이면 플레이모드에서 나오세요.

게임오브젝트 다루기 Manipulating the Game Object

print()스테이트먼트 statement 는 사용자의 스크립트를 디버깅할 때 매우 유용합니다. 하지만 자신이 붙어있는 게임오브젝트를 조정하지는 않습니다. 몇몇 기능을 추가하기 위해서 이 스크립트를 변경해 봅시다:

function Update () {
    transform.Rotate(0, 5*Time.deltaTime, 0);
} 

사용자가 스크립팅이 처음이라면, 혼란스러울 수도 있습니다. 다음은 꼭 이해해야 할 중요한 개념들입니다:

  1. function Update () {} 는 유니티가 초 당 여러번 (프레임당 한번) 실행시키는 코드의 컨테이너 container 입니다).
  2. transform은 게임오브젝트의 트랜스폼 컴포넌트 Transform Component로의 참조입니다.
  3. Rotate()는 트랜스폼 컴포넌트 Component 안에 포함되어 있는 함수입니다.
  4. 콤마 사이의 숫자들은 3D 공간에서 각 축(X, Y, Z) 주위의 회전 정도를 나타냅니다.
  5. Time.deltaTime는 1초동안의 움직임을 균등하게 나누는 시간(Time) 클래스의 멤버로, 사용자의 컴퓨터가 얼마나 많은 초당 프레임 (frames per second) 들을 렌더링 하는지에 관계없이 항상 같은 속도로 회전할 것입니다. 그러므로, 5 * Time.deltaTime는 초당 5 도를 의미 합니다.

그렇다면 이것의 의미는 이렇게 해석됩니다: “모든 프레임에서 이 게임오브젝트의 트랜스폼 컴포넌트를 초 당 Y축으로 5도가 움직여지도록 조금씩 회전시킨다”

사용자는 방금 transform에 접근했었던 것처럼 많은 다른 종류의 컴포넌트들에도 접근 access 할 수 있습니다. 사용자는 컴포넌트 Component 메뉴를 사용해서 게임 오브젝트에 컴포넌트들을 추가해야 합니다. 사용자가 쉽게 접근할 수 있는 모든 컴포넌트들은 GameObject Scripting Reference Page 의 변수들 Variables 항목에 리스트가 나열되 있습니다.

게임오브젝트들과, 스크립트들, 그리고 컴포넌트들 사이의 관계에 대한 더 많은 정보를 원하신다면 앞으로 건너 띄어 이 매뉴얼의 GameObjects 페이지나 Using Components 페이지를 참조하시기 바랍니다.

변수들의 파워 The Power of Variables

사용자가 방금 만든 스크립트는 항상 큐브를 초 당 5도씩 회전시킬 것입니다. 하지만 사용자는 초 당 다른 도수의 회전을 원할 수도 있습니다. 해당 수를 바꿔서 저장할 수도 있는데, 그러면 스크립트가 재컴파일 recompile 하도록 기다려야 하며, 결과들을 보기 위해 플레이 모드로 들어가야 합니다. 이것을 위해 훨씬 더 빠른 방법이 있습니다. 플레이 모드 동안 회전 속도를 실시간으로 실험해 볼 수 있는 매우 쉬운 방법이 있습니다.

Rotate() 함수에 5를 타이핑 하는 대신에, speed 변수를 선언하고, 해당 함수에서 사용합니다. 스크립트를 다음과 같이 수정하고 저장하세요:

var speed = 5.0;
 
function Update () {
    transform.Rotate(0, speed*Time.deltaTime, 0);
}

이제 큐브를 선택하고, 인스펙트를 살펴보세요. 사용자의 speed 변수가 어떻게 보이는지 주목하세요.

이 변수는 이제 파일 익스플로러에서 파일을 이름 바꾸기 rename 하는 것처럼 쉽게 인스펙터에서 직접 변경이 가능합니다. 해당 변수를 선택하고 리턴 Return을 누른 후 값을 변경합니다. 사용자는 해당 값 위에 마우스 우클릭이나 옵션클릭(option-click)을 할 수 있고, 마우스를 위아래로 드래그 할 수도 있습니다. 해당 변수는 어느 때나 수정 가능합니다. 설사 게임이 실행 중이라도 가능합니다.

Play 를 누르고, speed 값을 조정해 보세요. 큐브의 회전 속도는 즉시 변경될 것입니다. 하지만 플레이 모드를 나온 순간, 변경 사항들이 플레이모드로 들어가기 이전의 값으로 되돌아간 걸 확인 할 수 있습니다. 이 방식을 통해 사용자는 원하는 값을 찾기 위해 여러가지 값을 충분히 실험해 본 후 그 값을 완전히 적용시킬 수 있습니다.

인스펙터내에서 변수의 값을 변경하는 이같은 방법은 사용자가 하나의 스크립트를 많은 오브젝트들에 각각 다른 변수 값으로 재사용할 수 있음을 의미합니다. 만약 사용자가 스크립트를 여러 개의 큐브들에 붙인 후 각 큐브의 speed를 바꾸면, 이 큐브들이 비록 같은 스크립트를 사용함에도 각각 다른 속도로 회전할 것입니다.

다른 컴포넌트들 접근하기 Aceessing Other Components

스크립트 컴포넌트를 작성할 때, 그 스크립트 안의 게임오브젝트 상의 다른 컴포넌트들에 접근할 수 있습니다.

게임오브젝트 멤버들 사용하기 Using the GameObject members

사용자는 게임오브젝트 클래스의 어떤 멤버에도 직접 접근할 수 있습니다. 모든 게임 오브젝트 클래스 맴버들의 리스트는 여기서 (here) 보실 수 있습니다. 만약 지정된 클래스들중 어떤 하나가 컴포넌트로써 게임오브젝트에 붙게 (attach) 되면, 그 컴포넌트의 멤버 이름을 타이핑해서 직접 스크립트를 통해 해당 컴포넌트에 접근할 수 있습니다. 예를 들어, transform을 타이핑하는 것은gameObject.transform에 상응합니다. 사용자가 따로 다른 게임오브젝트를 특별히 참조 reference 하지 않는 이상, 컴파일러는 자동으로gameObject로 인식을 하게 됩니다.

this를 타이핑하는 것은 사용자가 현재 작성하는 스크립트 컴포넌트에 접근하는 것입니다. this.gameObject 를 타이핑하는 것은 그 스크립트가 붙어 있는 게임 오브젝트를 말하는 것입니다. 사용자는 간단히 gameObject를 타이핑해서 같은 게임오브젝트에 접근할 수 있습니다. 논리적으로 this.transform라고 타이핑하는 것은 transform을 타이핑 하는 것과 같습니다. 게임오브젝트 멤버로서 포함되지 않은 컴포넌트로의 접근을 원하면, 다음 페이지에 설명된 gameObject.GetComponent()를 사용하셔야 합니다.

유니티에는 어떤 스크립트에서도 직접 접근할 수 있는 수많은 컴포넌트들이 있습니다. 예를 들어 사용자가 트랜스폼 컴포넌트의 이동 Translate 함수에 접근하려면, 단지 transform.Translate() 혹은 gameObject.transform.Translate()를 쓰면 됩니다. 이것은 모든 스크립트들이 게임오브젝트에 붙게 되므로 가능한 일입니다. 그래서 사용자가 transform 을 쓸 때, 사용자는 암묵적으로 스크립트 된 게임오브젝트의 트랜스폼 컴포넌트로 접근을 하게 되는 것입니다. 이것을 외부적으로 나타내고 싶다면, gameObject.transform 이라고 적으시면 됩니다. 어느 한 방법이 다른 방법보다 더 나은 것은 아니고, 이것은 스크립트를 짜는 사용자의 성향에 달려 있습니다.

암묵적으로 (implicitly) 접근 할 수 있는 모든 컴포넌트들의 리스트를 살펴보시려면 스크립팅레퍼런스(영문) 내의 GameObject 페이지를 참조하시기 바랍니다.

//GetComponent()//사용하기

컴포넌트들 중에는 GameObject 클래스의 멤버들로서 직접 참조되지 않는 컴포넌트들이 많이 있습니다. 그래서 암묵적으로(implicitly) 접근 할 수 없고, 외부적으로 명확히 (explicitly) 접근해야 합니다. 사용자는 GetComponent("component name") 를 호출하고 레퍼런스를 결과물에 저장함으로써 이것을 할 수 있습니다. 이는 사용자가 해당 게임오브젝트에 부착된 또 다른 스크립트에 참조 reference 를 만들고자 할 때, 가장 보편적으로 사용되는 방법입니다.

사용자가 Script B 를 작성하고 같은 게임오브젝트에 부착된 Script A에 레퍼런스를 만든다고 가정해 보십시오. 사용자는 해당 레퍼런스를 만들기 위해서 GetComponent()를 사용해야만 할 것입니다. 스크립트 B에서는 사용자는 간단히 다음과 같이 작성할 것입니다:

scriptA = GetComponent("ScriptA");

그러면 스크립트 B내에서scriptA.variableName를 작성함으로 인해서 스크립트 A 변수들의 어떤 것들에도 접근을 할 수 있게 됩니다. GetComponent()의 사용에 관련해 더 많은 도움을 원하시면 GetComponent() Script Reference page 를 참조해 주시길 바랍니다.

이 시점으로부터 나아갈 방향은

에디터내에서 스크립트들을 사용하는 짧은 개요들을 살펴보았습니다. 더 많은 예들은, 유니티와 함께 소개된 Tutorials을 참조하십시오. 또한, 스크립트 레퍼런스 내에 Scripting Overview 페이지를 읽으십시오. 해당 페이지는 유니티를 사용한 스크립팅에 대한 더 많은 소개가 있고, 더 깊은 정보를 위한 참조들 혹은 참조 포인터들(pointers into the reference itself)을 포함합니다. 만약, 난관에 봉착하게 되면 Unity AnswersUnity Forums를 방문하셔서 질문하시길 바랍니다. 누군가는 항상 기꺼이 도와 주려 할 것입니다

역링크