구현 완료
1. 이동구현
2. 이동 애니메이션
3. 카메라 무빙
4. 대각 이동시 원을 그리게 변경해야함
5. 총기 조작 기능
불안전 요소
1. 카메라 이동 속도가 빠를시 생기는 계단현상
2. 벽넘기가 불안정함
현재 완성까지 필요한 요소
1. 엄폐기능 <- 현재 부분
2. 시네마씬을 이용한 게임 씬 제작
3. 강한 공격 맞을시 뒤로 밀려나기 = 피격 판정
이번에는 엄폐 기능을 만들어 보려 한다
이런 형태의 엄폐 기능을 만들어 보려 한다
현재 생각나는 부분은
이렇게 ray를 플레이어의 Forward방향으로 일정 거리로 발사한 뒤, 이것을 확인해서 엄폐를 실행하게 하려 한다
엄폐물을 감지하는 것이 완료된 이후, 엄폐기능을 완성한다
Ray coverRay = new Ray(transform.position, transform.forward);
LayerMask layerMaskPlayer = ~LayerMask.GetMask("Player");
float _coverRange = 4f;
if (Physics.Raycast(coverRay, out RaycastHit HitTarget, _coverRange, layerMaskPlayer))
{
if (HitTarget.collider.CompareTag("Cover"))
{
Debug.Log("엄폐 가능");
}
}
Debug.DrawRay(transform.position, transform.forward, Color.blue, 0.1f);
Ray를 발사한 뒤, 충돌체를 검사한다
이때 플레이어가 출동할 수 있으니, 제외처리를 해준다(layerMask사용)
그후, 충돌체가 엄폐가능이 확인되면 로그를 보여준다
정상적으로 충돌체를 검사한 뒤, 로그를 보여주는것을 확인할 수 있다
이제 엄폐를 하는것에 대해서 설계를 해야 한다
현재 생각하고 있는것은 충돌한 오브젝트의 로컬 위치에서 특정 위치로 플레이어를 lerp같은 걸로 이동시킨 뒤, 엄폐 변수를 true로 만들고 엄폐 애니메이션을 재생하는 것이다
if (_KeySpace)
{
Vector3 PlayerPos = transform.position + new Vector3 (0f, 1f, 0f);
Ray coverRay = new Ray(PlayerPos, transform.forward);
LayerMask layerMaskPlayer = ~LayerMask.GetMask("Player");
float _coverRange = 4f;
if (Physics.Raycast(coverRay, out RaycastHit HitTarget, _coverRange, layerMaskPlayer))
{
if (HitTarget.collider.CompareTag("Cover"))
{
Debug.Log("엄폐 가능");
StartCoroutine(TakeCover(HitTarget.collider.gameObject.transform));
}
}
}
Debug.DrawRay(transform.position + new Vector3 (0f, 1f, 0f), transform.forward * 4f, Color.blue, 0.5f);
/////////////////////////////////////////////////
private IEnumerator TakeCover(Transform cover)
{
_canMove = false;
Vector3 coverPos = cover.TransformPoint(new Vector3(0f, 0f, -0.5f));
transform.position = Vector3.Lerp(transform.position, coverPos, 0.5f);
Debug.Log("엄폐중");
yield return new WaitForSeconds(2f);
Debug.Log("Cover End");
_canMove = true;
}
현재 space키를 누르면 엄폐물의 로컬좌표를 가져와서 그 위치로 이동하도록 만들었다
다만, 이동을 확인할 수 있을뿐, 정상 작동하지는 않는데 그 이유는
transform.position = Vector3.Lerp(transform.position, coverPos, 0.5f);
현재 lerp로 보간을 실행하고 있는데, 마지막 Float값이 보간값이지만 현재는 0.5이므로, 시작점과 끝점의 중간으로 보정만 하기만 한다
원하는 의도는 지정한 Vector3인 coverPos로 이동하게 하는것이므로, while를 쓰든, for을 사용하든, 반복문으로 끝점까지 이동하도록 보정을 만들어 줘야 한다
private IEnumerator TakeCover(Transform cover)
{
_canMove = false;
Vector3 startPos = transform.position;
Vector3 coverPos = cover.TransformPoint(new Vector3(0f, 0f, -1f));
// 이동 시간 설정
float duration = 0.3f; // 이동에 걸리는 시간 (초)
float elapsedTime = 0f;
while (elapsedTime < duration)
{
transform.position = Vector3.Lerp(startPos, coverPos, elapsedTime / duration);
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = coverPos;
yield return new WaitForSeconds(2f);
Debug.Log("Cover End");
_canMove = true;
}
안쪽에 반복문을 추가하여 자연스럽게 엄폐하도록 조절한다
추가로 현재 x, y축을 0으로 보정하고 있는데, 이를 정상처리 하기 위해서 자신의 원래 위치로 변경한다
혹시나 고저차가 있으면 끼이는 문제가 있을 수 있지만, 지금은 생각하지 않도록 한다
Vector3 startPos = transform.position;
Vector3 coverPos = cover.TransformPoint(new Vector3(0f, 0f, -0.9f));
coverPos.y = transform.position.y;
이렇게 위치를 보정해준다
원래는 이제 여기에 회전을 보정해야 하는데
엄폐물의 회전을 가져와서 적용하면 될 것 같다
transform.rotation = cover.rotation;
이제 보정이 끝났으니 적당한 애니메이션을 연결해주면 된다
적당한 임시 애니메이션을 배정해준 뒤
코드에서 파라미터를 적용해준다
private IEnumerator TakeCover(Transform cover)
{
_isCover = true;
_canMove = false;
Vector3 startPos = transform.position;
Vector3 coverPos = cover.TransformPoint(new Vector3(0f, 0f, -0.9f));
coverPos.y = transform.position.y;
// 이동 시간 설정
float duration = 0.3f; // 이동에 걸리는 시간 (초)
float elapsedTime = 0f;
transform.rotation = cover.rotation;
while (elapsedTime < duration)
{
transform.position = Vector3.Lerp(startPos, coverPos, elapsedTime / duration);
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = coverPos;
yield return new WaitForSeconds(2f);
Debug.Log("Cover End");
_canMove = true;
}
_isCover라는 bool값을 만든뒤, 이 값을 파라미터에 적용해준다
이렇게 될시 엄폐시에는 엄폐 애니메이션을 재생하지만, 탈출을 하지 못한다는 문제가 있다
이를 해결하기 위해서는 if 이동시 or 조준시 라는 조건을 걸어서 애니메이션을 탈출하게 해주면 된다
if (_isCover && (isAiming || (Math.Abs(_horizontal) >= 0.1f) || Math.Abs(_vertical) >= 0.1f))
_isCover = false;
이 if문을 update에서 사용하는걸로 검사한다
정상적으로 엄폐가 되는것을 확인할 수 있다