Unity에서 게임 개발을위한 궁극의 초보자 가이드

Unity는 게임에서 대화 형 시각화에 이르기까지 모든 것을 프로토 타이핑 할 수있는 훌륭한 도구입니다. 이 기사에서는 Unity 사용을 시작하는 데 필요한 모든 것을 살펴 봅니다.

먼저, 나에 대해 조금 : 저는 취미를 가진 Unity 개발자, 3d 모델러 및 그래픽 디자이너로 Unity 및 Blender와 5 년 넘게 작업 해 왔습니다. 저는 현재 University College Dublin의 금융 수학 학생이며 때때로 프리랜서 그래픽 디자인, 웹 프로토 타이핑 및 게임 프로토 타이핑을합니다.

소개

이 기사는 이전에 Unity를 사용한 적이 없지만 프로그래밍 또는 웹 디자인 / 개발 경험이있는 사람을 대상으로합니다. 이 기사가 끝날 때까지 엔진에 대한 일반적인 개요와 기본 게임을 만들기 시작하는 데 필요한 모든 기능과 코드를 이해해야합니다.

왜 Unity인가?

게임을 만들고 싶다면

인디 게임 개발에는 옵션이 거의 없습니다. 게임을 빌드하려는 경우 세 가지 주요 선택 사항은 Unreal, Unity 또는 GameMaker입니다.

Unity는 아마도 3 가지 플랫폼 중 가장 의견이 적은 편일 것입니다. 그것은 당신에게 매우 원시적 인 제품을 제공하지만 매우 유연하고 잘 문서화되어 있으며 당신이 생각할 수있는 거의 모든 장르의 게임을 구축 할 수 있도록 고도로 확장 가능합니다.

Escape from Tarkov (FPS), Monument Valley (Puzzler), This War of Mine (전략 / 서바이벌)과 같이 매우 성공적인 게임이 모두 Unity에 내장되어 있습니다.

실제로 첫 번째 게임을 만드는 엔진은 아마도 중요하지 않을 것입니다. 그래서 제 조언은 단지 하나를 선택하고 함께가는 것입니다.

사용자 경험을 프로토 타이핑하려는 경우

Unity는 물리, 애니메이션 및 실시간 3D 렌더링이 포함 된 엔진 일 뿐이므로 UX 연구를위한 완전한 인터랙티브 프로토 타입을 제작할 수있는 좋은 공간이기도합니다.

Unity는 VR 및 AR을 완벽하게 지원하므로 클라이언트와 함께 아키텍처, 자동화 및 시뮬레이션을 탐색하는 데 훌륭한 도구가 될 수 있습니다.

이 기사의 섹션

  • 왜 Unity인가?
  • Unity 에디터 창
  • Unity 게임 오브젝트
  • Unity 내장 구성 요소
  • 사용자 지정 구성 요소 만들기
  • MonoBehaviour의 구조
  • 조작 게임 오브젝트
  • 레이 캐스팅
  • 충돌 감지
  • 고급 기능
  • 신규 이민자를위한 조언
  • 니스 자원과 사회
  • 결론

Unity 에디터 창

편집기 창은 몇 개의 섹션으로 나뉩니다. 우리는 기사 전체에서 지속적으로 언급 할 것이므로 이것을 매우 간략하게 다룰 것입니다. 이것에 이미 익숙하다면 그냥 지나치십시오!

Scene View : Scene Game View 에서 GameObject의 배치 및 이동을 허용 합니다. 플레이어가 카메라 Inspector 에서 장면을 보는 방법을 미리 볼 수 있습니다. 장면에서 선택한 GameObject에 대한 세부 정보를 제공합니다. 자산 / 프로젝트 : 모든 프리 팹, 텍스처, 모델, 스크립트 등이 여기에 저장됩니다. 계층 구조 : 장면 내에서 게임 오브젝트의 중첩 및 구조화를 활성화합니다 .

이제 시작하는 것이 좋습니다!

Unity 게임 오브젝트

게임 오브젝트 란?

GameObject는 Unity 게임 엔진의 모든 요소를 ​​구성하는 핵심 요소입니다. 이름은 거의 그것을 알려줍니다.

Unity의 씬에 배치하는 모든 것은 '게임 오브젝트'로 래핑되어야합니다.

웹 디자인 배경이 있다면 게임 오브젝트를 요소와 매우 유사하다고 생각할 수 있습니다! 매우 지루한 컨테이너이지만 복잡한 기능이나 비주얼을 만들기 위해 확장 성이 뛰어납니다.

말 그대로 파티클 이펙트, 카메라, 플레이어, UI 요소 등 모든 것이 게임 오브젝트입니다.

계층 생성

웹 개발에서와 마찬가지로 GameObject도 컨테이너입니다. 다양하고 바람직한 레이아웃이나 추상화를 만들기 위해 s를 중첩하는 것처럼 게임 객체에도 똑같이 할 수 있습니다.

게임 개체를 중첩하는 논리는 웹 개발과 거의 동일합니다. 몇 가지 예를 들어 보겠습니다.

클러 터 및 효율성

웹 비유 : 사용자 상호 작용에 대한 응답으로 즉석에서 동적으로 생성 될 수있는 유사한 요소가 많이 있으며 깔끔하게 유지하고 싶습니다. Unity 번역 : Minecraft 클론을 만들고 장면에 많은 블록이있는 경우 성능상의 이유로 장면에서 '덩어리'블록을 추가하고 제거해야합니다. 따라서 청크 부모를 삭제하면 모든 자식 블록이 제거되므로 각 청크에 대해 빈 게임 오브젝트를 부모로 지정하는 것이 좋습니다.

포지셔닝

웹 비유 : 포함 된 콘텐츠의 위치를 ​​웹 페이지가 아닌 컨테이너에 대해 '상대적'으로 유지하려고합니다. Unity 번역 : 플레이어 주위를 맴도는 헬퍼 드론을 많이 만들었습니다. 플레이어를 쫓는 코드를 작성하는 대신 플레이어 게임 오브젝트의 자식으로 인스턴스화합니다.

Unity 내장 구성 요소

액터 컴포넌트 모델

게임 오브젝트 자체는 거의 쓸모가 없습니다. 우리가 보았 듯이 그것들은 단지 컨테이너 일뿐입니다. 기능을 추가하려면 기본적으로 C # 또는 Javascript로 작성된 스크립트 인 구성 요소를 추가해야합니다.

Unity는 액터 컴포넌트 모델에서 작동합니다. 간단히 말해서 게임 오브젝트는 액터이고 컴포넌트는 스크립트입니다.

이전에 웹 앱을 작성한 적이 있다면 버튼, 양식 요소, 다양한 지시문 및 사용자 정의 가능한 속성이있는 유연한 레이아웃과 같은 작은 재사용 가능한 구성 요소를 만드는 아이디어에 익숙해 질 것입니다. 그런 다음 이러한 작은 구성 요소를 더 큰 웹 페이지로 조립합니다.

이 접근 방식의 가장 큰 장점은 재사용 가능성 수준과 요소간에 명확하게 정의 된 통신 채널입니다. 마찬가지로 게임 개발에서도 의도하지 않은 부작용의 위험을 최소화하고자합니다. 작은 버그는 조심하지 않으면 제어 할 수 없게되는 경향이 있으며 디버그하기가 매우 어렵습니다. 따라서 작고 견고하며 재사용 가능한 구성 요소를 만드는 것이 중요합니다.

주요 내장 구성 요소

Unity 게임 엔진에서 제공하는 내장 구성 요소의 몇 가지 예를 살펴볼 때입니다.

  • MeshFilter : 게임 오브젝트의 3D 메시에 재질을 할당 할 수 있습니다 .
  • MeshRender : 재질을 3D 메시에 할당 할 수 있습니다 .
  • [상자 | Mesh] Collider : 충돌 중 GameObject 감지 활성화
  • Rigidbody : 사실적인 물리 시뮬레이션을 활성화하여 3D 메시가있는 게임 오브젝트에서 작동하고 상자 충돌체에서 감지 이벤트를 트리거합니다.
  • 조명 : 장면의 일부를 비 춥니 다.
  • 카메라 : 게임 오브젝트에 연결할 플레이어 뷰포트를 정의합니다.
  • GUI 표시를위한 다양한 UI 캔버스 구성 요소

더 많은로드가 있지만 익숙해 져야 할 주요 항목입니다. 한 가지 팁은 어디서든 오프라인에서 Unity 매뉴얼 및 스크립팅 참조를 통해 이러한 문서에 대한 모든 문서에 액세스 할 수 있다는 것입니다.

사용자 지정 구성 요소 만들기

내장 된 컴포넌트는 주로 물리와 비주얼을 제어하지만, 실제로 게임을 만들기 위해서는 사용자 입력을 받아들이고 이러한 표준 컴포넌트와 게임 오브젝트 자체를 조작해야합니다.

구성 요소 생성을 시작하려면 원하는 GameObject> 구성 요소 추가> 검색 창에 새 구성 요소 이름 입력> 새 스크립트 (c #)로 이동합니다.

일반적인 권장 사항으로 Unity에서 Javascript를 사용하지 않는 것이 좋습니다. ES6와 함께 제공되는 모든 훌륭한 기능으로 업데이트되지는 않았고, 대부분의 고급 기능은 Javascript로 이식 된 C #에 의존합니다…

MonoBehaviour의 구조

주요 기능

모든 구성 요소는 MonoBehaviour 클래스에서 상속됩니다. 여기에는 가장 중요한 몇 가지 표준 방법이 포함됩니다.

  • void Start () 스크립트를 포함하는 객체가 장면에서 인스턴스화 될 때마다 호출됩니다. 이것은 초기화 코드를 수행하고 싶을 때 유용합니다. 플레이어가 경기에 스폰 된 후 장비를 설정합니다.
  • 모든 프레임에서 호출되는 void Update () . 여기에서 사용자 입력과 관련된 대량의 코드가 이동하여 장면에서 플레이어의 동작과 같은 다양한 속성을 업데이트합니다.

인스펙터 변수

종종 우리는 가능한 한 유연하게 구성 요소를 만들고 싶습니다. 예를 들어 모든 무기는 다른 데미지, 발사 속도, has_sight 등을 가질 수 있습니다. 모든 무기는 본질적으로 동일하지만 유니티 편집기를 통해 다른 변형을 빠르게 만들 수 있기를 원할 수 있습니다.

이 작업을 수행 할 수있는 또 다른 예는 사용자 마우스 이동을 추적하고 뷰포트에 커서를 배치하는 UI 구성 요소를 만드는 것입니다. 여기에서 움직임에 대한 커서의 민감도를 제어 할 수 있습니다 (사용자가 조이스틱 또는 게임 패드와 컴퓨터 마우스를 사용하는 경우). 따라서 이러한 변수를 편집 모드에서 쉽게 변경하고 런타임 중에 실험하는 것이 합리적입니다.

컴포넌트 본문에 공용 변수로 선언하기 만하면 쉽게 수행 할 수 있습니다.

사용자 입력 수락

물론 우리는 게임이 사용자 입력에 응답하기를 원합니다. 이를 수행하는 가장 일반적인 방법은 구성 요소 (또는 원하는 다른 위치)의 Update () 함수에서 다음 메서드를 사용하는 것입니다.

  • Input.GetKey (KeyCode.W) True 반환 W 키를 누르고 있습니다.
  • Input.GetKeyDown (KeyCode.W) W 키를 처음 누르면 True를 반환합니다.
  • Input.GetAxis ( "Vertical"), Input.GetAxis ( "Horizontal") -1,1 마우스 입력 이동 사이를 반환합니다.

조작 게임 오브젝트

사용자 입력이 있으면 씬 내의 게임 오브젝트가 응답하기를 원합니다. 고려할 수있는 몇 가지 유형의 응답이 있습니다.

  • 변환, 회전, 배율
  • 새로운 게임 오브젝트 생성
  • 기존 게임 오브젝트 / 구성 요소에 메시지 보내기

변형

게임 오브젝트는 모두 현재 게임 오브젝트에 대한 다양한 유용한 조작을 수행 할 수있는 변형 속성을 가지고 있습니다.

위의 방법은 우리가 소문자 사용하는 것이 상당히 자기 설명, 단지 참고있는 게임 오브젝트를 구성 요소의 특정 인스턴스를 소유하는 게임 오브젝트를 참조 할 수 있습니다.

일반적으로 오브젝트의 전역 위치 / 회전보다는 local [Position, Rotation] 을 사용하는 것이 좋습니다 . 이렇게하면 일반적으로 로컬 공간 축이 표준 원점 및 x, y, z 방향이 아닌 부모 개체의 방향과 중앙에 위치하므로 이해하기 쉬운 방식으로 개체를 쉽게 이동할 수 있습니다.

로컬 공간과 월드 공간 사이에서 변환해야하는 경우 (종종 그렇습니다) 다음을 사용할 수 있습니다.

상상할 수 있듯이, 메서드 이름에 'Inverse'가 암시하는 매우 간단한 선형 대수가 있습니다.

새로운 게임 오브젝트 생성

게임 오브젝트는 기본적으로 씬의 모든 것이므로 즉시 생성 할 수 있습니다. 예를 들어 플레이어가 일종의 발사체 발사기를 가지고 있다면 비행, 피해를 입히는 자체 논리를 가진 발사체를 즉석에서 생성 할 수 있기를 원할 수 있습니다.

먼저 Prefab 의 개념을 소개해야합니다 . 씬 계층의 게임 오브젝트를 애셋 폴더로 드래그하여 간단히 만들 수 있습니다.

이것은 본질적으로 모든 동일한 구성으로 장면에 방금 보유한 오브젝트의 템플릿을 저장합니다.

이러한 프리 팹 구성 요소가 있으면 장면의 모든 구성 요소에 대한 검사기 변수 (앞서 언급했듯이)에 할당 할 수 있으므로 언제든지 프리 팹에서 지정한대로 새 게임 오브젝트를 만들 수 있습니다.

그런 다음 프리 팹의 '인스턴스화'를 수행하고 장면의 원하는 위치로 조작하고 필요한 부모 관계를 설정할 수 있습니다.

다른 게임 오브젝트 및 구성 요소에 액세스

종종 다른 게임 오브젝트 및 관련 구성 요소와 통신해야합니다. 게임 오브젝트에 대한 참조가 있으면 매우 간단합니다.

ComponentName comp = some_game_object.GetComponent ();

당신이 게임 오브젝트를 조작하기 위해 구성 요소의 공용 메소드 / 변수에 액세스 할 수있는 후. 이것은 간단하지만 실제로 GameObject에 대한 참조를 얻는 것은 여러 가지 방법으로 수행 할 수 있습니다.

검사기 변수를 통해 액세스

이것은 가장 간단합니다. 이전에 프리 팹으로 시연했듯이 GameObject에 대한 공용 변수를 만들고 검사기를 통해 구성 요소에 수동으로 끌어다 놓습니다. 그런 다음 위와 같이 변수에 액세스하십시오.

태깅을 통한 액세스

인스펙터를 통해 게임 오브젝트 또는 프리 팹에 태그를 지정한 다음 게임 오브젝트 찾기 함수를 사용하여 참조를 찾을 수 있습니다.

이것은 다음과 같이 간단히 수행됩니다.

GameObject some_game_object = GameObject.FindGameObjectWithTag ( "Brick");

변환을 통한 액세스

일부 상위 개체의 구성 요소에 액세스하려면 transform 속성을 통해 쉽게 수행 할 수 있습니다.

ComponentName comp = gameObject.transform.parent.GetComponent ();

SendMessage를 통해 액세스

다른 많은 구성 요소에 메시지를 보내거나 중첩 된 계층 구조에서 멀리있는 객체에 메시지를 보내려는 경우 함수 이름 뒤에 인수를받는 메시지 보내기 함수를 사용할 수 있습니다.

gameObject.SendMessage ( "MethodName", params); // 브로드 캐스트 messagegameObject.SendMessageUpwards ( "MethodName", params); // 위에 중첩 된 구성 요소에서만 수신됩니다.

레이 캐스팅

사람들이 '물리 기반'또는 '레이 기반'FPS 게임을 비교할 때 이전에 들어 보셨을 것입니다. 레이 캐스팅은 본질적으로 '충돌기'또는 '강체'와 접촉 할 때 '히트'를 반환하고 물체의 세부 사항을 다시 전달하는 레이저 포인터를 갖는 것과 같습니다.

이것이 유용한 두 가지 시나리오가 있습니다 (아마 더 많은로드가있을 것입니다).

  1. 게임용 무기 시스템을 설계하는 경우 적중 감지를 위해 레이 캐스팅을 사용할 수 있으며, 근접 아이템이 단거리에서만 '적중'되도록 레이의 길이를 사용자 지정할 수도 있습니다.
  2. 마우스 포인터에서 3D 공간의 한 지점으로 광선을 만듭니다. 즉, 사용자가 전략 게임에서 마우스로 유닛을 선택할 수 있도록하려는 경우입니다.

보시다시피이 코드는 조금 더 복잡합니다. 이해해야 할 핵심 사항은 3D 공간에서 마우스가 가리키는 위치에 광선을 투사하려면 ScreenPointToRay 변환이 필요하다는 것입니다. 그 이유는 카메라가 3D 공간을 랩톱 화면에 2D 뷰포트로 렌더링하기 때문에 자연스럽게 3D로 다시 전송하는 데 관련된 투영이 있습니다.

충돌 감지

앞서 오브젝트에 추가 할 수있는 Collider 및 Rigidbody 컴포넌트에 대해 언급했습니다. 충돌 규칙은 충돌의 한 오브젝트에 강체가 있어야하고 다른 오브젝트에는 충돌체가 있어야합니다 (또는 둘 다 구성 요소가 모두 있음). 레이 캐스팅을 사용할 때 광선은 충돌체 구성 요소가 연결된 오브젝트와 만 상호 작용합니다.

개체에 연결된 사용자 지정 구성 요소 내에서 설정되면 OnCollisionEnter, OnCollisionStay 및 OnCollisionExit 메서드를 사용하여 충돌에 응답 할 수 있습니다. 충돌 정보가 확보되면 GameObject를 책임지고 이전에 배운 내용을 사용하여 연결된 구성 요소와도 상호 작용할 수 있습니다.

한 가지 주목할 점은 강체는 오브젝트에 중력과 같은 물리를 제공 하므로이 기능 려면 is_kinematic on 을 확인해야합니다 .

고급 기능

우리는 지금 이것에 대해 다루지 않을 것이지만 아마도 미래의 기사에서-단지 그것들이 존재한다는 것을 당신에게 알리기 위해서입니다.

GUI 생성

Unity에는 게임용 GUI를 레이아웃하기위한 완전한 UI 엔진이 있습니다. 일반적으로 이러한 구성 요소는 나머지 엔진과 매우 유사하게 작동합니다.

Unity 에디터 확장

Unity를 사용하면 인스펙터에 커스텀 버튼을 추가하여 편집 모드 중에 세계에 영향을 미칠 수 있습니다. 예를 들어, 세계 건축을 돕기 위해 모듈 식 주택을 짓기위한 사용자 지정 도구 창을 개발할 수 있습니다.

생기

Unity에는 뼈 기반 애니메이션 시스템을 구현하는 플레이어와 같은 다양한 오브젝트에서 애니메이션을 블렌딩하고 제어 할 수있는 그래프 기반 애니메이션 시스템이 있습니다.

재료 및 PBR

Unity는 실시간 조명과 사실적인 재질을 가능하게하는 물리적 기반 렌더링 엔진에서 실행됩니다. 현실은 실제로보기 좋은 물건을 만들기 위해 먼저 3D 모델링을 배우거나 다른 사람이 만들고 최적화 한 모델을 사용해야합니다.

신규 이민자를위한 조언

첫 게임을 작성할 계획이라면 아무리 사소한 게임이라도 작성하는 데 걸리는 복잡성과 시간을 과소 평가하지 마십시오. Steam에서 나오는 대부분의 게임에는 팀이 수년간 풀 타임으로 작업하고 있음을 기억하십시오!

간단한 개념을 선택하고 달성 가능한 작은 이정표로 분류하십시오. 모 놀리 식 코드 블록이 아닌 구성 요소를 단순하게 유지하면 버그가 발생할 가능성이 훨씬 적으므로 게임을 가능한 한 작은 독립 구성 요소로 분리하는 것이 좋습니다.

게임의 일부에 대한 코드를 작성하기 전에 다른 사람이 이전에 동일한 문제를 해결하기 위해 무엇을했는지 조사해보십시오. 훨씬 더 매끄러운 솔루션을 가질 가능성이 있습니다.

니스 자원과 사회

게임 디자인에는 최고의 커뮤니티 중 하나가 있으며 업계에는 콘텐츠를 무료로 제공하거나 무료로 제공하는 고도로 숙련 된 전문가가 많이 있습니다. 3d 모델러, 컨셉 아티스트, 게임 디자이너, 프로그래머 등이 필요한 분야입니다. 아래의 각 필드에 대해 살펴본 몇 가지 훌륭한 일반 리소스를 연결했습니다.

컨셉 아트

  • Feng Zhu Design School (90 시간 이상의 컨셉 아트 튜토리얼)
  • Tyler Edlin Art (월간 도전에 대한 전문가의 피드백이있는 훌륭한 BST 아트 커뮤니티)
  • 아트 카페 (유명 컨셉 아티스트 인터뷰 및 워크숍)
  • Trent Kaniuga (자신 만의 게임을 만들고있는 일러스트 레이터 겸 2D 아티스트)

3D 모델링

  • CG 쿠키 (블렌더 최고의 메시 모델링 기본, 블렌더를위한 다른 우수한 콘텐츠가 많이 있습니다)
  • Tor Frick (블렌더의 하드 표면 모델러 및 조각가)
  • Gleb Alexandrov (블렌더의 짧고 강력한 렌더링 튜토리얼)

게임 디자인

  • DoubleFine Amnesia Fortnight (2 주 동안 해커 톤을하고 전체 디자인 프로세스를 기록하는 GameDevs)
  • GameMakers Toolkit (게임 디자인 원칙 검토)

프로그램 작성

  • Handmade Hero (C에서 처음부터 게임 및 엔진 작성)
  • Jonathan Blow (게임 개발을 실시간 스트리밍하는 인디 개발자)
  • Brackeys (Nice Unity 튜토리얼)

결론

이 튜토리얼을 좋아 하셨기를 바랍니다! 저는 약간의 그래픽 디자인 작업과 게임 및 UI 프로토 타입 작업을 수행하므로 제 포트폴리오를 확인하십시오 ! 에 나는 또한 해요 에 연결 .

포트폴리오| LinkedIn