[2].1 스크립트 [2].2 스크립트 작성하기 [2].3 스크립트 첫걸음 [2].4 변수 사용하기 |
[2].1 스크립트
>> 스크립트를 쉽게 배우는 비법
- 유니티에서는 오브젝트가 움직이는 방향을 스크립트로 기술함
- 스크립트를 다 작성하면 오브젝트에 적용해(끌어다 붙여) 스크립트에 작성된 대로 오브젝트가 움직이도록 만듦
- 스크립트도 한국어나 영어 같은 '언어'임
- 언어를 습득하는 왕도가 읽고, 쓰고, 말하기인 것처럼 스크립트도 이 세 가지가 매우 중요함
- 제대로 배우려면 그만큼 읽고, 쓰고, 말하기를 많이 해야 함
[2].2 스크립트 작성하기
>> 프로젝트 만들기
새 프로젝트를 클릭한다.
- 프로젝트 이름을 sample로 입력한다.
- 템플릿을 2D로 선택한다. (3D로 선택해도 무관)
- 프로젝트 저장 위치를 지정한다.
- 프로젝트 생성을 클릭한다.
Project 창에서 마우스 오른쪽 버튼을 누르고 Create → C# Script를 선택한다.
작성된 파일명을 Test로 바꾼다.
- Hierarchy 창에서 Create를 클릭한다.
- Create Empty를 선택한다.
GameObject 가 추가된다.
- Test를 GameObject로 드래그&드롭한다.
- GameObject에 Test가 적용되었다.
-------
- 스크립트에 작성한 움직임을 오브젝트에 적용하려면 게임 오브젝트로 '연결해야' 함
- 게임 오브젝트에 움직이는 스크립트를 적용해야 오브젝트가 제대로 동작함
[2].3 스크립트 첫걸음
>> 스크립트
Test를 더블 클릭한다.
Visual Studio가 실행된다.
- Test 스크립트 파일을 열면 다음 코드가 기본으로 담겨 있음
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
- 1~2번 줄의 System.Collections와 System.Collections.Generic은 데이터를 저장하는 형을 제공함
- 3번 줄의 UnityEngine은 유니티가 동작하는 데 필요한 기능을 제공함
- 5번 줄에서는 클래스 이름을 정함
- C#으로 작성한 프로그램은 클래스 단위로 관리됨
- 여기서는 클래스 이름 = 스크립트 이름이라는 것을 기억해 둠
- 6번 줄에 있는 중괄호({)와 18번 줄에 있는 닫는 중괄호(}) 사이에는 스크립트를 실행했을 때 처리되는 내용을 씀
- 중괄호로 감싼 부분을 블록이라고 함
- 중괄호는 반드시 여는 중괄호와 닫는 중괄호가 쌍으로 사용되어야 함
- 여는 괄호 ((또는 {)를 쓰고 닫는 괄호()또는 })를 빠트리면 오류가 발생하므로 주의함
- 여는 중괄호({)의 위치는 다음과 같이 현재 줄에 이어서 쓸 수도 있음
- 7번 줄과 13번 줄에 보이는 슬래시 두 개(//)로 시작하는 줄은 주석이라고 함
- 슬래시 두 개 뒤에 작성한 문장은 스크립트를 실행할 때 무시됨
- 주석은 메모를 남기거나 작성한 스크립트를 실행하고 싶지 않을 때 쓰면 편리함
- 슬래시 두 개는 줄 중간에도 넣을 수 있는데, 이때는 슬래시 두 개 뒤에 쓴 부분만 무시됨
- 8번 줄에 적힌 Start와 14번 줄에 적힌 Update는 각각 Start 메서드와 Update 메서드라고 함
- 지금은 아무것도 작성하지 않았지만 다음과 같이 블록 안에 처리할 스크립트 코드를 작성할 수 있음
- 스크립트 실행 (아래 사진 참고)
>> 프레임과 실행 시점
- 게임 화면은 영화나 애니메이션과 마찬가지로 그림 한 컷을 플립북 방식으로 표시함
- 이 그림 한 컷을 프레임이라고 함
- 1초에 표시되는 매수는 FPS(Frame Per Second) 단위로 셈
- 대개 영화는 1초에 24 프레임(24 FPS), 게임은 1초에 60 프레임(60 FPS) 속도로 그림을 전환해 애니메이션함
- 단, 1초 동안 60프레임으로 설정해도 사용자가 입력한 표시 내용이 바뀌거나 시스템 부하 등이 달라지면, 프레임 간의 시간이 1/60초보다 빠르거나 느릴 수 있음
- 실제로 앞의 프레임부터 몇 초가 지났는지는 Time.deltaTime 구조로 알 수 있음
- 앞의 그림에서 Start와 Update에 말풍선이 붙어 있는 것을 주목함
- 스크립트를 실행시키면 Start 메서드는 한 번만 실행되지만 Update 메서드는 프레임마다 반복해서 실행됨
- Update 메서드는 캐릭터 표시뿐만 아니라 충돌 판정이나 키 조작 등의 처리를 프레임마다 해야 함
>> Hello, World 출력하기
- 유니티 에디터의 Console 창3에 Hello, World를 출력하는 스크립트 코드를 작성해 보자
- Start메서드의 중괄호({) 안에 다음과 같이 입력함.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
//Hello, World를 Console 창에 출력한다.
Debug.Log("Hello, World");
}
}
- Start 메서드 안에 있는 9번과 10번 줄에 내용을 추가함
- 실제로는 9번 줄도 추가했지만 이 부분은 주석이므로 실행할 때 무시됨
- 10번 줄처럼 Debug.Log()라고 입력하면 소괄호(()) 안에 쓴 문자열을 Console 창에 출력함
- 스크립트에 문자열을 쓰려면 문자열의 앞뒤를 큰따옴표(")로 묶음
- 큰따옴표로 묶지 않고 Debug.Log(Hello, World); 을 쓰면 오류가 발생함
- 스크립트에서는 1234 같은 숫자도 "1234"처럼 큰따옴표르 묶으면 문자열로 취급함
>> 세미콜론
- Debug.Log("Hello, World"); 끝에는 세미콜론(;)이 붙어 있음
- 세미콜론은 놓치기 쉬운 기호이지만 컴퓨터에 스크립트 구분을 알려 주는 중요한 역할을 함
- 세미콜론을 빠트리면 오류가 발생하므로 주의함
- 세미콜론을 빠트려도 '세미콜론이 없어요!'라는 오류가 발생하지 않음
- 세미콜론이 빠진 다음 줄에 오류가 발생하므로 이때는 바로 앞줄을 확인해 보자
>> 스크립트 실행
- 스크립트를 작성했으면 저장한 후 유니티 에디터로 돌아옴
- 실행 도구를 클릭한다.
- Console 탭을 클릭한다.
- Hello, World 가 출력된다.
- 게임을 실행하면 Hierarchy 창에 등록된 게임 오브젝트가 활성화되고 게임 오브젝트에 적용한 스크립트가 실행됨
- 스크립트가 실행되면 클래스에 있는 Start 메서드는 처음 한 번만 처리됨
- 그 후 게임이 종료될 때까지 프레임마다 Update 메서드가 반복해서 처리함
>> 씬 저장
- 여기까지 작업한 내용을 저장해야 하므로 씬을 만듦
- 도구 바에서 File → Save As 를 선택하고 씬 이름을 SampleScene으로 입력한 후 Save를 클릭함
- 저장하면 유니티 에디터의 Project 창에 씬 아이콘이 나타남
[2].4 변수 사용하기
>> 변수 선언하기
- 스크립트에서는 변수를 사용해 숫자나 문자열을 다룸
- 변수는 데이터를 감싸고 있는 상자와 같음
- 상자를 만들려면 상자에 어떤 종류의 데이터를 넣을지, 상자 이름으로 무엇을 쓸지 선언해야 함
- 상자 종류의 이름은 '데이터 형 이름'이라고 부르는데 데이터 형에는 정수, 소수, 문자열, 불 값 등이 있음
- 상자 이름은 '변수명'이라고 하는데 변수명은 스크립트에서 중복되지 않는 유일한 이름을 (스스로) 정해서 사용함
- Start 메서드의 내용을 지운 후 다음과 같이 작성하고 실행함
- Update 메서드 역시 잠시 사용하지 않으므로 지움
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int age;
age = 30;
Debug.Log(age);
}
}
\ 출력 결과 /
30
- 9번 줄에서는 int age; 으로 변수를 선언함
- int는 데이터 형 이름이고 age는 상자 이름인 변수명임
- 즉, int형(정수형)의 age라는 이름을 가진 상자를 사용한다! 는 선언임
변수 선언 방법 |
데이터 형 이름 변수명; |
- 10번 줄에서는 age에 값 30을 넣는다. 상자에 값을 넣는 것을 대입이라고 함
- 대입할 때는 값을 넣는 변수를 왼쪽, 넣고 싶은 값을 오른쪽에 두고 가운데를 =로 이음
- =은 대입 연산자라고 함
- 수학에서 쓰는 왼쪽과 오른쪽 값이 같다는 뜻인 등호(=)와 모양은 같지만 의미가 다르므로 주의해야 함
변수에 값을 대입하는 방법 |
변수명 = 대입할 값; |
- 11번 줄에서는 Debug.Log를 써서 상자 내용을 Console창에 출력함
- Debug.Log의 괄호 안에 변수명을 넣으면 번수 값(상자 안에 들어 있는 값)을 출력할 수 있음
>> 변수 초기화와 대입
- Start 메서드의 내용을 다시 작성하고 실행함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
float height1 = 160.5f;
float height2;
height2 = height1;
Debug.Log(height2);
}
}
\ 출력결과 /
160.5
- 9번 줄에서는 변수 선언과 값 대입을 한꺼번에 함
- 이것을 변수의 초기화라고 함
- 여기서는 float형(부동소수점형)의 height1 변수를 160.5f 값으로 초기화함
변수 초기화 방법 |
데이터 형 이름 변수명 = 대입할 값; |
- 대입할 소수 뒤에 f를 붙이면 이 소수는 부동소수점형(float형)으로 취급됨
- f를 붙이지 않으면 배정도소수점형(double형)으로 취급됨
- 9번 줄에서 f를 떼면 float 형 변수가 double형 값으로 대입된다고 해석되어 '변수형과 대입하는 값의 데이터 형이 달라!'라는 오류가 발생함
- float형에 소수를 대입할 때는 반드시 값 뒤에 f를 붙여야 함
- 10번 줄에서는 데이터 형이 float고 이름이 height2인 변수를 선언함
- 11번 줄에서는 height2에 height1 값을 대입함
- 이처럼 데이터 형이 같은 변수끼리는 값을 대입할 수 있음
- 대입은 값을 복사함
- 데이터를 바꾸는 것은 아니므로 height1에 담긴 값은 비어 있지 않고 그대로 남아 있음
변수에 변수를 대입하는 방법 |
변수명 = 대입할 변수명; |
>> float형에 double형을 대입하면?
- double형은 float형보다 값을 표현할 수 있는 범위가 넓음
- float형에 double형을 대입하면 float형에 들어가지 않는 범위는 버려짐
- 모르고 넘어가면 값이 달라져 문제가 될 수 있고, 이러한 문제는 원인을 찾기 어려워 애먹을 수 있음
- 이러한 이유로 C#에서는 float형에 double형 값을 대입하는 것을 금지함
>> 변수에 문자열 대입
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
string name;
name = "Sera";
Debug.Log(name);
}
}
\ 출력 결과 /
Sera
- 숫자와 마찬가지로 문자열도 변수에 대입할 수 있음
- 문자열을 다루는 데이터 형은 string형임
- 스크립트에서 문자열을 표시할 때는 문자열을 큰따옴표(")로 감싸야함
- 9~11번 줄에서는 데이터 형이 string형인 name변수에 문자열 Sera를 대입하고, 변수 값을 Console창에 출력함
변수에 문자열을 대입하는 방법 |
변수명 = 대입할 문자열; |
- 데이터 형이 int형인 변수에 1234를 대입했을 때와 출력 결과는 같아 보이지만 string형에 대입된 것은 어디까지나 '문자열'이므로 계산하는 데는 쓸 수 없음
- 큰따옴표로 감싸진 것은 무엇이 되었건 문자열임
- 참고로 string형 변수에 int형 값을 대입하면 컴파일 오류가 발생함
>> 변수와 연산
- 스크립트에서 사칙연산을 할 때 덧셈은 +(플러스), 뺄셈은 -(마이너스), 곱셈은 *(애스터리스크), 나눗셈은 /(슬래시) 기호를 사용함
- Start 메서드의 내용을 지우고 다음과 같이 작성함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int answer;
answer = 1 + 2;
Debug.Log(answer);
}
}
\ 출력 결과 /
3
- 9번 줄에서 데이터 형이 int형인 answer변수를 선언함
- 10번 줄에서 1 + 2를 계산한 후 결괏값인 3을 answer변수에 대입함
변수에 계산 결과를 대입하는 방법 |
변수명 = 숫자 + 숫자; |
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int answer;
answer = 3 - 4;
Debug.Log(answer);
answer = 5 + 6;
Debug.Log(answer);
answer = 8 / 4;
Debug.Log(answer);
}
}
\ 출력 결과 /
-1
30
2
>> 변수와 변수의 연산
- 숫자와 숫자의 연산뿐만 아니라 변수와 변수도 연산할 수 있음
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int n1 = 8;
int n2 = 9;
int answer;
answer = n1 + n2;
Debug.Log(answer);
}
}
\ 출력 결과 /
17
- 9번 줄에서 n1변수를 8로 초기화하고, 10번 줄에서 n2변수를 9로 초기화함
- 12번 줄에서 n1과 n2의 값을 더해 answer 변수에 대입함
- 2나 3 같은 숫자뿐만 아니라 변수에 값을 대입한 후 변수를 사칙연산에 이용할 수도 있음
>> 편리한 쓰기 방법 ①: +=, -=, *=, /=
- 상자 안에 든 값에 5를 더하고 싶거나 변수 값을 일정하게 늘리고 싶을 때가 있음
- 이때는 다음과 같이 변수 값에 5를 더할 수 있음
- 예를 들어 answer 변수 값이 10이라고 하면, 10+5를 계산한 결과가 다시 answer에 대입됨
- 단, 변수 값을 늘릴 때마다 이렇게 쓰면 조금 복잡해짐
- 이때는 간단하게 += 연산자를 사용함
- '변수명 += 증가 하고 싶은 값'으로 쓰면 변수 값을 원하는 수만큼 증가시킬 수 있음
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int answer = 10;
answer += 5;
Debug.Log(answer);
}
}
\ 출력 결과 /
15
- 9번 줄에서 answer 변수를 10으로 초기화함
- 10번 줄에서 += 연산자를 사용해 answer 값에 5를 더함
- answer 변수 값은 15가 되고, Console 창에도 15가 출력됨
- 더하기 연산자 말고도 뺄셈, 곱셈, 나눗셈 같은 연산자를 사용할 수 있음
- 각각 -=, *=, /= 을 씀
>> 편리한 쓰기 방법 ②: ++, --
- 변수 값을 1만큼 늘리고 싶을 수도 있음
- C#에는 변수 값을 1만큼 늘릴 때 쓰는 증가 연산자가 있음
- 증가 연산자는 변수명 ++ 로 씀
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int answer = 10;
answer ++;
Debug.Log(answer);
}
}
\ 출력 결과 /
11
- 9번 줄에서 answer 변수를 10으로 초기화함
- 10번 줄에서 증가 연산자를 사용해 answer 변수 값을 1만큼 증가시킴
- answer 값은 11이 됨
- 증가 연산자와 반대로 변수 값을 1만큼 줄이는 감소 연산자도 있음
- 감소 연산자는 변수명 --로 씀
- 변수 값을 1씩 늘리려면 += 연산자를 사용해 answer += 1로 쓸 수도 있고, + 연산자를 사용해 answer = answer + 1로 쓸 수도 있음
- 변수 값을 1씩 늘리거나 줄이는 연산은 제어문 등에서 자주 쓰는 연산으로 ++연산자(증가 연산자)와 --연산자(감소 연산자)라는 연산자가 별도로 있으니 편하게 쓸 수 있음
>> 문자열과 문자열의 연결
- 문자열은 숫자처럼 연산을 할 수는 없지만 +연산자나 +=연산자를 사용해 문자열을 연결할 수 있음
- 문자열과 숫자를 연결하면 숫자는 문자열로 취급됨
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
string str = "happy ";
int num = 123;
string message = str + num;
Debug.Log(message);
}
}
\ 출력 결과 /
happy 123
- 9번 줄에서 초기화한 string형의 str변수와 10번 줄에서 초기화한 int형의 num변수를 12번 줄에서 연결한 후 message 변수에 대입함
- 문자열과 숫자를 연결하면 num 변수를 문자열로 취급하므로 message 변수 값은 happy 123으로 출력됨
>> Hello, World 란?
- 프로그래밍 언어 입문서를 보면 첫 예제로 Hello, World를 출력하는 프로그램을 많이 씀
- Hello, World를 출력하는 프로그램은 한국뿐만 아니라 전 세계적으로 쓰는 프로그램으로 '세계에서 가장 유명한 프로그램'이라고 부름
'Projects > Unity 게임 제작' 카테고리의 다른 글
[4] C# 스크립트 (3) (6) | 2023.06.30 |
---|---|
[3] C# 스크립트 (2) (6) | 2023.06.29 |
[1] 유니티 설치 & 조작법 - (3) 오브젝트 다루기 (6) | 2023.06.27 |
[1] 유니티 설치 & 조작법 - (2) 유니티 화면 구성 (2) | 2023.06.27 |
[1] 유니티 설치 & 조작법 - (1) 유니티 설치하기 (2) | 2023.06.26 |