728x90

이 글은 [따라하면서 배우는 고박사의 유니티 기초]의 게임오브젝트 물리와 충돌 강의를 정리한 글이다.

 

학습 페이지

 

 

 


물리 관련 컴포넌트

  • 2D : Component > Physics 2D (2D가 붙어있어야 한다.)
  • 3D : Component > Physics (아무것도 붙어있지 않다.)

Rigidbody2D 컴포넌트

2차원 공간에서 오브젝트의 물리와 중력 담당하는 컴포넌트로 아래와 같은 옵션을 설정할 수 있다.

RigidBody 추가 시 중력은 바로 적용되지만, 물리력에 의한 이동, 회전, 마찰력과 같이 다른 오브젝트와의 상호작용이 필요한 경우에 Collider 2D 컴포넌트가 필요하다.

 

RigidBody 추가 시 중력 바로 적용되는 것을 확인할 수 있다.

 


Collider2D 컴포넌트

2차원 공간에서 오브젝트의 충돌 범위를 나타내는 컴포넌트로 충돌 범위의 생김새나 특징에 따라 00 Collider 2D와 같이 명명한다. 

 

Box Collider 2D

사각형 범위의 충돌 범위를 나타내며, 변수는 아래와 같다.

  • Offset: 충돌 범위 중심점 (중심점을 바꾸어 다른 곳에서 충돌이 일어나도록 설정 가능)
  • Size: 충돌 범위 크기

​충돌 범위가 오브젝트와 동일하게 설정되지 않아도 된다. 게임에 따라 작게, 크게 설정이 가능하다. 

 

Circle Collider 2D 

원 범위의 충돌 범위를 나타내며, 연산 속도가 빠르다.

  • Offset: 충돌 범위 중심점 위치
  • Radius: 충동 범위 반지름 크기

Edge Collider 2D

처음 생성 시 직선이 그어지며, point > size로 점의 개수를 정할 수 있다. 또 점의 위치를 바꾸어서 다양한 곡선이나 형태로 표현 가능하다.

주로 2D 게임의 바닥 충돌에 사용한다.

  • Offset: 충돌 범위 중심점이다.
  • Edge Radius: 충돌 선의 두께
  • Points: 선을 이루는 점의 개수와 각 점의 위치

Polygon Collider 2D

텍스처 모양과 비슷한 모양으로 생성하는데, 세밀한 충돌과 반대로 연산량이 많아지기 때문에 꼭 필요할 때만 사용한다.

엣지와 동일하게 point 변수 값을 수정해서 바꿀 수 있다. 

  • Offset: 충돌 범위 중심점
  • Points: 선을 이루는 점의 개수와 각 점의 위치

Capsule Collider 2D

캡슐 모양의 충돌 범위 생성하며 주로 사람 형태의 캐릭터에 사용된다. 

  • Offset: 충돌 범위 중심점
  • Size: 충돌 범위 크기
  • Directon: 둥근 캡슐이 표현되는 방향
    • Vertical: 위/아래
    • Horizontal: 좌/우

 

Composite Collider 2D

다른 게임오브젝트의 Collider 2D 들을 하나로 묶어주는 역할로 Box , Polygon 만 가능하다. 

1. 빈 게임 오브젝트 생성하고, Composite Collider 2D 컴포넌트 추가한다.

2. 하나로 묶고 싶은 Collider 2D 컴포넌트를 가지고 있는 게임 오브젝트들을 Compite Collider 2D 가지고 있는 게임 오브젝트의 자식 오브젝트로 설정한다.

 

3. 자식 오브젝트들의  Polygon Collider 2D 컴포넌트에 있는 "Used By Composite" 변수 활성화

 

결과적으로 두 게임 오브젝트의 충돌범위가 같게 나오는 것을 확인할 수 있다. 

 

 

서로 다른 두 오브젝트가 충돌하기 위한 필수 조건

  1. 두 오브젝트 모두 Collider 2D 컴포넌트를 가지고 있어야 한다. 
  2. 둘 중 하나 이상의 오브젝트가 물리 처리를 담당하는 Rigidbody 컴포넌트를 가지고 있어야 한다

 

기존의 오브젝트에 Rigidbody 2D아 Circle Collider 2D를 추가하였으며, 중력에 의해 아래로 떨어지지 않게 Gravity Scale 0으로 설정하였다.

플레이어 오브젝트에는 이전에 작성하였던 이동 스크립트 코드를 적용하였다. 

using UnityEngine;

public class Movement2D : MonoBehaviour
{
    private float moveSpeed - 5.0f; // 이동 속도
    private void Update()
    {
        float x = Input.GetAxisRaw("Horizontal"); // 좌우 이동
        float y = Input.GetAxisRaw("Vertical"); // 상하 이동

        // 새로운 위치 = 현재 위치 + (방향 * 속도)
        transform.position += new Vector3(x,y,0)* moveSpeed * Time.deltaTime;
    }
}

플레이어와 부딫히는 장애물은 Collider 2D를 가지고 있다. 두 오브젝트가 모두 Collider 2D를 가지고 있기 때문에 충돌이 가능하다. 

 

 

결과적으로 이동이 잘 되고, 장애물과 충돌할 때, 어떤 식으로 처리하라는 내용이 없기 때문에 결과와 같이 뚫고 지나가려는 것을 확인할 수 있다. 오브젝트 이동을 위해서는 transform 컴포넌트를 사용해야 하지만, 여러 물리적 명령을 수행하기 전에 실제 이동이 가능한지, 어떤 식으로 이동을 할 수 있는지 검사하는 역할을 하는 것이 물리에서 해야하는 일이다.

​이는 Rigidbody 2D를 이용해 물리처리가 가능한 이동을 할 수 있다. 

 

GameObject의 component에 접근하는 방법

GetComponent<컴포넌트>();

transform은 모든 오브젝트에 포함되는 컴포넌트이므로 소문자로 접근이 가능하다. 나머지 컴포넌트는 GetComponent() 함수로 접근할 수 있다. 

 
using UnityEngine;

public class Movement2D : MonoBehaviour
{
    private float moveSpeed = 5.0f; // 이동 속도
    private Rigidbody2D rigid2D;

    private void Awake()
    {
        rigid2D = GetComponent<Rigidbody2D>();
    }
    private void Update()
    {
        float x = Input.GetAxisRaw("Horizontal"); // 좌우 이동
        float y = Input.GetAxisRaw("Vertical"); // 상하 이동

        // 새로운 위치 = 현재 위치 + (방향 * 속도)
        rigid2D.velocity += new Vector3(x,y,0)* moveSpeed ;
    }
}

 

권장하는 사용법

  • 컴포넌트와 동일한 타입의 변수 생성
  • 컴포넌트 정보 얻어와 변수에 저장
  • 컴포넌트 정보가 저장된 변수를 사용

 

현재 방법과 같이 클래스 변수를 생성하고, 컴포넌트 정보를 한번만 저장하면 현재 클래스 내부 어디에서든 rigid2D 변수를 이용해 Rigidbody2D 컴포넌트 정보를 바꾸거나 얻어올 수 있다. 

Rigidbody2D 클래스에 있 velocity 변수는 이동방향과 속도를 나타내는 속력 변수로 속력을 설정하면 Rigidbody2D에 의해서 이동이 가능하다. 

 

충돌 이벤트 함수

 물리적인 충돌이 발생하고 이벤트 함수가 호출되는 함수

  • OnCollisionEnter2D : 두 오브젝트가 충돌하는 순간 1회 호출
  • OnCollisionStay2D : 두 오브젝트가 충돌하고 있는 동안 매프레임 호출
  • OnCollisionExit2D : 두 오브젝트가 떨어지는 순간 1회 호출
 
 

[SerializeField]

변수 바로 윗줄에 작성하여, Inspector View에서 변수의 옵션 조절할 수 있도록 해준다.

script file에서 아래와 같이 변수 지정하면 Inspector View Scipt 부분에서 Color 제어 UI가 생성된다.

OnCollisionEnter2D()

우리가 설정한 color 변수의 색상으로 오브젝트의 색을 변경한다.

OnCollisionExit2D()

오브젝트의 색상을 하얀색으로 변경

 


물리적인 충돌 없이 이벤트 호출

접근 시 뚫고 지나갈 수 있음, 영역안에 물체를 넣는 경우 사용

  • OnTriggerEnter2D :두 오브젝트가 충돌하는 순간 1회 호출
  • OnTriggerStay2D :두 오브젝트가 충돌하고 있는 동안 매프레임 호출
  • OnTriggerExit2D :두 오브젝트가 떨어지는 순간 1회 호출

내가 소속된 게임 오브젝트의 컴포넌트 정보

GetComponent<컴포넌트>()

내가 아닌 다른 게임 오브젝트의 컴포넌트 정보

게임오브젝트.GetComponent<컴포넌트>()

 

 

 

 

+ Recent posts