Unity 강의 정리 2장: 게임 엔진의 원리 🎮

나무에물주기·2023년 8월 11일
1

Unity

목록 보기
2/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

게임 엔진의 원리

게임 엔진은 놀랍도록 복잡한 게임을 개발하고 실행하는 복잡한 프로세스를 단순화하는 데 사용된다. 게임 엔진은 물리학, 그래픽, 사운드 등을 처리하며, 개발자가 게임을 만드는 데 집중할 수 있도록 지원한다. Unreal Engine과 Unity와 같은 엔진은 이러한 원리를 기반으로 구축한다.


게임 개발에서의 상속: 효율적인 캐릭터 설계 🎮

상속은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 재사용성확장성을 제공한다. 이를 통해 코드의 유지보수가 쉬워지며, 새로운 기능의 추가가 간편해진다.

상속의 기본 구조 🏗️

상속이란 기존의 클래스(부모 클래스)를 기반으로 새로운 클래스(자식 클래스)를 생성하는 과정이다. 자식 클래스는 부모 클래스의 기능을 물려받아 사용하므로, 중복된 코드 작성을 피할 수 있다.

예를 들어, 게임에서 '몬스터'라는 클래스가 있다면 이 클래스 안에는 몬스터와 관련된 변수나 기능들이 정의될 것이다. 여기에 상속을 적용하면, 다양한 종류의 몬스터를 효율적으로 설계할 수 있다.

게임 캐릭터 설계에서의 상속 💂

게임 내에서의 캐릭터는 전사, 마법사, 궁수 등 다양한 역할을 가질 수 있다. 이러한 캐릭터들은 공통적인 요소(인공지능, 크기, 기본 동작 등)를 가지고 있을 것이다. 이러한 공통 요소를 '플레이어 클래스'에 정의하고, 각 역할에 맞는 캐릭터 클래스에서 상속받으면 코드의 중복을 줄일 수 있다.

상속의 한계 🚧

그러나 상속은 항상 잘 작동하는 것은 아니다. 완벽하게 순수한 부모 클래스를 만드는 것은 어려울 수 있으며, 상속받아야 할 필요가 없는 기능도 물려받게 될 수 있다.

예를 들어, '플레이어 클래스'에서 체력 시스템과 공격 시스템을 상속받아야 하는 'NPC 클래스'가 있다면, 이 시스템이 불필요한 경우 문제가 발생할 수 있다.

해결 방안: 컴포넌트 시스템 🛠️

이러한 상속의 한계를 극복하기 위해, 'A is B' 구조보다는 'A has B' 구조를 사용하는 것이 좋을 수 있다. 필요한 기능을 갖다 붙여서 포함시키는 이 방식을 '게임 오브젝트 - 컴포넌트'라고 한다.


Unity에서 게임 오브젝트와 컴포넌트 다루기

Unity는 게임 오브젝트컴포넌트를 사용하여 게임 개발을 효과적으로 수행한다. 이러한 구조는 게임 개발의 기반이며, 개발을 유연하고 효과적으로 만들어 준다. 🛠️

게임 오브젝트 (Game Object) 🎯

Unity에서 게임 오브젝트는 씬의 모든 엔터티의 기본 컨테이너로 사용된다.

// 새로운 게임 오브젝트를 생성
GameObject newObject = new GameObject("MyObject");

컴포넌트 (Component) 🧩

컴포넌트는 게임 오브젝트에 기능을 추가하는 데 사용된다.

public class Jumper : MonoBehaviour
{
    public Rigidbody myRigidbody;

    void Start()
    {
        // Y축 방향으로 500의 힘을 적용
        myRigidbody.AddForce(0, 500, 0);
    }
}

컴포넌트의 장점 🌟

  • 유연한 재사용: 여러 게임 오브젝트에 동일한 컴포넌트를 적용할 수 있다.
  • 독립성: 컴포넌트 간 독립성은 유지보수와 확장성을 향상시킨다.
  • 빠른 개발: 기존 컴포넌트를 사용하면 복잡한 기능도 빠르게 구현할 수 있다.

Unity에서 메시지와 브로드캐스팅 이해하기 📢

Unity의 컴포넌트 구조는 복잡한 상호 작용과 유연성을 제공한다. MonoBehaviour 클래스를 상속받는 컴포넌트는 유니티의 통제를 받고, 다양한 이벤트 메시지를 감지할 수 있다.

MonoBehaviour 클래스 🧠

MonoBehaviour는 Unity의 모든 컴포넌트가 상속받는 클래스로, 게임 오브젝트의 행동을 제어하는 데 사용된다. 특징은 다음과 같다:

  • 기초 기능 제공: 필수적인 기능들을 제공한다.
  • 유니티 통제: 유니티 엔진의 관리를 받는다.
  • 이벤트 감지: 유니티 이벤트 메시지를 감지할 수 있다.
  • 컴포넌트로서 추가: 게임 오브젝트에게 추가될 수 있다.

MonoBehaviour는 다음과 같은 상속 체인을 가진다:

MonoBehaviour → Behaviour → Component → Object

C# 스크립트 클래스의 분류 🗂️

일반 C# 스크립트 클래스

  • MonoBehaviour 상속 받지 않음: 다른 스크립트에서 new를 이용해 객체로 생성할 수 있다.

컴포넌트로 사용될 C# 스크립트 클래스

  • MonoBehaviour 상속 필요: 컴포넌트로 인식되려면 반드시 상속해야 한다.
  • 직접 객체 생성 불가: 다른 스크립트에서 new를 이용해 객체로 생성할 수 없다.

메세지 시스템 📬

Unity의 메세지 시스템은 컴포넌트 간의 독립성을 유지하면서도 통신을 가능하게 하는 능력이 있다. 이 시스템의 특징은 다음과 같다:

  • MonoBehaviour 상속: Start(), Update() 함수 등 이벤트 함수를 사용하려면 MonoBehaviour를 상속받아야 한다.
  • 보내는 쪽/받는 쪽 독립성: 보내는 쪽은 누가 받는지, 받는 쪽은 누가 보냈는지 신경 쓰지 않는다.
  • 자동 실행: 메세지에 명시된 기능이 있으면 실행하고, 없으면 무시한다.
  • 컴포넌트 독립성: 컴포넌트 간의 서로의 존재를 모른다. 따라서, 컴포넌트의 독립성이 보장된다.

브로드캐스팅의 작동 원리 📢

Unity의 브로드캐스팅은 메세지를 여러 컴포넌트에 보내는 과정이다.

  • 무차별적 전송: 여러 오브젝트에 메세지가 뿌려지며, 관련 컴포넌트만 반응한다.
  • 성능 고려: 많은 메세지를 보내므로 성능에 영향을 미칠 수 있어 적절히 사용해야 한다.

컴포넌트의 기능 🧠

  • 고유 기능: 각 컴포넌트는 자신만의 고유한 기능을 가진다. 예를 들어, Transform 컴포넌트는 위치와 관련된 기능을 담당한다.
  • Start 메서드: 게임 시작 시, 컴포넌트를 초기화한다. 유니티는 Start 메세지를 브로드캐스팅하여 초기화를 수행한다.
  • Update 메서드: 매 프레임마다 주기적으로 상태를 갱신한다. 외부에서 찾을 필요 없이 스스로 실행된다.

Unity에서 이벤트 메서드의 활용 이해하기 🔄

Unity 게임 개발에서 이벤트 메서드는 객체와 컴포넌트의 생명주기와 상호작용을 관리하는 중요한 요소다. 아래에서는 다양한 유니티 이벤트 메서드의 활용을 살펴본다.

게임 시작과 초기화 🚀

  • 게임 시작 시 초기화: 게임 오브젝트와 컴포넌트가 처음 활성화될 때, 초기화 작업을 수행한다.
  • Awake: 객체가 로드될 때 호출되는 메서드로, 게임이 시작되기 전에 초기 설정이 필요한 경우에 사용한다.

프레임별 업데이트와 동작 제어 🔄

  • 프레임별 동작 제어: 게임의 물리적 및 시각적 표현을 제어한다.
  • Update: 매 프레임마다 호출되어, 지속적인 상태 갱신이 필요한 경우에 사용한다.
  • FixedUpdate: 물리적 연산과 관련된 주기적인 업데이트에 사용된다.

충돌과 상호작용 감지 🎮

  • 객체 간의 충돌 감지: 오브젝트간 충돌이나 상호작용을 처리한다.
  • OnTriggerEnter: 두 오브젝트가 충돌 발생 시 호출되며, 특별한 충돌 처리 로직을 수행할 수 있다.
  • OnCollisionEnter: 충돌하는 물리적 오브젝트를 감지하여, 더 정밀한 충돌 처리를 수행한다.
profile
개인 공부를 정리함니다

2개의 댓글

comment-user-thumbnail
2023년 8월 11일

많은 도움이 되었습니다, 감사합니다.

1개의 답글