카테고리 없음

[Unity] C# 스크립트 기초

jaeheon0520 2024. 2. 20. 23:40

 

 

INTRO

스크립트는 게임에서 오브젝트를 움직이게 하는 대본이다. 영화나 연극에서 배우가 움직이는 방향을 대본에 적는 것처럼 유니티에서는 오브젝트가 움직이는 방향을 스크립트로 기술한다. 스크립트를 다 작성하면 오브젝트에 적용해(끌어다 붙여) 스크립트에 작성된 대로 오브젝트가 움직이도록 만든다.

 

스크립트 작성하기

Project 창에서 Test 스크립트 파일을 만들고 더블클릭하면 vscode가 실행된다. 

 

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.Collenctions와 System.Collections.Generic은 데이터를 저장하는 형을 제공한다. 3번 줄의 UnityEngine은 유니티가 동작하는데 필요한 기능을 제공한다. 

 

5번 줄에서는 클래스명을 정한다. C#으로 작성한 프로그램은 클래스 단위로 관리된다. 여기서 클래스명 = 스크립트명이라는 것을 기억해 두자.

 

6번 줄에 있는 여는 중괄호({)와 18번 줄에 있는 닫는 중괄호(}) 사이에는 스크립트를 실행했을 때 처리되는 내용을 쓴다. 중괄호로 감산 부분을 블록이라고 한다.

 

7번 줄과 13번 줄에 보이는 슬래시 두 개(//)로 시작하는 줄은 주석이라고 한다. 슬래시 두 개 뒤에 작성한 문장은 스크립트를 실행할 때 무시된다. 주석은 메모를 남기거나 작성한 스크립트를 실행하고 싶지 않을 때 쓰면 편리하다. 슬래시 두 개는 중간에 넣을 수 있는데, 이때는 슬래시 두 개 뒤에 쓴 부분만 무시된다.

 

8번 줄에 적힌 Start와 14버 줄에 적힌 Update는 각각 Start 메서드와 Update 메서드라고 한다. 지금은 아무것도 작성하지 않았지만 다음과 같이 블록 안에 처리할 스크립트 코드를 작성할 수 있다.

 

void Start() {
    *여기에 처리할 스크립트 코드를 작성
}

 

스크립트를 실행하면 Start와 Update 블록 안에 작성한 스크립트 코드가 실행된다. 정도로만 기억해 두자. 

 

프레임과 실행 시점

게임 화면은 영화나 애니메이션과 마찬가지로 그림 한 컷을 플립북 방식으로 표현한다. 이 그림 한 컷을 프레임이라고 하며, 1초에 표시되는 매수는 FPS(Frame Per Second) 단위로 센다. 대개 영화는 1초에 24프레임(24FPS), 게임은 1초에 60프레임(60FPS) 속도로 그림을 전환해 애니메이션을 보여준다.

 

단 1초 동안 60프레임으로 설정해도 사용자가 입력한 표시 내용이 바뀌거나 시스템 부하 등이 달라지면 프레임 간 시간이1/60초보다 빠르거나 느릴 수 있다. 실제로 앞의 프로임부터 몇 초 지났지는지는 Time.deltaTime 구조로 알 수 있다. 프로게임과 Time.deltaTime이 무엇인지 간단히 살펴보자.

 

 

앞의 그림에서 Start와 Update에 말풍선이 붙어 있는 것을 주목하자. 스크립트를 실행시키면 Start 메서드는 한 번만 실행되지만 Update 메서드는 프레임마다 반복해서 실행된다. 예를 들어 캐릭터가 오른쪽으로 걸어가는 애니메이션을 만든다면 처음에는 Start 메서드로 캐릭터를 표시하고, 그다음에는 Update 메서드로 프레임마다 캐릭터를 조금씩 오른쪽으로 옮기는 처리를 할 수 있다.

 

void Start()
{
	*캐릭터를 표시하는 처리
}

void Update()
{
	*현재 캐릭터를 조금씩 오른쪽으로 옮기는 처리
}

 

또 Update 메서드는 캐릭터 표시뿐만 아니라 충돌 판정이나 키 조작 등의 처리를 프레임마다 해야 한다.

 

Hello, World 출력하기

실제로 처리하는 스크립트를 직접 작성해 보자.

 

유니티 에디터의 Console 창에 Hello, World를 출력하는 스크립트 코드를 작성해보자. 

Start 메소드의 중괄호안에 다음과 같이 입력한다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //Hello, World를 Console 창에 출력한다.
        Debug.Log("Hello, World");
    }
}

 

'문자열'이라는 단어가 처음 나왔다. 문자열은 문자 여러 개를 늘어놓은 것이다. 스크립트에 문자열을 쓰려면 문자열 앞뒤를 큰따옴표로 묶는다. 큰따옴표로 묶지 않고 Debug.Lod(Hello, World);을 쓰면 오류가 발생한다. 스크립트에서는 1234 같은 숫자도 "1234"처럼 큰따옴표로 묶으면 문자열로 취급한다. 

 

스크립트 실행

스크립트를 작성했으면 저장한 후 유니티 에디터로 돌아온다. Scene 뷰 위에 있는 실행 도구를 클릭한 후 Hierarchy 창 아래에 있는 Console 탭을 선택한다. Project 창이 Console 창으로 전환된다. 실행 도구를 한 번 더 클릭해서 게임을 정지한다. Console 창을 보면 Hello, World가 제대로 출력 된 것을 확인할 수 있다.

 

 

게임을 실행하면 Hierarchy 창에 등록된 게임 오브젝트가 활성화 되고 게임 오브젝트에 적용한 스크립트가 실행된다. 스크립트가 실행되면 클래스에 있는 Start() 메서드는 처음 한 번만 처리된다. 그 후 게임이 종료될 때까지 프레임마다 Update 메섣가 반복해서 처리한다.

 

씬 저장

여기까지 작업한 내용을 저장해야 하므로 씬을 만든다. 도구 바에서 File → Save As를 선택하고 씬 이름을 SampleScene으로 입력한 후 Save를 클릭한다. 저장하면 유니티 에디터의 Project 창에 씬 아이콘이 나타난다.

 

변수 사용하기

스크립트에서는 변수를 사용해 숫자나 문자열을 다룬다. 변수는 데이터를 감싸고 있는 상자와 같다. 상자를 만들려면 상자에 어떤 종류의 데이터를 넣을지, 상자 이름으로 무엇을 쓸지 선언해야 한다.

 

상자 종류의 이름은 '데이터형 이름'이라고 하는데 데이터형에는 정수, 소수, 문자열, 불 값 등이 있다. 또 상자 이름은 '변수명' 이라고 하는데 변수명은 스크립트에서 중복되지 않는 유일한 이름으로 정해서 사용한다. 

 

변수 초기화와 대입

한 가지 다른 예를 살펴보자. 변수에 변수를 대입하는 예이다. 앞에서 설명한 변수에 값을 대입하는 방법과 같다. Start 메서드의 내용을 다시 작성하고 실행한다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        float height1 = 160.5f;
        float height2;
        height2 = height1;
        Debug.Log(height2);
    }
}

 

 

10번 줄에서는 변수 선언과 값 대입을 한꺼번에 한다. 이것을 변수의 초기화라고 한다. 여기서는 float형(부동소수점형)의 height1 변수를 160.5f 값으로 초기화하였다.

 

대입할 소수 뒤에 f를 붙이면 소수는 부동소수점형(float형)으로 취급된다. f를 붙이지 않으면 배정도부동소수점형(double형)으로 취급된다. 9번 줄에서 f를 떼면 float형 변수가 double형 값으로 대입된다고 해석되어 '변수형과 대입하는 값의 데이터형이 달라!'라는 오류가 발생한다. float형에 소수를 대입할 때는 반드시 값 뒤에 f를 붙여야한다.

 

 

숫자와 마찬가지로 문자열도 변수에 대입할 수 있다. 문자열을 다루는 데이터형은 string이다.

 

문자열과 문자열, 문자열과 숫자의 연결

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string str1 = "happy ";
        string str2 = "birthday";

        str1 += str2;
        Debug.Log(str1);
    }
}

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string str1 = "happy ";
        int num = 123;

        str1 += str2;
        Debug.Log(str1);
    }
}

 

 

문자열과 숫자를 연결하면 num 변수를 문자열로 취급하게 된다. 따라서 str1 값은 happy 123으로 출력된다.

 

 

오늘 하루도 쌓였다.