태그는 누구와 충돌했는지 알기 위해서 사용합니다. 그때 사용하는 것이 CompareTag
transform.Find는 써도 괜찮습니다. 자식을 찾는 것이라서 큰 연산이 들어가지 않기 때문입니다.
이번 시간에는 실제 스크립트를 직접 작성하며 Unity 프레임워크와 여러 가지 기본적인 모듈을 다뤄보도록 하겠습니다.
스크립트 프로젝트 창 혹은 메뉴를 통해서 생성할 수 있다.
스크립트 생성 시 주의할 점은 클래스 이름과 스크립트 파일의 이름이 동일해야 합니다.
먼저 디버그를 하는 방법부터 알아보겠습니다. Debug 모듈은 디버그를 위한 다양한 기능을 제공하고 있습니다.
로그는 3가지로 구분할 수 있습니다.
Log() : 단순 정보 전달
LogWarning(): 경고 메시지
LogError() : 오류 메시지
Start() 본문에 아래와 같이 내용을 작성해보겠습니다.
각 로그별로 다르게 UI가 나타나는 것을 확인할 수 있습니다.
디버그를 위해 때로는 특정 상황에 게임을 중단시키고 싶을 수 있습니다. 그때는 Break()를 사용합니다.
Break()를 호출하면 다음 프레임에 실제로 멈추게 됩니다.
강건한 애플리케이션을 만드는 방법 중 하나는 함수의 입력 데이터나 반환 데이터에 대해서 검증을 시행하는 것입니다. 아래와 같이 문자열을 검증하는 것이 대표적인 사례라고 할 수 있습니다.
단정문으로 오류를 쉽게 찾을 수 있습니다.
단정문은 무조건 조건을 만족시켜야합니다.
단정문은 반드시 해당 조건을 지켜야합니다. 예외는 없습니다.
단정문을 잘 사용해야 좋은 애플리케이션을 만들 수 있고, 버그를 빠르게 찾을 수 있습니다.
조건문은 예외를 처리하는 용도입니다. 그래서 프로그램이 예기치 않게 종료되지 않게 만들어주는 것입니다.
컴포넌트는 MonoBehavior 클래스를 상속 받습니다. MonoBehavior는 Unity가 제공하는 프레임워크를 사용하기 위한 클래스로 Unity에게 코드의 실행을 위임하는 것입니다.
이 클래스에는 각종 이벤트 함수(Event Function)가 정의되어 있으며 이것에 의해 스크립트가 동작하게 됩니다.
Unity의 프레임워크는 여기를 참고하면 확인할 수 있습니다. Unity 엔진은 각 단계와 대응되는 이벤트 함수를 실행하기 때문에 각 이벤트 함수가 언제 호출되는지 정확히 알아야 올바르게 Unity를 사용할 수 있습니다. 이 중 알아야 할 것은 아래와 같습니다.
씬이 시작할 때 단 한 번만 호출되는 함수로 초기화를 위해 사용합니다.
보통 다른 객체에 대한 참조를 하는 용도로 정의합니다. 만약 게임오브젝트가 비활성화된 상태로 시작할 경우에는 Awake()가 실행되지 않습니다.
컴포넌트 혹은 게임오브젝트가 활성화 될 때마다 호출되는 함수입니다.
Awake() 호출 직후 바로 호출됩니다.
컴포넌트가 활성화 되어 있을 때, 첫 프레임 시작 전 호출되는 함수입니다.
고정된 간격으로 호출되는 함수로 물리 연산이 구현되는 곳입니다.
매 프레임마다 호출되는 함수로 게임 로직이 구현되는 곳입니다.
Update() 이후에 호출되는 함수로 3인칭 카메라를 구현하는 데 보통 사용합니다.
애플리케이션이 일시정지 될 때 호출되는 함수입니다.
애플리케이션이 종료될 때 호출되는 함수입니다. 에디터에서는 플레이모드를 종료할 때 호출됩니다.
컴포넌트 혹은 게임오브젝트가 비활성화 될 때마다 호출되는 함수입니다.
OnEnable()의 반대라고 할 수 있습니다.
게임 오브젝트가 삭제될 때 호출되는 함수입니다.
씬에 존재하는 게임오브젝트 중 어떤 것부터 이벤트 함수가 호출되는지, 같은 게임오브젝트에 부착된 컴포넌트 중 어떤 것부터 이벤트 함수가 호출되는지 정해져 있는 것이 없습니다.*
따라서 게임오브젝트 간 혹은 컴포넌트 간 종속이 있다면 에디터에서 생성하는 것이 아니라 동적으로 생성해줘야합니다. 이 외에도 필요한 이벤트 함수는 더 있습니다.
*여기에서 실행 순서를 설정할 수 있습니다...만, 특수한 경우에만 사용합니다.
.NET의 최상위 타입이 System.Object인 것처럼 Unity에서 사용하는 모든 타입의 최상위 타입은 UnityEngine.Object입니다.
이 타입을 상속 받으면 Unity 에디터에서 여러 가지를 조작할 수 있게 됩니다.
오브젝트의 이름은 name을 이용해 제어할 수 있습니다.
MyKnow로 바뀐 이름은 플레이하는 동안 바뀐 이름으로 진행되고, 플레이가 끝나면 기존 이름으로 다시 돌아옵니다. name을 사용하는 이유는 버그를 손쉽게 찾기 위함입니다.
Destroy로 오브젝트를 삭제할 수 있습니다.
컴포넌트가 부착되어 있는 게임오브젝트에 접근할 수 있습니다.
게임오브젝트의 활성화 상태 제어는 SetActive()를 사용하며 읽을 때는 activeSelf를 사용합니다.
단, 게임오브젝트의 활성화는 자기 자신의 활성화 상태 말고도 부모의 상태도 영향을 받습니다.
그래서 스스로는 활성화가 되어 있어도 부모에 의해서 비활성화 되어 있을 수 있습니다.
이때는 activelnHierarchy를 사용합니다.
아래 예시를 사용해보고 사용 법을 익혀봅시다.
Tag를 이용해 태그의 정보를 가져올 수 있습니다.
비교할 때는 ComareTag를 사용하빈다.
태그는 누구와 충돌했는지 알기 위해서 사용합니다. 그때 사용하는 것이 CompareTag
이름이나 태그로 게임 오브젝트를 찾을 수 있습니다.
위에서 써놓았듯이 Find메소드는 씬에 존재하는 모든 게임오브젝트를 대상으로 하기 때문에 성능에 지대한 영향을 줍니다. 자세한 것은 여기를 참고하면 되겠습니다.
게임오브젝트를 동적으로 생성할 수도 있습니다.*
*이 방법은 자주 사용되지는 않습니다. 추후에는 프리팹을 사용합니다.
GetComponent() 혹은 GetComponents()로 같은 게임오브젝트의 부착된 특정 컴포넌트를 가져올 수 있습니다.
모든 게임오브젝트는 트랜스폼 컴포넌트를 가지고 있기 때문에 언제든 접근할 수 있습니다.
트랜스 폼에 기능 중 하나는 부모 - 자식 관계를 표현하는 것입니다.
이에 대해서 알아보겠습니다.
parent를 통해 부모 게임오브젝트에 접근할 수 있으며, SetParent()로 부모를 설정해줄 수 있습니다.
또한 root로 최상위 게임오브젝트에 대해서도 접근할 수 있습니다.
자식은 GetChild()로 접근할 수 있습니다. 이때 인수로 인덱스를 넘겨주는데 몇 개의 자식이 있는지는 childCount를 사용하면 됩니다.
자식의 이름을 찾고 싶다면 Find()를 사용하면 됩니다.
스크립트를 디버깅하고 싶다면 여기를 참고하면 됩니다.
예외를 위한 콜스택을 확인하고 싶다면 여기를 참고하면 되겠습니다.