적 개체가 자동(랜덤)으로 움직일 수 있게 구현했지만 절벽이 있을 경우 감지하고 움직임을 멈출 수 있도록 구현했다.
방법은 위와 같이 cyan색의 ray를 진행방향 쪽으로 생성하고 본 오브젝트(적 개체)가 지면에 닿아 있을 때(점프 상황을 고려) ray에 지면이 감지되지 않으면 vector.x의 값을 0으로 설정했다.
RaycastHit2D cliffCheck = Physics2D.Raycast(new Vector2(gameObject.transform.position.x + (cliffCheckStartSpot * face),
gameObject.transform.position.y), Vector2.down, cliffCheckDistance, LayerMask.GetMask("groundMask"));
Debug.DrawRay(new Vector2(gameObject.transform.position.x + (cliffCheckStartSpot * face), gameObject.transform.position.y),
Vector2.down * cliffCheckDistance, Color.cyan);//위에서 그려진 ray를 가시화. 색은 Green.
예외상황
위와 같이 경사로가 있을 경우 경사로를 올라갈 때는 문제가 없지만 내려갈 때는 ray에 지면이 감지 되지 않는 현상이 발생한다.
ray의 distance를 길게 늘어뜨리면 일시적으로 해결가능하지만 앞으로 경사로마다 각도도 달라질 것이며 공중에 떠 있는 지형을 더 생성할 경우 문제가 생길 것으로 예상되었다.
따라서 경사면과 접촉할 경우 ray의 시작점이 경사면의 각도와 동일한 각도로 1만큼 이동한 지점으로 설정되게 유도하도록 했다.
경사면에 접촉했을 때 변경될 ray의 위치
Ray의 시작점 좌표를 옮기는데는 다음 링크에서 힌트를 얻었다.
여기서 육십분법(Dgree)을 호도법(Radian)으로 변경해야한다는 문제점이 있었는데
[unity] 유니티 삼각함수에 대해 알아보자 (sin, cos)
유니티 Mathf함수 안에 Mathf.Deg2Rad을 이용하여 해결할 수 있었다.
이때 상승, 하강할 경우 y의 값도 변경되어야 했다. 이유는 y값이 고정일 경우 하강할 때 ray는 여전히 상승할때의 위치값과 동일하여 아무것도 감지할 수 없게 되기 때문이었다.