Version: 2023.1
언어: 한국어
스크립트 생성 및 사용
런타임 시점에 프리팹 인스턴스화

변수와 인스펙터

에디터에서 스크립트를 생성하면 Unity는 MonoBehaviour 클래스를 상속하는 템플릿 스크립트를 자동으로 제공합니다. MonoBehaviour 클래스를 상속하면 스크립트가 컴포넌트 유형처럼 동작할 수 있으며, 이를 다른 컴포넌트처럼 게임 오브젝트에 연결할 수 있습니다.

스크립트가 MonoBehaviour를 상속하면 스크립트에 프로퍼티와 값을 포함할 수 있으며, 다른 컴포넌트와 마찬가지로 에디터 인스펙터에서 편집할 수 있습니다.

아래 예제 코드는 myName이라는 public 변수를 선언합니다. 이 스크립트를 씬의 게임 오브젝트에 배치하면 변수가 인스펙터에서 “My Name”이라는 레이블이 지정된 필드로 표시됩니다. 스크립트에 선언된 “none” 기본값이 인스펙터의 필드에 기본값으로 지정되며, 필드에 입력하여 이 값을 변경할 수 있습니다.

using UnityEngine;
using System.Collections;

public class MainPlayer : MonoBehaviour 
{
    public string myName = "none";
    
    // Use this for initialization
    void Start () 
    {
        Debug.Log("I am alive and my name is " + myName);
    }
}

스크립트 컴포넌트를 배치하는 각 게임 오브젝트는 필드에 대해 고유한 값을 가질 수 있습니다.

인스펙터 창에서 편집 가능한 공용 문자열 필드.
인스펙터 창에서 편집 가능한 공용 문자열 필드.

Unity는 인스펙터 레이블을 생성하기 위해 변수 이름에서 소문자와 대문자 사이에 공백을 삽입하고 몇 가지 다른 규칙을 적용합니다(변수 이름을 레이블로 변환 참조). 그러나 이러한 변경 사항은 표시 목적입니다. 항상 코드 내에 변수 이름을 사용해야 합니다.

인스펙터에서 My Name 값을 편집하고 플레이 버튼을 누르면 이제 입력한 텍스트가 콘솔 메시지에 포함됩니다.

C#의 경우 인스펙터에서 변수를 편집 가능하게 만드는 가장 간단한 방법은 변수를 public으로 선언하는 것입니다. 인스펙터에서 프라이빗 필드를 편집 가능하게 만들려면 SerializeField 속성을 사용할 수 있습니다. 반대로 public 변수가 인스펙터에 표시되지 않도록 하려면 HideInInspector 속성을 사용할 수 있습니다.

참고: 플레이 모드에서 실행하는 동안 에디터에서 스크립트의 변수 값을 변경할 수 있습니다. 이 기능은 플레이 모드를 중지했다가 다시 시작할 필요 없이 변경에 따른 효과를 바로 확인할 때 매우 유용합니다. 그러나 플레이 모드를 중지하면 변수 값은 플레이 모드를 실행하기 전의 값으로 재설정됩니다(모든 스크립트 및 컴포넌트의 경우와 동일).

오브젝트 레퍼런스 필드

부울, 문자열, 숫자 필드뿐만 아니라 UnityEngine.Object에서 타입을 상속하는 모든 필드도 인스펙터에서 편집 가능하도록 설정할 수 있습니다. 여기에는 Transform, AudioSource, Camera, Light 등의 모든 빌트인 컴포넌트 타입, 자체 MonoBehaviour 스크립트 타입 및 다양한 에셋 타입이 포함됩니다.

따라서 자체 스크립트 컴포넌트에서 Unity 에디터의 강력한 드래그 앤 드롭 시스템을 활용할 수 있습니다. 예를 들어 스크립트에서 공용 Transform 필드를 생성하여 하나의 게임 오브젝트에 추가하면, 인스펙터에서 다른 게임 오브젝트를 해당 필드로 드래그하여 해당 게임 오브젝트의 Transform 컴포넌트에 대한 레퍼런스를 설정한 다음 스크립트에서 런타임에 액세스할 수 있습니다.

예를 들어, 이 “Follow” 스크립트는 한 게임 오브젝트가 다른 게임 오브젝트를 따라가도록 합니다.

using UnityEngine;

public class Follow : MonoBehaviour
{
    public Transform objectToFollow;
    public float followSpeed = 1;

    void Update()
    {
        // calculate the distance between this object and the target object
        // and move a small portion of that distance each frame:

        var delta = objectToFollow.position - transform.position;
        transform.position += delta * Time.deltaTime * followSpeed;
    }
}

스크립트에는 에디터에서 할당 가능한 필드로 표시되는 Transform 타입의 공용 필드가 있습니다. 다른 게임 오브젝트를 계층 구조 창에서 이 필드로 드래그 앤 드롭하면 에디터가 해당 게임 오브젝트에 연결된 Transform 컴포넌트에 대한 레퍼런스를 할당합니다.

아래 스크린샷에서 스크립트는 구체 게임 오브젝트에 배치되어 있고, 큐브는 계층 구조에서 “Object To Follow” 필드로 드래그 앤 드롭했습니다.

게임 오브젝트가 할당된 공용 트랜스폼 필드. 여기서 스크립트는 구체(현재 선택됨)에 있으며, 큐브는 계층 구조에서 구체의 Object To Follow 필드로 드래그 앤 드롭했습니다.
게임 오브젝트가 할당된 공용 트랜스폼 필드. 여기서 스크립트는 구체(현재 선택됨)에 있으며, 큐브는 계층 구조에서 구체의 “Object To Follow” 필드로 드래그 앤 드롭했습니다.

참고: MonoBehaviour 스크립트에서 공용 오브젝트 레퍼런스 필드에 대해 기본 오브젝트 레퍼런스를 설정할 수도 있습니다.

변수 이름을 레이블로 전환

인스펙터에서 변수 이름을 레이블로 전환할 때 몇 가지 규칙이 적용됩니다. 예를 들어, 위 예제의 변수 이름은 myName에서 “My Name”으로, objectToFollow에서 “Object To Follow”로 전환되었습니다. 규칙은 다음과 같습니다.

  • 첫 글자를 대문자 처리합니다.
  • 소문자와 대문자 사이에 공백을 추가합니다.
  • 다음 단어의 시작 부분에 있는 머리글자어와 대문자 사이에 공백을 추가합니다.
  • 시작 부분에서 “m_”을 제거합니다.
  • 시작 부분에서 “k”를 제거합니다.
  • 시작 부분에서 “_”를 제거합니다.

“iPad” 또는 “x64”와 같이 이러한 규칙이 적용되지 않는 몇 가지 특별한 사례도 있습니다.

스크립트 생성 및 사용
런타임 시점에 프리팹 인스턴스화