이 페이지는 한 프로젝트에서 어떻게 스크립트들을 생성하고 활용하는지에 관한 짧은 소개입니다. 더 자세한 스크립팅 API에 관한 정보는 Scripting Reference를 참조하시길 바랍니다. 스크립팅을 통한 게임 플레이 생성에 관해 더 자세한 정보는 이 매뉴얼의 Creating Gameplay 페이지를 참조하십시오.
유니티 내에서의 스크립팅은 JavaScript
, C#
, 또는 Boo
. 에서 간단한 행동 스크립트(behavior script)를 작성함으로써 이루어 집니다. 한 프로젝트에서 하나 또는 여러 개의 스크립팅 언어들을 같이 사용할 수 있고, 하나 이상을 사용한다고 해서 문제점이 생기지 않습니다. 특별히 언급되지 않는 한, 여기에 사용된 모든 스크립팅의 예들은 자바 스크립트로 사용됩니다.
메쉬들이나 텍스쳐들과 같은 다른 에셋 들과는 달리, 스크립트 파일들은 유니티 내부에서 생성될 수 있습니다. 새로운 스크립트를 생성하기 위해서는 메인 메뉴로부터 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) 합니다.
위의 스크립트를 저장하고 GameObject→Create Other→Cube를 선택해서 씬에서 새로운 객체를 만드세요. 이것은 "Cube"라는 새로운 게임오브젝트를 생성하게 될 것입니다.
이제 스크립트를 프로젝트 뷰에서 큐브(씬이나 계층 뷰 Hierarchy View
나 상관 없음)로 드래그하세요. 사용자는 또한 큐브를 선택하고 Component→Scripts→New Behaviour Script를 고를 수도 있습니다. 이들 중 어떤 방법이든 스크립트를 큐브에 붙일 (attach) 수 있습니다. 사용자가 생성한 모든 스크립트는 Component→Scripts 메뉴에 보일 것 입니다. 만약 사용자가 해당 스크립트의 이름을 바꿨다면, 그 새 이름이 보일 것입니다. 만약 사용자가 큐브를 선택하고 인스펙터 Inspector
를 본다면, 사용자는 스크립트를 이제 볼 수 있음을 알 수 있습니다. 이는 스크립트가 붙여졌음을 의미합니다.
만약, 큐브를 선택하고 Inspector
를 본다면, 스크립트가 이제 보여짐을 알 수 있습니다. 이는, 스크립트가 부착되었음을 의미합니다.
만든 것을 테스트 하려면, Play
를 누르세요. Play/Pause/Stop 버튼들 옆에 "Hello World" 텍스트가 보이는 것을 알 수 있습니다. 그게 보이면 플레이모드에서 나오세요.
print()스테이트먼트 statement 는 사용자의 스크립트를 디버깅할 때 매우 유용합니다. 하지만 자신이 붙어있는 게임오브젝트를 조정하지는 않습니다. 몇몇 기능을 추가하기 위해서 이 스크립트를 변경해 봅시다:
function Update () { transform.Rotate(0, 5*Time.deltaTime, 0); }
사용자가 스크립팅이 처음이라면, 혼란스러울 수도 있습니다. 다음은 꼭 이해해야 할 중요한 개념들입니다:
컴포넌트 Component
안에 포함되어 있는 함수입니다.그렇다면 이것의 의미는 이렇게 해석됩니다: “모든 프레임에서 이 게임오브젝트의 트랜스폼 컴포넌트를 초 당 Y축으로 5도가 움직여지도록 조금씩 회전시킨다”
사용자는 방금 transform에 접근했었던 것처럼 많은 다른 종류의 컴포넌트들에도 접근 access 할 수 있습니다. 사용자는 컴포넌트 Component 메뉴를 사용해서 게임 오브젝트에 컴포넌트들을 추가해야 합니다. 사용자가 쉽게 접근할 수 있는 모든 컴포넌트들은 GameObject Scripting Reference Page 의 변수들 Variables
항목에 리스트가 나열되 있습니다.
게임오브젝트들과, 스크립트들, 그리고 컴포넌트들 사이의 관계에 대한 더 많은 정보를 원하신다면 앞으로 건너 띄어 이 매뉴얼의 GameObjects 페이지나 Using Components 페이지를 참조하시기 바랍니다.
사용자가 방금 만든 스크립트는 항상 큐브를 초 당 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를 바꾸면, 이 큐브들이 비록 같은 스크립트를 사용함에도 각각 다른 속도로 회전할 것입니다.
스크립트 컴포넌트를 작성할 때, 그 스크립트 안의 게임오브젝트 상의 다른 컴포넌트들에 접근할 수 있습니다.
사용자는 게임오브젝트 클래스의 어떤 멤버에도 직접 접근할 수 있습니다. 모든 게임 오브젝트 클래스 맴버들의 리스트는 여기서 (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 페이지를 참조하시기 바랍니다.
컴포넌트들 중에는 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 Answers나 Unity Forums를 방문하셔서 질문하시길 바랍니다. 누군가는 항상 기꺼이 도와 주려 할 것입니다