본문 바로가기
XR개발/C#언어_Unity

Unity C# 기본정리

by 오머리쿠_OmaryKoo 2025. 4. 16.

 

01.상속과 재사용

유니티의 컴포넌트 기반 구조를 이해하려면 코드를 재사용하는 전통적 방법인 '상속'을 알아야 한다.

(부모-자식 상속)

 

예시로 Orc : Monster

여기서 :(콜론)은 오른쪽의 부모 클래스를 상속해 왼쪽의 자식 클래스를 만든다는 의미

즉, Monster 클래스를 기반으로 Orc 클래스를 만든다는 의미

 

클래스란 변수와 메서드(함수)를 묶은 틀을 말한다.

 

(여기서 C언어에서 함수란, 명령어들의 집합체라고 보면 된다.)

 

부모 클래스를 상속해 자식 클래스의 기초 구현을 대신할 수 있으나, 상속에만 의존하면 오히려 코드를 재사용하기 힘들 수 있다.

 

즉, 상속에만 의존하면, 코드를 재사용하기 힘든 경우가 생긴다.


02.컴포넌트

 

위와같이 inspector를 보면, 컴포넌트 패턴이란 미리 만들어진 부품을 조립하여 완성하는 오브젝트를 만드는 방식을 말하며,

컴포넌트란 미리 만들어진 부품을 말하며, 게임 오브젝트는 속이 빈 껍데기이다.

 

게임 오브젝트와 컴포넌트의 특징을 보면, 컴포넌트 방식은 원하는 기능을 가진 컴포넌트만 선택적으로 골라 쓸 수 있어 유연한 재사용이 가능하며, 컴포넌트는 스스로 동작하는 독립적인 부품을 말한다. 즉, 컴포넌트는 자신과 같은 게임 오브젝트에 추가된 다른 컴포넌트에 관심 없다. 왜냐하면 컴포넌트의 기능은 컴포넌트 내부에 완성돼 있기 때문이다.

 

02-1. 유니티 에디터에서의 컴포넌트

박스 콜라이더(Box Collider) : 다른 물체가 부딪칠 수 있는 물리적 표면을 만든다. 그리고 계산 처리를 빨리 하기 위함이기도 하다. 만약 박스 콜라이더 없이 충돌 액션을 취하게 된다면, 메시에 있는 표면 표면마다 처리를 해야하기 때문에 과부하가 걸린다.

 

리지드 바디(Rigidbody) : 게임 오브젝트가 물리 엔진의 통제를 받게 되는 것을 말한다. 

 

여기서 두 물체를 충돌하게 된다면, 둘 중 하나는 반드시 rigid body가 있어줘야 한다.


03.메시지와 브로드캐스팅

유니티의 모든 컴포넌트는 MonoBehaviour 클래스를 상속받는다.

 

MonoBehaviour 클래스는 유니티에서 미리 만들어 제공하는 클래스이며 컴포넌트에 필요한 기본 기능을 제공한다.

즉, MonoBehaviour를 상속한 클래스는 게임 오브젝트에 컴포넌트로서 추가될 수 있다. MonoBehaviour를 상속해서 만든 컴포넌트는 유니티의 제어를 받게 되므로, 컴포넌트는 유니티의 메시지를 들을 수 있다.

 

MonoBehaviour 클래스는 유니티에서 대부분의 스크립트가 상속받는 기본 클래스이며, 그 안에서 자주 사용하는 대표적인 매서드(함수)가 Start()와 Update()이다.

 

3-1. Start()

게임 오브젝트가 활성화되고 첫 프레임이 시작되기 전에 한 번만 호출된다.

 

3-2. Update()

매 프레임마다 반복적으로 호출되며, 입력 처리, 캐릭터 이동, 실시간 계산 등에 사용된다.

 

이 두 매서드(함수)는 MonoBehaviour 안에서 자동으로 인식되는 유니티의 생명주기 함수이기 때문에, 직접 호출하지 않아도 유니티가 알아서 실행해준다.


 

MonoBehaviour를 상속한 클래스는 독립적인 생명주기를 가지는 컴포넌트로 동작한다.유니티에서 스크립트는 '게임 오브젝트에 붙는 컴포넌트고, 컴포넌트가 MonoBehaviour를 기반으로 작동하면서 유니티의 생명주기 함수(Start, Update, OnDestroy, Awake etc)를 자동으로 따라가게 된다.


04. 메시지와 브로드캐스팅

유니티 엔진은 어떤 게임 오브젝트에 어떤 컴포넌트가 추가 되었는지 모든 명단을 모조리 파악하지는 않는다. 따라서 유니티는 컴포넌트의 어떤 기능을 실행시키고 싶을 때 직접 찾아가는 대신 메시지를 날리는 방식을 사용한다.

 

메시지 기반 방식은 누가 메시지를 보냈는지, 받게 될지 신경쓰지 않음으로 컴포넌트의 독립성을 유지할 수 있다. 메시지를 무차별적으로 여러 오브젝트에 동시에 뿌리는 방법을 브로드캐스팅이라 한다.

 


05. 유니티에서 게임이 "동작"하는 원리

  1. 유니티는 "씬(Scene)" 안에 있는 모든 GameObject들을 관리.
  2. GameObject는 실제 렌더링되거나 충돌되는 "실체"
  3. 하지만 GameObject는 껍데기일 뿐, "움직임이나 로직은 아무것도 안 한다".
  4. 그래서 여기에 Component들을 붙여서 능력을 부여한다.
  5. 대표적인 컴포넌트가:
    •   Transform → 위치, 회전, 크기
    •   Rigidbody → 물리 움직임
    •   Collider → 충돌 감지
    •   Script (MonoBehaviour) → 나만의 행동을 정의

 

 

MonoBehaviour = 유니티 세상과 내가 작성한 스크립트를 연결해주는 중간자

 

내가 만든 MyScript : MonoBehaviour는 결국 이렇게 작동됨:

  1. 유니티가 이 스크립트를 감지
  2. 게임 오브젝트에 붙여졌는지 확인
  3. 붙었다면 Awake() → Start() → Update() 등을 자동으로 호출
  4. transform.position이나 Rigidbody.AddForce() 같은 API도 사용할 수 있게 됨

 

유니티에서 뭔가 움직이고 반응하게 하고 싶다면, 결국은 MonoBehaviour를 직접 사용하거나,
MonoBehaviour를 상속한 컴포넌트를 GameObject에 붙이는 방식을 써야 한다.


06. var: 암시적 타입 변수

var x = 5;

 

여기서 var는 "타입을 생략했을 뿐, 타입이 없는 게 절대 아니다." -> 컴파일러가 대입된 값을 보고 자동으로 타입을 유추한다.

 

var name = "Taehan";        // string
var score = 95.4;           // double
var isPassed = true;        // bool
var position = new Vector3();  // Vector3 (유니티)

 

컴파일 시점에 값을 보고 타입을 결정

결정된 이후에는 타입이 고정되며, 마치 직접 int, string을 쓴 것처럼 행동한다.

 

var age = 25;
// age = "스물다섯";  ❌ 컴파일 에러! (이미 int로 고정됐기 때문)


07. 클래스와 오브젝트

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

 

 

07-1. Class_설계도

데이터와 기능을 정의해놓은 틀, 청사진 구조이다.

어떤 속성(변수)과 행동(함수)를 가질지를 미리 정해놓음

자기 자신만으로는 아무런 작동을 하지 않음.

 

07-2. Object_실체, 인스턴스

클래스를 기반으로 만들어진 실제 메모리에 존재하는 구체적인 실체

인스턴스라고도 불림.

클래스가 정의한 속성과 기능을 그대로 가지고 실제로 동작할 수 있다.

 

개념 코드 예시 설명
클래스 public class Car(...) 설계도만 만든 것, 아직 실행되지 않음
인스턴스화 new Car() 클래스를 바탕으로 객체를 실제로 생성하는 과정
객체 / 인스턴스 Car myCar = new Car(); 만들어진 실체, 클래스의 복제품이자 실행 가능한 존재
메서드 사용 myCar.Drive(); 객체를 통해 행동을 실행, 실제 로직이 돌아가는 부분

 

즉, 클래스라는 틀로 오브젝트를 찍어내 실체화하는 것을 '인스턴스화'한다고 하며, 인스턴스화를 통해 생성된 오브젝트를 인스턴스라고 함.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90