Unity/기타 - 개발

[농사 게임] Crop 위치 오류 해결

SiJun-Park 2024. 11. 17. 05:07

 

    private void OnTriggerStay(Collider other)
    {
        _GroundPos = other.transform;
        UpdatePos();
    }

현재 Crop 위치를 잡기 위해 Area를 켰을 시, 어디에 설치 되는지 미리 볼 수 있었습니다.

 

그런데 위 코드 처럼 해두면 모든 Collider를 추적해서 위치를 업데이트 해주니깐

 

심는 땅과 일반 바닥이랑 반복적으로 이동을 하는 버그가 있었습니다.

 

그래서 이 문제를 해결하기 위해 가장 먼저 생각을 한것은 "우선순위" 주어주기 입니다.

 

즉 우선순위를 줘서 우선순위가 높은 Collider가 이미 포지션을 업데이트하고 있으면 그 우선순위보다 낮은 Collider들은 무시하는 방식으로 하였습니다.

 

public enum Tile
{
    None,
    Ground,
    Farm,
    Crops
}

 

그래서 가장먼저 None < Ground < Farm < Crops 순으로 우선순위를 주었습니다 (우측이 가장 우선순위가 높음)

private Tile _currentTile = Tile.None;

 

가장 처음은 Tile을 None으로 해줍니다.

 

    private void OnTriggerExit(Collider other)
    {
        if (Check(other)) { 
            _list.Remove(other.gameObject);
            UpdateState();
            _currentTile = Tile.None;

        }
    }

또한 해당 트리거 범위를 벗어나면 Tile을 None으로 설정 해줍니다. 

이렇게 하는 이유는 트리거 범위를 벗어났을 시 새롭게 잡아줘야 하기 떄문입니다.

 

    private void OnTriggerStay(Collider other)
    {

        // 우선순위는 위부터 높음
        switch (other.tag)
        {
            case "Crops":
                _currentTile = Tile.Crops;
                _body.material = _NO;
                buildingcheck = false;
                break;
            case "Farm":
                if(_currentTile != Tile.Crops)
                {
                    _GroundPos = other.transform;
                    _currentTile = Tile.Farm;

                }
                break;
            case "Untagged":
                if(_currentTile == Tile.None)
                {
                    _GroundPos = other.transform;
                }
                break;

               
        }
        UpdatePos();

    }

 

가장 높은 우선순위를 가지는 Crops와 만나게 되면 현재 타일을 Crops로 설정해주고

설치가 불가능한 지역이니 No라는 Material을 입혀주어 빨간색으로 표시되게 합니다.

 

이때 포지션을 업데이트를 하지 않는데 그 이유는 Crops까지 포지션을 업데이트 해주면 현재 AreaControl.cs에 의해서 Collider를 생성하였기 때문에 그 범위만큼 공중에 뜨게 됩니다.

 

이것을 방지하기 위해서 포지션을 업데이트를 해주지 않습니다.

 

그 다음 우선순위인 Farm을 보면 현재 Crops가 아니라면 즉 Crops에서 생성한 Collider의 범위에 있지 않다면

현재 Farm 위치로 포지션을 잡아주고 타일을 Farm으로 바꾸어줍니다.

 

마지막으로 다 아니고 타일이 None이라면 아무것도 존재하지 않는 것이니 가장 밑 바닥의 위치를 잡아

포지션으로 업데이트 해줍니다.

 

 

결과