채집기 출력 부분에 다른 아이템이 있으면 출력되지 않게 하기 위한 기능을 개발했다.
월드 아이템이 채집기 밑에 존재하는지 탐지해야해서 레이어 세팅 기능을 간단하게 마련했다.
일단 enum을 유니티의 Layer와 대응하게 작성했다.
이 방법은 유니티 에디터의 Layer와 순서를 똑같이 해야 개발에서 꼬임이 발생하지 않는 불편함은 있지만, 한 번 작성해놓으면 나중에 사용할 때 용이하다.
public enum Layer
{
Default = 0,
TransparentFX = 1,
IgnoreRaycast = 2,
Water = 4,
UI = 5,
Player = 6,
WorldItem = 7,
Conveyor = 8,
}
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)에 다른 아이템이 있으면 출력을 하지 않게 했다.
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;
}