개발자들이 게임을 개발하기 위해 활용하는 대표적인 게임 개발 엔진 중 하나이다.
개발자들은 C# 언어를 사용해 스크립팅(Scripting)을 한다는 점에서 C#언어 학습의 이유 중 하나로 꼽히기도 한다.
쉬운 접근성과 낮은 빌드 난이도, 가벼운 프로젝트 제작에 용이하다는 점에서 널리 사용되고 있는 개발 엔진이다.
2-1-1. Scene
Scene 창을 통해서 레벨/맵에 배치된 인스턴스, 오브젝트 등을 편집 및 관리할 수 있다.
2-1-2. Game
Game 창을 통해 개발자들은 유저에게 어떤 식으로 화면이 보이는지 파악하고 원하는 연출을 만들 수 있다.
2-1-3. Hierarchy
현재 레벨에 포함된 오브젝트(정확히는 인스턴스/객체 라고 표현해야 맞다)들을 표시하고 관리할 수 있다.
2-1-3-1. 오브젝트
오브젝트를 비유하자면 'Holder' 라고 말할 수 있다.
어떠한 특성들, 즉 컴포넌트들을 포함하는 큰 개체를 말하며 이 개체의 특성들은 어떤 컴포넌트들을 가졌고 이 컴포넌트들의 값이 어떻게 구성되어 있냐로 표현할 수 있다.
당연히, 아무런 컴포넌트를 가지고 있지 않은 오브젝트는 레벨에 나타나지도, 어떠한 특성을 가지지도 않는다.
2-1-4. Inspector
하나의 오브젝트에 대한 컴포넌트들을 모두 표시하며, 그의 특성을 조절할 수 있게 도와준다.
'Add Component' 를 통해 새로운 컴포넌트를 추가하여 오브젝트의 상태를 변경할 수 있다.
추가로, C# 코드를 활용한 Scripts 작성 후 다른 컴포넌트들과 동일한 방식으로 오브젝트에 추가할 수 있고 변수 설정 혹은 객체 참조 모두 Inspecter 창에서 관리 가능하다.
2-1-5. Project
해당 프로젝트의 모든 구성 파일을 보여준다. 개인 저장소의 폴더 경로를 통해서도 접근 가능하며, 레벨에 배치된 인스턴스만을 보여주는 것이 아닌, 프로젝트의 저장 파일을 보여주어서 유니티의 경우 Prefab 이라 부르는 클래스를 프로젝트에 만들고 레벨에 배치하는 식으로 사용하기도 한다.
2-1-6. Console
프로젝트를 실행 중, 여러 에러나 오류 사항을 나타내기도 하며 개발자의 임의에 따라 Debug.Log(" ~ "); 코드를 통해 인위적으로 출력 로그를 생성하기도 한다.
최종 빌드 후 유저에게 보이는 로그가 아닌 오직 개발자의 편의를 위해서만 존재하는 창이다.
3-1. 상속
3-1-2. 상속이란?
코드의 재사용성
A클래스와 B클래스에서 공통되는 코드를 부모 클래스에 포함시켜 작성하고, A/B클래스는 이 부모 클래스를 상속받도록 하여 '코드의 반복을 줄이고 유용성이 증가'한다.
자식 클래스는 부모 클래스를 상속하여, 부모 클래스의 기능을 모두 포함한 채로 새로운 기능 추가할 수 있다.
class Parent
{
public void Active1()
{
//
}
public void Active2()
{
//
}
}
class Child : Parent
{
//이때 자식 클래스는 Active1 과 Active2를 모두 상속
}
위 코드와 같이 Parent 클래스를 상속받는 Child 클래스는 Active1 함수와 Active2 함수를 모두 가지고 있다.
부모 클래스의 기능 중에서 원하는 것만 상속할 수는 없다는 점에서, 완벽하게 순수한 부모 클래스를 만드는 것은 불가능하다고 여겨진다.
따라서 상속을 사용할 때는
1. 변화의 가능성을 염두에 두고 코드를 작성
2. 부모 클래스에 포함되는 코드는 항상 최소화
를 염두에 두어야 한다.
3-2. 컴포넌트
"코드의 부품화"
하나의 기능을 가진 코드들을 별개의 객체로 부품화한 것을 컴포넌트라고 부르고, 이 컴포넌트들은 스스로 동작하는 독립 부품으로 취급할 수 있다.
원하는 기능을 가진 컴포넌트들을 조합하여 하나의 오브젝트를 만들 수 있다.
이러한 점에서 유연한 재사용성과 기획자의 프로그래머 의존도 하락, 특성의 추가 및 삭제가 유용하다는 장점이 나타난다.
유니티에서의 활용 방안으로 Cube 라는 오브젝트에 Add Component 기능을 통해 새 컴포넌트를 추가한 모습이다.
유니티에서 오브젝트를 다룰 때의 가장 기초적인 방법으로 여겨지며 앞서 언급한 Inspecter 창에서 관리할 수 있다.
여기까지 이해했다면 이러한 부품, 컴포넌트가 어떻게 작동하는가에 의문을 가질 수 있다.
3-2-1. MonoBehavior
MonoBehavior란 유니티에서 제공하는 컴포넌트 중 하나로, 이벤트 메시지를 감지할 수 있다는 특성이 있다.
유니티의 모든 컴포넌트들은 MonoBehavior를 상속받고 +@의 기능을 우리가 정의한다는 점에서 이러한 이벤트 메시지를 활용해 동작시키는 것이다.
이벤트 메시지는 모든 게임 오브젝트에 동일한 메시지를 전송하는 시스템인 브로드 캐스팅(BroadCasting)을 이용한 것으로 실행해야 하는 기능을 담고 있는 정보라고 볼 수 있다.
//메세지 : Active1 실행
class No1
{
public void Active1()
{
//
}
}
class No2
{
public void Active2()
{
//
}
}
이벤트 메시지가 'Active1을 실행하라' 라는 내용을 담고 있을 때, No1 클래스는 작동 / No2 클래스는 작동하지 않는다.
명시된 기능을 가지고 있으면 이를 실행하고 없으면 무시한다는 특성을 가지고 있다는 것이다.
추가로 이 코드에서 메시지를 보내는 쪽은 No1 이 받는지, No2가 받는지 신경쓰지 않고
메시지를 받은 클래스들은 누가 메시지를 보낸건지 신경쓰지 않는다.
단순히 기능만을 실행한다는 점에서 독립성을 유지하기 아주 좋은 시스템이라고 볼 수 있다.
대표적인 예시로 유니티 코드에서의 Start 함수와 Update 함수가 있다.
#세미나 자료의 모든 글은 'Udemy - retr0의 유니티 (Unity C#) 게임 프로그래밍 에센스' 강의자료를 참고했음을 밝힙니다.
#6. 오버로드(Overload) (0) | 2024.07.28 |
---|---|
#5. 인스턴스(Instance) (0) | 2024.07.24 |
#4. 벡터 연산 (5) | 2024.07.24 |
#3. 클래스와 오브젝트 (0) | 2024.07.18 |
#2. 변수와 함수 (0) | 2024.07.18 |