[농사 게임] Crop 위치 오류 해결
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이라면 아무것도 존재하지 않는 것이니 가장 밑 바닥의 위치를 잡아
포지션으로 업데이트 해줍니다.