TIL 250515

강성원·2025년 5월 28일

TIL 경험하고 배운 것

목록 보기
78/84

채집기 출력 부분에 다른 아이템이 있으면 출력되지 않게 하기 위한 기능을 개발했다.

레이어 세팅 기능


  • 월드 아이템이 채집기 밑에 존재하는지 탐지해야해서 레이어 세팅 기능을 간단하게 마련했다.

  • 일단 enum을 유니티의 Layer와 대응하게 작성했다.
    이 방법은 유니티 에디터의 Layer와 순서를 똑같이 해야 개발에서 꼬임이 발생하지 않는 불편함은 있지만, 한 번 작성해놓으면 나중에 사용할 때 용이하다.

public enum Layer
{
    Default = 0,
    TransparentFX = 1,
    IgnoreRaycast = 2,
    Water = 4,
    UI = 5,
    Player = 6,
    WorldItem = 7,
    Conveyor = 8,
}
  • 그리고 이 enum값을 받아서 LayerMask로 반환하는 메서드이다.
public static LayerMask ToLayerMask(Layer layer)
{
    return 1 << (int)layer;
}
  • 아래는 본인부터 자식 오브젝트까지 전부 레이어를 일괄 변경해주는 재귀함수다.
public static void SetLayerRecursively(GameObject go, Layer layerEnum)
{
    SetLayerRecursively(go, ToLayerMask(layerEnum));
}

public static void SetLayerRecursively(GameObject go, int layerInt)
{
    go.layer = layerInt;

    foreach (Transform child in go.transform)
    {
        SetLayerRecursively(child.gameObject, layerInt);
    }
}

레이어 관련 까먹었던 것

처음에는 그냥 정수 1,2,3...31이 레이어와 대응된다고 착각하여서 return (int)layer로 작성했다.
레이어마스크는 1부터 좌측 시프트로 옮긴 값을 식별하는 것이기에 1번은'1', 2번은'10', 3번은'100' 이런 형태를 띈다.
고로 return 1 << (int)layer가 맞는 형태이다.
<까먹지 말자!!!>

채집기 출력 제한


채집기가 아이템을 출력하는 방향(y축으로 -1)에 다른 아이템이 있으면 출력을 하지 않게 했다.

  • 위에서 만든 레이어 유틸 기능과 Physics2D.OverlapBoxAll을 사용해서 WorldItem레이어가 달린 오브젝트가 감지되면 채굴 메서드 호출 안하도록 하였다.
private bool DetectWorldItemPosition()
{
    Vector3 point = transform.position + new Vector3(0, -1f, 0);
    Collider2D[] hits = Physics2D.OverlapBoxAll(point, new Vector2(0.5f, 0.5f), 0f, LayerUtil.ToLayerMask(Layer.WorldItem));
    if (hits.Length != 0)
        return true;

    return false;
}
profile
개발은삼순이발

0개의 댓글