01 Rigidbody 2D 컴포넌트
물리와 관련된 컴포넌트
- 2D : Component - Physics 2D
- 3D : Component - Physics
Rigidbody2D 컴포넌트
- 오브젝트에 물리를 적용하고 중력을 받을 수 있도록 한다.
- 2차원 공간에서 오브젝트의 물리와 중력을 담당하는 컴포넌트
위와 같이 옵션을 추가할 수 있다.
Rigidbody를 추가하면 바로 중력은 적용되지만 물리력에 의한 이동, 회전, 마찰력과 같이 다른 오브젝트와의 상호작용이 필요한 경우 오브젝트의 출동 범위를 나타내는 Collider2D 컴포넌트가 필요하다.
위와 같이 Rigidbody만 추가되어 있을 때 중력은 바로 적용되는 것을 확인할 수 있다.
02 Collider 2D 컨포넌트
- 2차원 공간에서 오브젝트의 충돌 범위를 나타내는 컴포넌트
- 충돌 범위의 생김새나 특징에 따라 “OO Collider 2D”와 같이 이름을 명명
- Box Collider 2D
- Circle Collider 2D
- Edge Collider 2D
- Polygon Collider 2D
- Capsule Collider 2D
- Composite Collider 2D
Box Collider 2D
- 사각형 범위의 충돌 범위를 나타낸다.
- offset : 충돌 범위 중심점
- size : 충돌 범위 크기
충돌 범위가 꼭 오브젝트와 동일하게 설정되지 않아도 된다.
Circle Collider 2D
- 원 범위의 충돌 범위를 나타낸다.
- 연산속도가 가장 빠르다.
- Offset : 충돌 범위의 중심점 위치
- Radius : 충돌 범위의 반지름
Edge Collider 2D
- 처음 생성하면 직선이 생성된다.
- size로 점의 개수를 변화시키고, element 값을 조정해서 점의 위치를 바꿀 수 있다.
- Offset : 충돌 범위의 중심점 위치
- Edge Radius : 선의 두께
- Points : 선을 이루는 점의 개수와 각 점의 위치
Polygon Collider 2D
- 텍스처의 모양과 비슷한 형태로 충돌 범위가 생성된다.
- 세밀한 충돌이 가능하지만 연산량이 늘어나기 때문에 꼭 필요한 경우에 사용하거나 Points 정보를 수정하여 사용한다.
- Offset : 충돌 범위의 중심점 위치
- Points : 충돌 범위를 표현하는 점 정보
Capsule Collider 2D
- 캡슐 모양의 충돌 범위로, 주로 사람 형태의 캐릭터에 사용한다.
- Offset : 충돌 범위의 중심점 위치
- Size : 충돌 범위의 크기
- Direction
- 세로가 길 땐 Vertical
- 가로가 길 땐 Horizontal
Composite Collider 2D
- 다른 충돌 범위와 다르게 여러 Collider들을 하나로 묶어주는 역할을 한다.
- Box Collider 2D와 Polygon Collider 2D 컴포넌트만 가능
Composite Collider 2D 사용
1. 빈 게임 오브젝트를 생성하고, Composite Collider 2D 컴포넌트를 오브젝트에 추가한다.( Rigidbody2D 컴포넌트도 함께 추가됨)
2. 하나로 묶고 싶은 Collider 2D 컴포넌트를 가지고 있는 게임오브젝트들을 Composite Collider 2D 컴포넌트의 자식 오브젝트로 설정한다.
3. 자식 오브젝트들의 Collider 2D 컴포넌트에 있는 "Used By Composite" 변수를 활성화한다.
결과를 보면 충돌범위가 하나로 묶여서 표현되는 것을 확인할 수 있다.
03 게임오브젝트 충돌 처리
서로 다른 두 오브젝트가 충돌하기 위한 필수 조건
- 두 오브젝트 모두 충돌 범위인 Collider2D 컴포넌트를 가지고 있어야 한다.
- 둘 중 하나 이상의 오브젝트가 물리 처리를 담당하는 Rigidbody2D 컴포넌트를 가지고 있어야 한다.
Player 게임오브젝트는 이전에 사용했던 것이고, Rigidbody 2D와 Circle Collider 2D만 추가된 것이다.
중력으로 떨어지는 것을 막기 위해 Gravity Scale을 0으로 설정했다.
Player와 부딪히는 장애물은 Box Collider 2D를 가지고 있다.
→ 두 오브젝트 모두 Collider2D 컴포넌트를 가지고 있고, Player가 Rigidbody2D 컴포넌트를 가지고 있기 때문에 두 오브젝트가 충돌이 가능하다.
이동은 잘 되지만 장애물과 충돌했을 때 어떤 식으로 처리하라는 내용이 없기 때문에 위와 같이 뚫고 지나가려고 하는 것을 확인할 수 있다.
Rigidbody2D를 이용해 물리 처리가 가능한 이동을 할 수 있다.
지난 시간에 같은 게임오브젝트에 있는 transform 컴포넌트에 접근하는 방법을 배웠는데, transform은 모든 게임오브젝트에 반드시 포함되기 때문에 소문자로 접근이 가능하다. 나머지 컴포넌트는 GetComponent함수로 접근이 가능하다.
게임오브젝트의 컴포넌트에 접근하는 방법
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.GetAxis("Horizontal"); //좌우 이동
float y = Input.GetAxis("Vertical"); //위아래 이동
//Rigidbody2D 컴포넌트에 있는 속력(velocity) 변수 설정
rigid2D.velocity = new Vector3(x, y, 0) * moveSpeed;
}
}
Movement2D Script를 위와 같이 수정한다.
권장하는 사용 방법
1. 컴포넌트와 동일한 타입의 변수 생성(rigid2D)
2. 컴포넌트 정보를 얻어와서 변수에 저장( GetComponent)
3. 컴포넌트 정보가 저장된 변수를 사용
현재 방법과 같이 클래스 변수를 생성하고, 컴포넌트 정보를 한 번만 저장하면 현재 클래스 내부 어디서든 rigid2D 변수를 이용해 Rigidbody2D 컴포넌트 정보를 바꾸거나 얻어올 수 있다.
코드와 같이 기존의 transform.position += .. 이동 코드 대신 Rigidbody2D에 있는 속력(velocity) 변수만 설정해 주면 Rigidbody2D에 의해서 이동이 가능하다.
물리 엔진에 의해 처리되므로 더 자연스럽고 예측 가능한 움직임을 얻을 수 있다.
Rigidbody2D는 "장애물을 만나게 되면 이동을 하지 말고 그대로 멈춰라"와 같이 다양한 물리적 처리가 기반된 이동이 가능하다.
04 OnCollision2D() 충돌 이벤트 함수
물리적인 충돌이 일어나고, 이벤트 함수가 호출되는 함수
- OnCollisionEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출
- OnCollisionStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
- OnCollisionExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
벽을 표현하고 있는 Wall이라는 오브젝트에 spriteRenderer 컴포넌트에 접근을 해서 충돌이 일어났을 때 벽의 색상을 바꾸는 코드이다.
[SerializeField]
- 해당 변수의 바로 윗줄에 작성(위의 코드로는 private Color color;)
- Transform의 position, rotation 변수들과 같이 Inspector View에서 변수의 옵션을 조절할 수 있게 해준다.
OnCollisionEnter2D()
- 우리가 설정한 color 변수의 색상으로 오브젝트의 색을 변경
OnCollisionExit2D()
- 오브젝트의 색상을 하얀색으로 변경
위와 같이 오브젝트를 생성한다.
Inspector View에서 Color 값을 설정할 때 알파(a) 값을 255로 설정해야 한다.
05 OnTrigger2D() 충돌 이벤트 함수
물리적인 충돌 없이 이벤트 함수가 호출
- OnTriggerEnter2D : 두 오브젝트가 충돌하는 순간 1회 호출
- OnTriggerStay2D : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
- OnTriggerExit2D : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
내가 소속된 게임오브젝트의 컴포넌트 정보
GetComponent<컴포넌트>()
내가 아닌 다른 게임오브젝트의 컴포넌트 정보
게임오브젝트.GetComponent<컴포넌트>()
using UnityEngine;
public class TriggerEvent : MonoBehaviour
{
[SerializeField]
private GameObject moveObject;
[SerializeField]
private Vector3 moveDirection;
private float moveSpeed;
private void Awake()
{
moveSpeed = 5.0f;
}
//충돌이 일어나는 순간 1회 호출
private void OnTriggerEnter2D(Collider2D collision)
{
//moveObject 오브젝트의 색상을 검정색으로 설정
moveObject.GetComponent<SpriteRenderer>().color = Color.black;
}
//충돌이 유지되는 동안 매 프레임 호출
private void OnTriggerStay2D(Collider2D collision)
{
//moveObject 오브젝트를 moveDirection 방향으로 이동한다.
moveObject.transform.position += moveDirection * moveSpeed * Time.deltaTime;
}
//충돌이 종료되는 순간 1회 호출
private void OnTriggerExit2D(Collider2D collision)
{
//moveObject 오브젝트의 색상을 흰색으로 설정
moveObject.GetComponent<SpriteRenderer>().color = Color.white;
//moveObject 오브젝트의 위치를 (0, 4, 0)으로 설정
moveObject.transform.position = new Vector3(0, 4, 0);
}
}
두 오브젝트의 Move Object를 보면 Sun 오브젝트가 적용되어 있다.
따라서 Player가 LeftTilt, RightTilt 오브젝트에 충돌하게 되면 Sun 오브젝트가 바뀌게 된다.
Player가 왼쪽 오브젝트와 충돌하면, Sun 오브젝트가 검은색으로 변하고 왼쪽으로 이동한다.
반대로 Player가 오른쪽 오브젝트와 충돌하면, Sun 오브젝트가 검정색으로 변하고 오른쪽으로 이동한다.
'PBL > Unity' 카테고리의 다른 글
유니티 2D 기초 - Instantiate() 활용 예제 (0) | 2024.04.14 |
---|---|
유니티 2D 기초 - 게임 생성 함수 (0) | 2024.04.13 |
유니티 2D 기초 - 게임오브젝트 이동 (0) | 2024.04.08 |
유니티 기초 - 유니티 이벤트 함수 (0) | 2024.04.08 |
유니티 기초 - 스크립트 개요, 콘솔 뷰에 데이터 출력 (0) | 2024.04.02 |