mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-05-19 16:29:56

유니티(게임 엔진)/도움말/C# 개발


파일:상위 문서 아이콘.svg   상위 문서: 유니티(게임 엔진)/도움말
1. 개요2. C# 기본 개념
2.1. 변수 선언하기2.2. 로그 출력하기2.3. 주석2.4. 반복문
2.4.1. while2.4.2. do while2.4.3. for2.4.4. foreach
2.5. 분기문: switch
3. 스크립트 추가하기4. MonoBehaviour를 게임 오브젝트에 추가하기5. 이벤트
5.1. Start5.2. Update5.3. OnCollisionEnter
5.3.1. 주어지는 인자
5.4. OnCollisionStay
5.4.1. 주어지는 인자
6. 스크립트 내에서 사용할 수 있는 변수
6.1. Time.deltaTime
6.1.1. 응용 방법
6.2. transform
6.2.1. 속성6.2.2. 메서드

1. 개요

Unity C#의 기본에 대해 다룬 문서이다. Unity 공식 문서를 찾아보고 싶다면 이곳을 이용하자.

2. C# 기본 개념

자세한 설명은 C#/문법를 참조.

2.1. 변수 선언하기

#!syntax csharp
[변수 타입] [변수 이름];

또는
[변수 타입] [변수 이름] = [지금 설정할 값];

값을 명시하지 않을 경우 기본값으로 설정된다. (예: 정수형인 경우 0, 문자열의 경우 아무것도 없는 빈 문자열)[1]

예를 들면 이렇다. (정수형 변수 i를 선언하는 경우)[2]
#!syntax csharp
int i;

또는 3으로 설정하고자 한다면
#!syntax csharp
int i = 3;

2.2. 로그 출력하기

#!syntax csharp
Debug.Log([로그 내용]);

2.3. 주석

#!syntax csharp
// 주석 (Comment)

/*
또는 이런
여러줄 주석
*/

2.4. 반복문

2.4.1. while

#!syntax csharp
while ([조건]){
    [실행할 코드]
}

[조건]이 true일 경우 [실행할 코드] 를 실행한다. False가 될 때까지 계속 실행한다.

2.4.2. do while

#!syntax csharp
do {
    [실행할 코드]
} while ([조건])

while과 매우 유사하나 조건이 처음부터 충족하지 않으면 한 번도 실행되지 않는 while과 달리 do while은 적어도 한 번 실행된다.

주의: while 계열 반복문은 Update 루프에 사용할 시 무한 루프에 빠져 프로그램이 멈출 확률이 매우 높다. 가급적 아래 for 계열 반복문을 사용하거나 다른 방법을 찾는 것을 권장한다.

2.4.3. for

#!syntax csharp
for([반복 변수 선언]; [반복 변수에 대한 조건]; [반복 변수 제어 코드]) {
    [실행할 코드]
}


반복 변수를 제어해가며 반복 변수가 조건을 이탈할 때까지 코드를 반복 실행한다.

2.4.4. foreach

#!syntax csharp
foreach([자료형] [변수] in [자료형 배열 또는 리스트]) {
    [변수에 대해 실행할 코드]
}


어떤 리스트 안에 있는 데이터에 대하여 코드를 반복 실행한다.

2.5. 분기문: switch

#!syntax csharp
switch([변수]) {
    case [값1]:
        [코드1]
    case [값2]:
        [코드2]
    default:
        [기본코드]
}

[변수]의 값이 [값1]인 경우에는 [코드1], [값2]인 경우에는 [코드2]가 실행된다. 나열된 경우에 해당되는 것이 없는 경우에는 [기본코드]가 실행된다.[3]

3. 스크립트 추가하기

Unity C# 개발용 스크립트를 추가하는 방법이다. 스크립트 저장용 폴더를 프로젝트 내에 따로 만들어 두는 것을 추천한다.
1. Unity 창 내의 파일 탐색 창에서 스크립트를 저장하고자 하는 폴더로 간다.
2. 우클릭 > Create > C# Script를 누른다.
3. 파일이 하나 생성되며, 이름을 바꿀 수 있도록 이름 바꾸는 칸이 생긴다.
4. 원하는 이름을 적고 Enter를 누른다.

이렇게 추가한 C# 스크립트는 Monobehaviour 클래스를 상속받은 형태로 구성된다. 하지만, 이를 다른 클래스를 상속하도록 만들 수도 있다.

4. MonoBehaviour를 게임 오브젝트에 추가하기

MonoBehaviour가 실행되도록 하려면 이를 게임 오브젝트에 추가해야 한다.
  1. Unity 창 내의 파일 탐색 창에서 해당 스크립트가 있는 곳으로 간다.
  2. 스크립트 파일을 드래그하여 적용하고 싶은 게임 오브젝트에 놓는다.
  3. 이때, 스크립트 파일의 이름은 MonoBehaviour을 상속받은 클래스의 이름과 반드시 같아야 한다.

5. 이벤트

유니티 이벤트는 특정 클래스(Monobehaviour, ScriptableObject 등)를 상속받은 클래스에서 특정한 이름으로 메서드를 선언할 경우, 접근 제어자에 관계없이 특정 타이밍에 호출되는 메서드를 말한다.

단, 이벤트가 포함된 클래스를 자식 클래스에 상속시킬 경우, 자식 클래스에서는 부모 클래스의 이벤트를 자동으로 실행시키지 않는다.

5.1. Start

#!syntax csharp
void Start() {
    // 여기에 코드를 넣으면 시작했을 떄 한 번만 실행된다.
}


Monobehaviour를 상속한 class를 게임 오브젝트에 추가한 상태에서 그 게임 오브젝트가 있는 장면이 시작되었을 때 실행되는 이벤트이다.

5.2. Update

#!syntax csharp
void Update() {
    // 여기에 코드를 넣으면 매 프레임 계속 실행된다.
}


Monobehaviour를 상속한 class를 게임 오브젝트에 추가한 상태에서 그 게임 오브젝트가 있는 장면이 실행되고 있을 때 매 프레임마다 실행되는 이벤트이다.

게임 오브젝트가 disabled 상태일 경우에는 호출되지 않는다.

5.3. OnCollisionEnter

#!syntax csharp
void OnCollisionEnter(Collision collider) {
    // 여기에 처리할 내용을 적으면 된다.
}


다른 물체와 충돌했을 때 발생되는 이벤트이다.[컴포넌트]

5.3.1. 주어지는 인자

Collision collider: 이 스크립트가 장착된 오브젝트와 충돌한 오브젝트의 Collider 컴포넌트이다.

5.4. OnCollisionStay

#!syntax csharp
void OnCollisionStay(Collision collider) {
  // 여기에 처리할 내용을 적으면 된다.
}

다른 물체와 충돌한 채로 있을 때 발생되는 이벤트이다.[컴포넌트]

5.4.1. 주어지는 인자

Collision collider: 이 스크립트가 장착된 오브젝트와 충돌한 오브젝트의 Collider 컴포넌트이다.

6. 스크립트 내에서 사용할 수 있는 변수

6.1. Time.deltaTime

프레임률의 변동을 적용하기 위한 읽기전용 변수로서, 프레임률이 빨라지거나 느려짐으로 인해 속도가 변하는 것을 막을 수 있도록 한다. 해당 변수의 값은 1/fps와 같다. [6][7]

6.1.1. 응용 방법

프레임률 (frame rate, fps) 를 구하는 방법은 다음과 같다.
#!syntax csharp
float fps = 1 / Time.deltaTime;

6.2. transform

Transform transform
이 Monobehaviour가 장착된 오브젝트의 Transform을 가리킨다.

6.2.1. 속성

[공식문서]
이름 설명
int childCount 이 오브젝트가 가지고 있는 자식 오브젝트(Child) 의 수
Vector3 eulerAngles 이 오브젝트의 회전 각도
Vector3 forward 이 오브젝트가 보고 있는 방향으로 1만큼의 벡터
bool hasChange 이 변수가 false로 설정된 이후 변한 여부
int hierachyCapacity Hierachy 구조의 최대 개수
int hierachyCount Hierachy 구조 내에 있는 Transform 개수
Transform parent Hierachy 구조 내에서 나의 부모 Transform
Vector3 position 나의 위치를 나타내는 벡터
Transform root Hierachy 구조 내에서 가장 위에 있는 Transform
Quaternion rotation 회전 각도를 나타내는 Quaternion
Vector3 up, down, forward, back, left, right 상하전우좌우 방향의 크기가 1인 벡터

6.2.2. 메서드

[공식문서]
이름 설명
void DetachChildren () 모든 자식 오브젝트와의 상-하위 관계를 없앤다.
Transform Find (string n) 특정 이름을 지닌 자식을 찾는다
Transform GetChild (int index) index번째 자식을 찾는다
int GetSiblingIndex () 내가 나의 부모의 자식 중 몇 번째인지 찾는다
bool IsChildOf (Transform parent) 부모가 있는가?
void Rotate (Vector3 eulers) 주어진 벡터만큼 오브젝트를 돌린다

[1] float 타입의 경우 뒤에 f, long 타입의 경우 뒤에 L을 붙여야 한다. 예를 들면 10.48f [2] 변수 타입은 정수형 변수는 int, 정수가 아닌 숫자형 변수는 float, 문자형 변수는 string, 참/거짓 변수는 bool이다. [3] 가장 아래에 있는 case를 제외하고는 break를 넣어주지 않으면 충족한 경우의 아래 경우들까지 모두 실행되니 주의. [컴포넌트] 단, 두 물체 모두 Collider 컴포넌트가 있어야 하고 둘 중 하나는 Rigidbody 컴포넌트가 있어야 한다. [컴포넌트] [6] fps는 프레임률을 의미한다. [7] 60fps의 경우 약 0.016666666666667. [공식문서] 잘못된 번역이 기재되어 있거나 일부 정보가 없을 수도 있으니 정확한 정보를 얻으려면 이곳을 이용하자. [공식문서]