본문 바로가기

Unity

게임오브젝트 물리와 충돌

반응형

물리 관련 컴포넌트

  • 2D : Component - Physics 2D
  • 3D : Component - Physics

Rigidbody2D 컴포넌트

  • 물리와 중력 담당

RigidBody 적용 시 중력은 바로 적용됨

다른 오브젝트와의 상호작용이 필요한 경우는 Collider 컴포넌트가 필요

Collider2D 컴포넌트

  • 오브젝트의 충돌 범위를 나타냄

Circle Collider 2D가 가장 연산속도가 빠름 

Edge Collider 2D는 점의 개수를 정하고 점의 위치를 바꾸어서 다양한 곡선이나 형태로 표현 가능

  • Edge Radius로 두께 설정가능

Polygon Collider 2D

  • 텍스처 모양과 비슷한 모양으로 생성 -> 연산량이 많아짐

Capsule Collider 2D

  • 보통 사람 형태의 캐릭터에 사용

Composite Collider 2D

  • 다른 게임오브젝트의 Collider 2D 들을 하나로 묶어주는 역할
    • Box , Polygon 만 가능
  • 빈 게임 오브젝트 생성
  • Composite Collider 2D 컴포넌트 추가
  • 하나로 묶고 싶은 Collider 2D 컴포넌트를 가지고 있는 게임 오브젝트들을 Compite Collider 2D 가지고 있는 게임 오브젝트의 자식오브젝트로 설정
  • 자식 오브젝트들의 Collider 2D 컴포넌트에 있는 "Used By Composite" 변수 활성화

 

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

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

두 오브젝트가 Collider를 가지고 충돌 했을 때 별다른 이벤트를 등록하지 않으면 막힌 것에 튕겨져 나오는 것처럼 처리 됨

 

컴포넌트를 가져오는 법

  • GetComponent<컴포넌트> 변수명
  • transform은 모든 오브젝트에 포함되는 컴포넌트이므로 바로 사용가능 했던 것

 

transform += .. 이동 코드는 물리적인 처리가 되지 않고 이동만 신경씀

rigid2D.velocity에 의한 이동으로 처리 시 "장애물 만나게 되면 그대로 정지"와 같은 물리적 처리가 기반된 이동이 가능

-> 오브젝트가 Rigid2D component를 가지고 있어야 함

 

충돌 이벤트 함수

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

 

[SerializeField]

  • 변수 바로 윗줄에 작성
  • Inspector View에서 변수의 옵션 조절할 수 있도록 해줌
  • script file에서  아래와 같이 변수 지정하면 Inspector View Scipt 부분에서 Color 제어 UI가 생성됨
  • [SerializeField]
    private Color color;

 

Sample 

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 OnCollisionExit2D(Collision2D collision)
    {
        spriteRenderer.color = Color.white;
    }
}

 

 

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

  • 접근 시 뚫고 지나갈 수 있음,  영역안에 물체를 넣는 경우 사용
  • OnTriggerEnter2D
    • 두 오브젝트가 충돌하는 순간 1회 호출
  • OnTriggerStay2D
    • 두 오브젝트가 충돌하고 있는 동안 매프레임 호출
  • OnTriggerExit2D
    • 두 오브젝트가 떨어지는 순간 1회 호출

 

Sample

using System.Collections;
using System.Collections.Generic;
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)
    {
        Debug.Log("touch");
        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);
    }

}

※ Trigger 동작하려면 충돌하는 두 물체 Collider 중 하나 이상에 IsTrigger 체크되어있어야 함

반응형

'Unity' 카테고리의 다른 글

Instantiate 활용 예제  (0) 2023.07.23
게임 오브젝트 생성 함수  (0) 2023.07.23
게임 오브젝트 이동  (0) 2023.07.23
이벤트 함수  (0) 2023.07.23
스크립트 개요  (0) 2023.07.23