최대 1 분 소요

이 글은 유튜브 Sebastian Graves Create Dark Souls를 보고 따라 만들면서 헷갈리는 부분을 정리한 글입니다.

추가 기능 설명

카메라가 벽 같은 곳을 통과하지 않도록 하는 기능

Scripts

CameraHandler에 추가된 부분


CameraHandler ```c# public void FollowTarget(float delta) { // 카메라가 플레이어를 부드럽게 추적함 Vector3 targetPosition = Vector3.SmoothDamp (myTransform.position, targetTransform.position, ref cameraFollowVelocity, delta / followSpeed); myTransform.position = targetPosition; HandleCameraCollisions(delta); } private void HandleCameraCollisions(float delta) { targetPosition = defaultPosition; RaycastHit hit; Vector3 direction = cameraTransform.position - cameraPivotTransform.position; direction.Normalize(); if (Physics.SphereCast(cameraPivotTransform.position, cameraSphereRadius, direction, out hit, Mathf.Abs(targetPosition) , ignoreLayers)) { float dis = Vector3.Distance(cameraPivotTransform.position, hit.point); targetPosition = -(dis - cameraCollisionOffset); } if (Mathf.Abs(targetPosition) < minimumCollisionOffset) { targetPosition = -minimumCollisionOffset; } cameraTransformPosition.z = Mathf.Lerp(cameraTransform.localPosition.z, targetPosition, delta / 0.2f); cameraTransform.localPosition = cameraTransformPosition; } ```

구현 원리 설명


큰 틀로보면 카메라 피벗과 카메라 사이에 물체를 검사한다.
그 사이에 물체가 있으면 물체의 위치로 카메라가 이동된다. image

좀 더 세부적인 것은 다음과 같다.

  • Raycast 가 아닌 SphereCast이기 때문에 감지가 단순히 둘 사이를
    단순한 직선으로 이어서 선과 무엇이 닿는지를 검사하는게 아닌

    구 크기의 두께로 검사한다.

image


  • 어느정도의 Offset값이 있어서 위치가 어느정도 조정된다.
    벽에 닿을 때 벽과의 Offset과 플레이어와 카메라의 Offset이 있다.

image


결과

ezgif com-optimize

배운점

  • Raucast외에는 따로 다른 것들이 존재하는지 몰랐으나 이번으로
    box, Sphere등의 다른 레이캐스트도 존재함을 알았다.

댓글남기기