게임 오브젝트 제어

7739 단어 TILUnityTIL

이 글은 『레트로의 유니티 게임 프로그래밍 에센스』를 공부하며 작성하였습니다.

5.1 클래스와 오브젝트

객체지향은 '사람이 현실 세상을 보는 방식'에 가깝게 프로그램을 만드는 것이다. 사람은 사물을 분해하여 생각하지 않고 하나의 온전한 독립체(오브젝트)로 여기는 경향이 있다. 객체지향은 프로그램을 이러한 오브젝트의 집합으로 구성하는 방식이다.

클래스
클래스는 표현하고 싶은 대상을 추상화하여 대상과 관련된 변수와 메서드를 정의하는 틀이다.

오브젝트
물건의 설계도인 클래스와 달리 오브젝트는 실제로 존재하는 물건(실체)이다.
클래스라는틀로 오브젝트를 찍어내 실체와하는 것을 인스턴스화한다고 하며, 인스턴스화를 이용해 생성된 오브젝트를 인스턴스라고 한다.

오브젝트 독립성
하나의 원본 클래스에서 여러 개의 오브젝트를 생성할 수 있다. 그럼에도 오브젝트는 서로 독립적이며 구별 가능한 실체이다.

5.2 C# 클래스 만들기

프로젝트 창에서 [Create] > [C# Script]
클래스 만들기

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

// MonoBehaviour 를 상속하지 않아 게임 오브젝트에 컴포넌트로 추가할 수 없다.
public class Animal
{
    // 클래스에 속하는 해당 클래스의 데이터와 행위를 표현하는 요소를 멤버라고 한다.
    // 클래스 멤버 중에서 변수를 필드라고 부른다.
    public string name;
    public string sound;

    public void PlaySound()
    {
        Debug.Log(name + " : " + sound);
    }
}

접근 제한자는 클래스 멤버의 공개 여부를 정하는 키워드이다.

  • public : 클래스 외부에서 멤버에 접근 가능
  • private (기본값) : 클래스 내부에서만 멤버에 접근 가능
  • protected : 클래스 내부와 파생 클래스에서만 멤버에 접근 가능

오브젝트 만들기

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

public class Zoo : MonoBehaviour
{
    void Start()
    {
    	// new 연산자는 클래스로 인스턴스를 생성한다.
    	// 생성자의 이름은 클래스의 이름과 같다.
        // tom은 참조 타입 변수이다. tom에는 Animal 오브젝트의 참조값이 할당되어 있다.
        // 참조값은 실제 오브젝트의 메모리 주소에 대응되는 값이다.
        Animal tom = new Animal();
        Animal jerry = new Jerry();
        // 멤버는 점 연산자로 접근할 수 있다.
        tom.name = "Tom";
        tom.sound = "Meow";
        // 기존에 jerry가 가리키던 오브젝트는 접근할 방법이 없어져 C#의 가리지 컬렉터가 자동으로 정리한다.
        jerry = tom;

        tom.PlaySound();
    }
}

빈 게임 오브젝트를 생성하여 Zoo를 컴포넌트로 추가한 후 게임을 실행하여 결과를 확인할 수 있다.

MonoBehavior는 new를 사용하지 않는다.
유니티의 대부분의 스크립트는 MonoBehaviour 클래스를 상속한다. 그런데 MonoBehaviour를 상속한 클래스는 new로 오브젝트를 생성할 수 없다. MonoBehaviour를 상속한 클래스는 게임 오브젝트에 컴포넌트로 추가하는 방법으로만 오브젝트로 만들 수 있다.

5.3 참조 타입

변수에 실체가 아니라 실체로 향하는 참조가 할당되고, 변수에 접근하면 참조를 통해 실체에 접근하는 변수를 참조(reference) 타입이라고 한다. C#에서 클래스 타입의 변수는 참조 타입으로 동작한다.

값 타입과 참조 타입
float, int, string 등의 C# 내장 변수는 참조로 동작하지 않는다. 이런 타입을 값(Value) 타입이라고 한다.
참조 타입 변수는 값(실체)으로 향하는 참조를 저장하고, 값 타입 변수는 해당 변수 공간에 값 자체를 저장한다. 값 타입 변수에 값을 할당하면 값의 참조가 아니라 값의 사본이 할당된다.

변수 타입 구분
참조 타입
class, 유니티의 모든 컴포넌트, C# 스크립트(MonoBehaviour를 상속받는 클래스)
값 타입
C# 내장 변수(bool, int, float, char ...), struct(구조체) 타입(Vector3, Color ...)

immutable로 동작하는 string과 같은 예외를 제외한 class로 만든 대부분의 타입은 참조로 동작한다.

5.4 변수로 컴포넌트 사용하기

참조 타입을 이용하여 변수로 씬에 있는 게임 오브젝트와 컴포넌트에 접근하고 제어할 수 있다.
물리 큐브 만들기
1. Hello Unity!에서 처럼 Cube 오브젝트를 생성한 후 Rigidbody 컴포넌트를 추가한다.

변수로 리지드바디 컴포넌트 사용하기
변수로 Cube 게임 오브젝트의 리지드바디 컴포넌트에 접근하고 힘을 추가하는 C# 스크립트를 구현한다.

스크립트의 public 변수는 인스펙터 창에서 편집 가능하도록 표시된다. Cube 오브젝트의 Rigidbody 컴포넌트를 Jumper 컴포넌트의 My Rigidbody 필드로 드래그&드롭하여 참조를 할당한다. 이제 게임을 시작하면 Cube 게임 오브젝트가 1회 위로 점프한다.

5.5 마무리

다음 순서로 씬을 구성하고 게임 오브젝트와 컴포넌트를 조종한다.
1. 필요한 컴포넌트를 게임 오브젝트에 추가한다.
2. 스크립트에서 조장할 컴포넌트에 대한 변수를 선언한다.
3. 변수에 컴포넌트를 할당한다.
4. 코드에서 변수를 사용하면 그것이 가리키는 실제 컴포넌트를 조종한다.

좋은 웹페이지 즐겨찾기