Unity CheckLanding

현동·2023년 9월 21일

Unity

목록 보기
6/6

unity에서 오브젝트가 땅에 닿았는지 확인하는 방법들.

1. 레이캐스팅(Raycasting)

캐릭터의 밑부분에서 직선(레이)을 아래쪽으로 발사하여, 레이와 땅의 콜라이더가 교차하는지 확인

RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, distance);
if (hit.collider != null && hit.collider.CompareTag("Ground"))
{
    // 캐릭터가 땅에 닿았을때
}

2. 충돌검사(OnCollisionEnter)

캐릭터와 땅이 서로 충돌할 때, OnCollisionEnter 또는 OnCollisionEnter2D 메서드를 사용하여 충돌을 감지.

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        // 캐릭터가 땅에 닿았을때
    }
}

3. 트리거 검사

캐릭터 또는 땅의 콜라이더를 트리거로 설정하면 물리적 충돌 없이 접촉을 감지할 수 있다.
접촉이 감지되면 OnTriggerEnter 또는 OnTriggerEnter2D 메서드가 호출.

void OnTriggerEnter2D(Collider2D collider)
{
    if (collider.gameObject.CompareTag("Ground"))
    {
        // 캐릭터가 땅에 닿았을때
    }
}

4. 바닥 체크용 오브젝트

캐릭터의 발 아래에 작은 Collider나 Collider2D를 추가하여 오브젝트를 사용하여 땅과의 접촉을 감지하는 방법.

  1. 바닥 체크용 오브젝트 생성
    캐릭터의 하위 오브젝트로 빈 오브젝트를 만들고 캐릭터의 발 아래로 위치시킨다.
    해당 위치는 바닥과의 접촉을 확인하려는 지점을 기준으로 한다.

  2. 콜라이더 추가
    체크용 오브젝트에 Circle Collider 또는 Box Collider 를 추가하고, "Is Trigger" 옵션을 활성화.

  3. 레이어 설정
    바닥 오브젝트들을 특정 레이어(Ex: "Platform")에 배치한다.
    체크용 오브젝트를 다른 레이어(Ex: "Player")에 배치하여 바닥과 캐릭터 사이의 상호작용만 감지하도록 설정.

  4. 스크립트

public class Player : MonoBehaviour
{
	public Transform groundChecker;
    public float checkRadius = 0.5f;
    public LayerMask groundLayer;
    private bool isGrounded;

    void Start()
    {
    	// groundChecker에 오브젝트 할당
        groundChecker = transform.Find("GroundCheck");
        // LayerMask 할당
        int layerIndex = LayerMask.NameToLayer("Platform");
        groundLayer = 1 << layerIndex;
    }

    void Update()
    {
        isGrounded = Physics2D.OverlapCircle(groundChecker.position, checkRadius, groundLayer);

        if (isGrounded)
        {
            Debug.Log("Character Landing...");
        }
    }
}

groundChecker와 groundLayer는 public으로 선언해 Unity의 Inspector창에서 직접 오브젝트를 넣어 할당할 수 있다.

여러 레이어를 포함하여 할당

int groundLayerIndex = LayerMask.NameToLayer("Ground");
int platformLayerIndex = LayerMask.NameToLayer("Platform");

groundLayer = (1 << groundLayerIndex) | (1 << platformLayerIndex);

5. 레이어 마스크 사용

  1. 바닥 오브젝트들을 특정 레이어(Ex: "Platform")에 배치한다.
		// 개발자가 확인하기 위한 선을 그려준다.
        Debug.DrawRay(_rigid2d.position, Vector2.down * 1, new Color(0, 1, 0));
        // 레이캐스트로 LayerName이 "Platform"인 것만 검사
        RaycastHit2D rayHit = Physics2D.Raycast(_rigid2d.position, Vector2.down, 1, LayerMask.GetMask("Platform"));
        if (rayHit.collider != null && rayHit.distance < 0.5f)
        {
        	Debug.Log("Character Landing...");
        }

0개의 댓글