Projects/Unity 게임 제작

[2] C# 스크립트 (1)

gapsoo 2023. 6. 28. 21:14

[2].1 스크립트
[2].2 스크립트 작성하기
[2].3 스크립트 첫걸음
[2].4 변수 사용하기

 


[2].1 스크립트

 

>> 스크립트를 쉽게 배우는 비법

  • 유니티에서는 오브젝트가 움직이는 방향을 스크립트로 기술함
  • 스크립트를 다 작성하면 오브젝트에 적용해(끌어다 붙여) 스크립트에 작성된 대로 오브젝트가 움직이도록 만듦
  • 스크립트도 한국어나 영어 같은 '언어'임
  • 언어를 습득하는 왕도가 읽고, 쓰고, 말하기인 것처럼 스크립트도 이 세 가지가 매우 중요함
  • 제대로 배우려면 그만큼 읽고, 쓰고, 말하기를 많이 해야 함

 
 


[2].2 스크립트 작성하기

 

>> 프로젝트 만들기

새 프로젝트를 클릭한다.
 
 

  1. 프로젝트 이름을 sample로 입력한다.
  2. 템플릿을 2D로 선택한다. (3D로 선택해도 무관)
  3. 프로젝트 저장 위치를 지정한다.
  4. 프로젝트 생성을 클릭한다.

 
 

Project 창에서 마우스 오른쪽 버튼을 누르고 Create → C# Script를 선택한다.
 
 

작성된 파일명을 Test로 바꾼다.
 
 

  1. Hierarchy 창에서 Create를 클릭한다.
  2. Create Empty를 선택한다.

 
 

GameObject 가 추가된다.
 
 

  1. TestGameObject로 드래그&드롭한다.
  2. 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"); 끝에는 세미콜론(;)이 붙어 있음
  • 세미콜론은 놓치기 쉬운 기호이지만 컴퓨터에 스크립트 구분을 알려 주는 중요한 역할을 함
  • 세미콜론을 빠트리면 오류가 발생하므로 주의함
  • 세미콜론을 빠트려도 '세미콜론이 없어요!'라는 오류가 발생하지 않음
  • 세미콜론이 빠진 다음 줄에 오류가 발생하므로 이때는 바로 앞줄을 확인해 보자

 
 
 

>> 스크립트 실행

  • 스크립트를 작성했으면 저장한 후 유니티 에디터로 돌아옴

  1. 실행 도구를 클릭한다.
  2. Console 탭을 클릭한다.
  3. 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를 출력하는 프로그램은 한국뿐만 아니라 전 세계적으로 쓰는 프로그램으로 '세계에서 가장 유명한 프로그램'이라고 부름