01 Rigidbody 컴포넌트
✅ 물리와 관련된 컴포넌트
- 2D : Component - Physics 2D
- 3D : Component - Physics
✅ Rigidbody2D 컴포넌트
- 2차원 공간에서 오브젝트의 물리와 중력을 담당하는 컴포넌트
- 다른 오브젝트와의 상호작용이 필요한 경우 충돌범위를 나타내는 Collider2D 컴포넌트가 필요함
Rigidbody 2D만 추가하고 실행한 결과 중력으로 아래로 떨어져 사라진 것을 볼 수 있었다.
02 Collider 2D 컴포넌트
- 2차원 공간에서 오브젝트의 충돌 범위를 나타내는 컴포넌트
- 충돌 범위의 생김사나 특징에 따라 "OO Collider 2D"와 같이 이름을 명명함
- Box Collider 2D
- Circle Collider 2D
- Edge Collider 2D
- Polygon Collider 2D
- Capsule Collider2D
- Composite Collider 2D
✅ Box Collider 2D : 사각형 범위의 충돌 범위
- Offset : 충돌 범위 중심점
- Size : 충돌 범위 크기
위와 같이 충돌 범위를 설정해주었다. 이때, 충돌범위가 꼭 오브젝트와 동일하게 설정되지 않아도 된다.
✅ Circle Collider 2D : 원 범위의 충돌 범위로, 연산 속도가 가장 빠름
- Offset : 충돌 범위 중심점
- Radius : 충돌 범위 반지름 크기
✅ Edge Collider 2D : 점의 개수, 각 점의 위치를 설정할 수 있기 때문에 다양한 곡선 형태로 충돌 범위 표현 가능
- 주로 2D 게임의 바닥 충돌에 사용
- Offset : 충돌 범위 중심점
- Edge Radius : 충돌 선의 두깨
- Points : 선을 이루는 점의 개수와 각 점의 위치
▶ 충돌 범위를 점을 사용하여 다양하게 표현할 수 있다.
✅ Polygon Collider 2D : 텍스처의 모양과 비슷한 형태로 충돌 범위 생성
- Edge와 마찬가지로 Points 수정 가능
- Offset : 충돌 범위 중심점
- Points : 선을 이루는 점의 개수와 각 점의 위치
✅ Capsule Collider 2D : 캡슐 모양의 충돌 범위 생성
- 사람 형태의 캐릭터에 주로 사용
- Offset : 충돌 범위 중심점
- Size : 충돌 범위 크기
- Direction : 둥근 캡슈링 표현되는 방향 (Vertical : 위/아래, Horizontal : 좌/우)
✅ Composite Collider 2D : 다른 게임 오브젝트의 Collider 2D 들을 하나로 묶어주는 역할
- Box Collider 2D, Polygon Collider 2D만 가능
📌 Composite Collidr 2D 사용법
1. 빈 게임 오브젝트 생성
2. 생성한 게임 오브젝트에 Composite Collider 2D 컴포넌트 추가 → Rigidbody2D 컴포넌트가 함께 추가됨
3. 하나로 묶고 싶은 Collider 2D 컴포넌트를 가지고 있는 게임 오브젝트들을 Composite Collider 2D 컴포넌트를 가지고 있는 게임 오브젝트의 자신 오브젝트로 설정
4. 자식 오브젝트들의 Collider 2D 컴포넌트에 있는 "Used By Composite" 변수 활성화
자식 오브젝트의 컴포넌트들에 대해 'Used By Composite' 변수를 활성화 시켜주어야 한다.
그럼 위와 같이 충돌 범위가 엮어서 표현되는 것을 확인할 수 있다.
03 게임 오브젝트 충돌 처리
✅ 서로 다른 두 오브젝트가 충돌하기 위한 필수 조건
1. 두 오브젝트 모두 충돌 범위인 Collider2D 컴포넌트를 가지고 있어야 한다
2. 둘 중 하나 이상의 오브젝트가 물리 처리를 담당하는 Rigidbody2D 컴포넌트를 가지고 있어야 한다
▶ 위와 같이 설정될 경우 이동은 잘 되지만 장애물과 충돌했을 때 어떤 식으로 처리하라는 내용이 없기 때문에 자꾸 뚫고 지나가려고 하는 것을 확인할 수 있다.
✅ 게임 오브젝트의 컴포넌트에 접근하는 방법
: GetComponent<컴포넌트 이름>();
📌 권장하는 사용 방법
1. 컴포넌트와 동일한 타입의 변수 생성
2. 컴포넌트 정보를 얻어와서 변수에 저장
3. 컴포넌트 정보가 저장된 변수를 사용
💡 Tip
- 현재 방법과 같이 클래스 변수를 생성하고, 컴포넌트 정보를 한번만 저장하면 현재 클래스 내부 어디에서든 rigid2D 변수를 이용해 Rigidbody2D 컴포넌트 정보를 바꾸거나 얻어올 수 있다.
- Rigidbody2D는 오브젝트에 물리를 적용, 처리하는 클래스로 클래스 내부에 이동 관련 함수가 작동하고 있다.
- 단지 이동 방향과 속도를 나타내는 속력(velocity)의 초기 값이 (0, 0)이어서 움직이지 않는 것이다.
- 코드와 같이 기존의 transform.position += .. 이동 코드 대신 Rigidbody2D에 있는 속력 변수만 설정해주면 Rigidbody2D에 의해 이동이 가능하다.
게임 오브젝트의 컴포넌트에 접근할 수 있도록 GetComponent를 활용해서 작성한 코드를 반영하면 위 영상과 같이 앞서 발생했던 충돌 즉, 두 게임 오브젝트 사이의 튕기는 현상이 사라진 것을 볼 수 있다.
💡 Tip
모든 이동의 마지막에는 transform.position += 으로 위치를 변경하게 된다. 다만 Rigidbody2D와 같이 "장애물을 만나게 되면 이동을 하지말고 그대로 멈춰라"와 같이 다양한 물리적 처리가 기반된 이동이 가능할 것이다.
유니티에서 제공하는 물리 처리가 추가된 이동에는 Rigidbody2D, Rigidbody, CharactoerController, NavMeshAgent와 같은 컴포넌트들이 있으며, 우리가 직접 작성하거나 에셋 스토어에서 다른 개발자가 만든 것을 사용할 수도 있다.
04 OnCollision2D() 충돌 이벤트 함수
: 물리적인 충돌이 일어나고, 이벤트 함수가 충돌
- OnCollisionEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출
- OnCollisionStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
- OnCollisionExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
✅ 매개변수 Collision2D collision
: 현재 컴포넌트를 가지고 있는 오브젝트에 부딪힌 오브젝트 정보
📌 SerializeField
- 해당 변수의 바로 윗줄에 작성 (예제로 작성한 코드에서는 private Color color;에 해당하는 것)
- Transform의 position, rotation 변수들과 같이 Inspector View 에서 변수의 옵션을 조절할 수 있게 해준다.
✅ 관련 코드 작성
- OnCollisionEnter2D() : 우리가 설정한 color 변수의 색상으로 오브젝트의 색을 변경using UnityEngine; public class CollisionEvent : MonoBehaviour { [SerializeField] private Color color; private SpriteRenderer spriteRenderer; private void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); } private void OnCollisionEnter2D(Collision2D collision) { spriteRenderer.color = color; } private void OnCollisionsStay2D(Collision2D collision) { Debug.Log(gameObject.name + " : OnCollisionStay2D() 메소드 실행"); } private void OnCollisionExit2D(Collision2D collision) { spriteRenderer.color = Color.white; } }
- OnCollisionExit2D() : 오브젝트의 색상을 하얀색으로 변경
05 OnTrigger2D() 충돌 이벤트 함수
: 물리적인 충돌 없이 이벤트 함수가 호출
- OnTriggerEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출
- OnTriggerStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
- OnTriggerExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
✅ 매개변수 Collision2D collision
: 현재 컴포넌트를 가지고 있는 오브젝트에 부딪힌 오브젝트 정보
📌 예제 설명
using UnityEngine; public class TriggerEvent : MonoBehaviour { [SerializeField] private GameObject moveObject; [SerializeField] private Vector3 moveDirection; private float moveSpeed; private void Awake() { moveSpeed = 5.0f; } private void OnTriggerEnter2D(Collider2D collision) { moveObject.GetComponent<SpriteRenderer>().color = Color.black; } private void OnTriggerStay2D(Collider2D collision) { moveObject.transform.position += moveDirection * moveSpeed * Time.deltaTime; } private void OnTriggerExit2D(Collider2D collision) { moveObject.GetComponent<SpriteRenderer>().color = Color.white; moveObject.transform.position = new Vector3(0, 4, 0); } }
- 내가 소속된 게임 오브젝트의 컴포넌트 정보 : GetComponent<컴포넌트>()
- 내가 아닌 다른 게임 오브젝트의 컴포넌트 정보 : 게임오브젝트.GetComponent<컴포넌트>()
▶ 다른 게임 오브젝트의 정보는 코드와 같이 미리 변수를 만들어서 게임 오브젝트 정보를 저장해두고 사용할 수 있고, 유니티에서 제공하는 함수를 이용해 탐색할 수도 있다.
- LeftTilt 게임 오브젝트의 TriggerEvent 컴포넌트 → MoveDirection 변수 : (-1, 0, 0)
- RightTilt 게임 오브젝트의 TriggerEvent 컴포넌트 → MoveDirection 변수 : (1, 0, 0)
출처 : 따라하면서 배우는 고박사의 유니티 기초(https://inf.run/sgcy)
'Study > Unity' 카테고리의 다른 글
[Unity 2D Basic] Instantiate() 활용 예제 (0) | 2024.04.16 |
---|---|
[Unity 2D Basic] 게임 오브젝트 생성 함수 (0) | 2024.04.16 |
[Unity 2D Basic] 게임 오브젝트 이동 (0) | 2024.04.10 |
[Unity Introduction] 유니티 이벤트 함수 (0) | 2024.04.09 |
[Unity Introduction] 스크립트 개요, 콘솔 뷰에 데이터 출력 (0) | 2024.04.03 |