Unity 검색

초보자를 위한 Unity에서의 C# 코딩 방법

첫 게임을 만들기 위해 Unity에서 코딩하는 방법을 배워보고 싶지만 어디서부터 시작해야 할지 막막하신가요? Unity는 이처럼 어려움을 느끼는 분들을 이해합니다. 다음은 Unity의 스크립팅 요소에 대한 자세한 설명 및"스페이스 슈터(Space Shooter)"와 같은 고급 프로젝트를 완성하는 데 사용할 수 있는 몇 가지 학습 자료입니다. 이러한 정보를 통해 변수, 기능, 클래스와 이러한 요소를 활용하는 방법 등 코딩의 기초를 이해할 수 있습니다.

경험이 많은 프로그래머지만 Unity는 처음인 경우여기를 참조하세요.

Unity에서 스크립팅이란 무엇인가요?

스크립팅은 GameObject(게임 오브젝트)의 동작을 정의하는 것으로, GameObject에 첨부된 스크립트와 구성 요소이자 이러한 스크립트와 구성 요소가 상호 작용하여 게임플레이를 도출하는 방식입니다. Unity의 스크립팅은 순수한 프로그래밍과는 다릅니다. 순수한 프로그래밍 경험(예: 실제로 실행되는 앱 제작)이 있는 분들은 Unity가 애플리케이션을 실행하는 코드를 대신 생성해주므로 코드를 직접 만들 필요가 없으며, 스크립트의 게임플레이에 집중하면 된다는 사실을 기억해주세요.

Unity는 거대한 루프처럼 작동합니다. Unity는 게임 씬의 모든 데이터, 즉 조명, 메시, 행동이 있는 곳 등을 읽은 다음 모든 정보를 처리합니다.

예를 들어 TV의 경우 북미 기준으로 프레임 속도가 초당 29.5프레임이므로, Unity의 속도도 동일해야 합니다. Unity는 개별적인 단일 프레임을 연속적으로 실행합니다. 사용자가 스크립트에 작성한 명령을 통해 Unity에 지시를 내리면 Unity는 프레임마다 이를 최대의 속도로 실행합니다.

프레임 속도가 높으면 게임이 더욱 매끄럽게 작동할 뿐만 아니라, 스크립트도 더욱 자주 실행되어 조작감이 개선됩니다.

Unity에서 사용할 수 있는 언어로는 어떤 것들이 있나요?

Unity로 스크립트를 호출하려면 씬의 GameObject에 첨부해야 합니다. 스크립트는 Unity가 이해할 수 있는 특수한 언어로 작성되며, 사용자는 이 언어를 통해 엔진에 명령을 내릴 수 있습니다.

Unity에서 사용되는 언어는 C#(‘C 샵’으로 읽음)입니다. Unity의 작동을 가능하게 하는 모든 언어는 오브젝트 중심의 스크립트 언어입니다. 모든 언어와 마찬가지로 스크립팅 언어에도 구문(품사에 해당)이 있으며, 기본적인 요소는 변수, 함수 및 클래스입니다.

Unity 2017.3 이하 버전에는 MonoDevelop이라는 텍스트 에디터가 있습니다. MonoDevelop은 코드 완성을 지원하고, 코드 작성이 잘못되면 알려주며, 단축키를 사용할 수 있게 해줍니다. 2018.1 버전부터는Unity 커뮤니티용 Visual Studio 또는 Visual Studio, Notepad, Sublime text 등 기타 텍스트 에디터도 사용할 수 있습니다.

다음은 샘플 코드가 포함된 스크립트입니다(참고: 입문자를 위한 Unity 코딩 튜토리얼)):

sample code unity

보시다시피 변수, 함수 및 클래스가 포함됩니다.

이러한 요소의 기능은 무엇인가요?

변수는 오브젝트의 값과 참조를 포함합니다. 오브젝트는 “더 큰” 변수에 해당합니다. 변수는 우리가 사용할 수 있는 요소를 포함한 상자와도 같으며, 소문자로 시작합니다.

함수는 이러한 변수를 비교하고 조종하는 코드 컬렉션입니다. 함수는 대문자로 시작합니다. Unity는 프로그램의 다른 부분에서 함수를 반복적으로 재사용될 수 있도록 함수에 코드를 포함시킵니다.

클래스는 코드 구조화를 통해 변수와 기능의 컬렉션을 함께 래핑하여 오브젝트의 속성을 정의하는 템플릿을 만드는 방법입니다.

스크립팅은 기본적으로 이러한 오브젝트와 오브젝트의 현 상태 및 값을 비교하는 것으로, 결과나 해결책을 논리적으로 결정하는 데 기반합니다.

변수

Unity에서 스크립트는 대부분의 경우 변수를 선언하여 필요한 툴을 상단에 정렬하는 것으로 시작합니다. 선언된 변수(여기)는 가시성 키워드 “public”이나 "private"으로 시작하며, 유형과 이름이 이어집니다.

variables in unity

변수를 선언할 때 사용하는 가시성 유형은 몇 가지가 있지만, 가장 중요한 두 가지는 공개(public)와 비공개(private)입니다.

코드 에디터에서 위의 텍스트를 포함한 스크립트를 생성한 다음 Unity로 돌아와 스크립트를 GameObject에 할당하면 인스펙터에서 공개로 설정된 조명 변수에 액세스하고 확인할 수 있지만, 비공개로 설정된 조명 변수는 보거나 액세스할 수 없음을 확인할 수 있습니다. “비공개”로 설정한 변수의 경우 해당 클래스 및 스크립트 내에서만 액세스할 수 있기 때문입니다.

이 변수를 공개로 설정하면 다른 스크립트와 클래스에서 액세스 가능하며, Unity 에디터의 인스펙터에서도 변경할 수 있으므로 다른 사람들도 액세스하고 값을 변경할 수 있게 됩니다.

변수비공개 또는 공개로 설정하는 이유는 각각 몇 가지가 있습니다. 비공개를 선택하면 변수값을 해당 클래스 내에서만 변경할 수 있게 되므로 코드가 더욱 깨끗해지므로, 코드 디버깅과 유지 관리도 쉬워집니다.

“공개”를 선택하는 경우 다른 오브젝트에서도 해당 변수에 액세스할 수 있으므로 문제가 발생하면 코드베이스 전체를 살펴보면서 출처를 찾아야 합니다. 하지만 오브젝트가 상호 통신하기를 원하는 경우 일부 변수나 기능을 공개로 설정해야 합니다.

변수에서 중요한 또 다른 한 가지는 유형입니다. 유형은 변수가 메모리에 포함하는 값의 종류를 정의합니다. 예를 들어 이러한 값은 숫자, 텍스트 또는 아래 이미지와 같이 더 복잡한 유형일 수 있습니다. 아래 이미지의 Transform, Light 및 Demo 스크립트는 구성 요소의 참조입니다. Unity는 이러한 구성 요소를 처리하기 위해 해당 구성 요소의 오브젝트 유형을 알아야 합니다.

variables in unity inspector

변수에서 또 다른 중요한 한 가지는 이름입니다. 변수의 이름은 숫자로 시작하거나 공백을 포함할 수 없으며, 따라서 이름을 작성하는 규식이 정해져 있습니다. C#의 경우 명명 규칙은 소문자로 시작하여 공백 없이 대문자로 시작하는 단어를 덧붙이는 '낙타 표기법(camelCase)'입니다. 예를 들자면 "myLight"와 같은 형식입니다.

Unity는 스크립트를 컴파일링할 때 에디터에 공개 변수를 표시합니다. 아래의 인스펙터 이미지를 참조하세요.

demo script unity inspector

기능

스크립트는 기능을 사용하여 변수를 조종합니다. Unity에는 아래와 같이 자동으로 실행되는 기능이 여러 개 있습니다.

functions in unity

Awake는 해당 구성 요소가 포함된 GameObject가 인스턴스화될 때 한 번만 호출되며, GameObject가 비활성화 상태인 경우 활성화될 때까지 호출되지 않습니다. 단, Awake는 GameObject가 활성화되었지만 구성 요소는 활성화(구성 요소 옆의 작은 체크박스 사용)되지 않은 상태에서도 호출됩니다. Awake를 사용하여 값을 할당해야 하는 모든 변수를 초기화할 수 있습니다.

Start: Awake와 마찬가지로 GameObject가 활성화되면 호출되지만, 이 기능의 경우 구성 요소도 활성화되어야 호출됩니다. Awake와 Start의 차이점에 관한 자세한 내용은 이비디오를 참조하세요..

Update는 프레임당 한 번 호출됩니다. 이때 코드를 사용하여 지속적으로 업데이트되어야 하는 애니메이션, AI 및 게임의 기타 부분처럼 지속적으로 실행되는 논리를 정의할 수 있습니다.

FixedUpdate는 물리를 작동하는 함수입니다.

보시다시피 스크립트 튜토리얼 섹션 중 ‘정기 업데이트’와 ‘업데이트’ 섹션에서Update 및 FixedUpdate 함수를 사용하여 모든 프레임에 변경 사항을 적용하는 방법 및 이 두 함수의 차이점을 알아볼 수 있습니다..

LateUpdate는 Update와 비슷하되 프레임 끝에 호출되는 함수입니다. Unity는 모든 게임 오브젝트를 살펴보면서 모든 업데이트를 찾고 LateUpdate를 호출합니다. 이 함수는 카메라에 유용합니다. 예를 들어 게임 캐릭터를 이동시키려고 하는데 다른 캐릭터에 부딪혀 의도하지 않은 포지션으로 움직이는 경우, 카메라를 캐릭터와 동시에 움직이면 흔들림이 발생하고 카메라가 원래 있어야 할 자리로 이동하지 않게 됩니다. LateUpdate는 이러한 경우 유용한 별도의 루프로 작용합니다.

작성 기능

함수를 작성할 때에는 함수의 맨 앞부분에 반환된 함수 유형을 배치하고, 뒤이어 함수의 이름과 괄호 안의 매개변수(있는 경우) 순으로 작성해야 합니다. 함수 이름은 대문자로 시작하며, 함수의 본문은 중괄호 안에 배치해야 합니다. 다음은 함수 작성의 예입니다.

writing functions unity

이 함수는 어떻게 호출하나요?

function-in-unity

함수는 계산을 수행하고 값을 반환할 수 있습니다. 함수에 작업을 수행하고, 정보를 처리하고 답을 반환하도록 요청할 수 있습니다. 단, 함수에 "void" 타입을 사용하면 아무것도 반환하지 않습니다.

클래스

클래스는 이러한 변수와 함수의 컬렉션입니다. 예를 들어, 다음의 스크립트는 클래스입니다.

class example in Unity

클래스 이름이 C# 스크립트의 파일 이름과 일치해야 클래스가 작동합니다. 또한 최초로 스크립트를 생성할 때 자동으로 함께 생성되는 MonoBehaviour 클래스에서 파생된 클래스만 GameObject에 첨부할 수 있습니다. 클래스는 공개 또는 비공개로 설정할 수 있습니다.

Unity에서 아래의 예와 같은 맞춤 클래스를 만드는 경우클래스를 직렬화하도록, 즉Unity가 인스펙터에서 살펴볼 수 있는 단순한 데이터로 전환되도록 요청해야 합니다.

classes in unity example

변수, 함수 및 클래스는 Unity에서 코딩을 하기 위한 기본적인 요소일 뿐입니다.교육 자료에서 여러 유용한 스크립팅 튜토리얼을살펴보면프로그래밍의 기초부터 프로젝트를 위한 상세한 코드를 만드는 방법까지 다양한 정보를 얻을 수 있습니다.