unity에서 오브젝트가 땅에 닿았는지 확인하는 방법들.
캐릭터의 밑부분에서 직선(레이)을 아래쪽으로 발사하여, 레이와 땅의 콜라이더가 교차하는지 확인
RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, distance);
if (hit.collider != null && hit.collider.CompareTag("Ground"))
{
// 캐릭터가 땅에 닿았을때
}
캐릭터와 땅이 서로 충돌할 때, OnCollisionEnter 또는 OnCollisionEnter2D 메서드를 사용하여 충돌을 감지.
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
// 캐릭터가 땅에 닿았을때
}
}
캐릭터 또는 땅의 콜라이더를 트리거로 설정하면 물리적 충돌 없이 접촉을 감지할 수 있다.
접촉이 감지되면 OnTriggerEnter 또는 OnTriggerEnter2D 메서드가 호출.
void OnTriggerEnter2D(Collider2D collider)
{
if (collider.gameObject.CompareTag("Ground"))
{
// 캐릭터가 땅에 닿았을때
}
}
캐릭터의 발 아래에 작은 Collider나 Collider2D를 추가하여 오브젝트를 사용하여 땅과의 접촉을 감지하는 방법.
바닥 체크용 오브젝트 생성
캐릭터의 하위 오브젝트로 빈 오브젝트를 만들고 캐릭터의 발 아래로 위치시킨다.
해당 위치는 바닥과의 접촉을 확인하려는 지점을 기준으로 한다.
콜라이더 추가
체크용 오브젝트에 Circle Collider 또는 Box Collider 를 추가하고, "Is Trigger" 옵션을 활성화.
레이어 설정
바닥 오브젝트들을 특정 레이어(Ex: "Platform")에 배치한다.
체크용 오브젝트를 다른 레이어(Ex: "Player")에 배치하여 바닥과 캐릭터 사이의 상호작용만 감지하도록 설정.
스크립트
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);
// 개발자가 확인하기 위한 선을 그려준다.
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...");
}