상세 컨텐츠

본문 제목

[유니티 소소모임] 2주차. 유니티 에디터 배우기 1 (Editor: Luna)

24-25/Untiy

by 롱롱😋 2024. 10. 11. 12:32

본문

728x90

 

게임오브젝트 물리와 충돌

Rigidbody2D

: 오브젝트에 물리를 적용하고 중력을 받을 수 있도록 함

  • 중력 ⇒ 별다른 설정 없이 바로 적용, Gravity Scale 값 수정하여 중력 정함
  • 물리력에 의한 이동, 회전, 마찰력 등 다른 오브젝트와의 상호작용이 필요한 경우
    ⇒ 오브젝트의 충돌 범위를 나타내는 Collider2D 컴포넌트가 필요함

Collider2D

: 오브젝트의 충돌 범위를 나타내는 컴포넌트

  • Box Collider2D : 사각형 범위의 충돌 범위
    • Offset : 충돌 범위 중심점
    • Size : 충돌 범위 크기
      + 충돌 범위가 오브젝트보다 크거나 작게 설정 가능
  • Circle Collider2D : 원 범위의 충돌 범위
    ⇒ 중심점과 반지름만 있어도 충돌 계산 가능하여 연산 속도가 가장 빠름
    • Offset : 충돌 범위 중심점
    • Radius : 충돌 범위 반지름 크기
  • Edge Collider2D : 점의 개수, 각 점의 위치를 설정할 수 있어 다양한 곡선 형태로 표현 가능한 충돌 범위 
    • Offset : 충돌 범위 중심점
    • Edge Radius : 충돌 선의 두께
    • Points : 선을 이루는 점의 개수와 각 점의 위치
  • Polygon Collider2D : 텍스처의 모양과 비슷한 형태로 충돌 범위 생성
    ⇒ 세밀한 충돌 가능하나 연산량이 증가하여 Points 정보 수정하며 사용
    • Offset : 충돌 범위 중심점
    • Points : 선을 이루는 점의 개수와 각 점의 위치
  • Capsule Collider2D : 캡슐 모양의 충돌 범위 생성
    ⇒ 사람 형태의 캐릭터에 주로 사용
    • Offset : 충돌 범위 중심점
    • Size : 충돌 범위 크기
    • Direction : 둥근 캡슐이 표현되는 방향
    • Vertical : 위, 아래 / Horizontal : 좌, 우
  • Composite Collider2D : 다른 게임오브젝트의 Collider2D들을 하나로 묶어주는 역할
    ⇒ Box Collider2D, Polygon Collider2D만 가능
    • 충돌 범위 하나로 묶는 방법
      1. 빈 게임오브젝트 생성 후 Composite Collider 2D 컴포넌트 추가
      2. 하나로 묶고 싶은 게임오브젝트들을 Composite Collider 2D 컴포넌트를 가지고 있는 게임오브젝트의 자식 오브젝트로 설정
      3. 자식 오브젝트들의 Collider 2D 컴포넌트에 있는 “Used By Composite” 변수 활성화

 

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

1. 두 오브젝트 모두 충돌 범위인 Collider2D 컴포넌트를 가지고 있어야함
2. 둘 중 하나 이상의 오브젝트가 물리 처리를 담당하는 Rigidbody2D 컴포넌트를 가지고 있어야함

 

Rigidbody2D

  • 이용 방법
    • 컴포넌트와 동일한 타입의 변수 생성
      → 클래스 변수로 생성하여 컴포넌트 정보를 한번만 저장하면 내부 어디에서든 해당 변수를 이용해 정보를 얻어오거나 변경 가능
    • 컴포넌트 정보를 얻어와서 변수에 저장
    • 컴포넌트 정보가 저장된 변수 사용

 

물리적인 충돌 & 이벤트 함수 호출

OnCollisionEnter2D : 두 오브젝트가 충돌하는 순간 1회 호출
OnCollisionStay2D : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
OnCollisionExit2D : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출

 

물리적 충돌 x & 이벤트 함수만 호출
⇒ 충돌없이 지나쳐감

OnTriggerEnter2D : 두 오브젝트가 충돌하는 순간 1회 호출
OnTriggerStay2D : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
OnTriggerExit2D : 두 오브젝트가 떨어져서 출돌이 종료되는 순간 1회 호출

Instantiate() 활용 예제

Instantiate()

: original 게임오브젝트(프리탭)를 복제해서 생성

+ 프리탭 : 오브젝트를 복제 생성하기 위해선 원본이 되는 오브젝트

 

  • 플레이어 위치에서 오브젝트 생성
public class PlayerController : MonoBehaviour
{
    [SerializeField]
    private KeyCode keyCodeFire = KeyCode.Space;
    [SerializeField]
    private GameObject bullePrefab;
    private float moveSpeed = 3.0f;
    private Vector3 lastMoveDirection = Vector3.right;

    void Update()
    {
        // 플레이어 오브젝트 이동
        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");

        transform.position += new Vector3(x, y, 0) * moveSpeed * Time.deltaTime;

        // 마지막에 입력된 방향키의 방향으로 총알의 발사 방향으로 활용
        if (x != 0 || y != 0)
        {
            lastMoveDirection = new Vector3 (x, y, 0);
        }

        // 플레이어 오브젝트 총알 발사
        if (Input.GetKeyDown(keyCodeFire))
        {
            GameObject clone = Instantiate(bullePrefab, transform.position, Quaternion.identity);

            clone.name = "Bullet";
            clone.transform.localScale = Vector3.one * 0.5f;
            clone.GetComponent<SpriteRenderer>().color = Color.red;

            clone.GetComponent<Movement2D>().Setup(lastMoveDirection);
        }
        
    }
}

+ 키보드 Key

  • Input.GetKeyDown(Key) : 키보드의 Key 버튼을 눌렀을 때 1회 호출
  • Input.GetKey(Key) : 키보드의 Key 버튼을 누르고 있는 동안 매 프레임 호출
  • Input.GetKeyUp(Key) : 키보드의 Key 버튼을 눌렀다가 뗄 때 1회 호출

실행 결과

플레이어( 얼굴 ) 이 스페이스바 누르면 총알이 나감

 

 


출처 : 고박사, inflearn, 따라하면서 배우는 고박사의 유니티 기초(2D)

 

Corner Unity

Editor: Luna

728x90

관련글 더보기