feat: 전투 공간 개편 및 카메라·캐릭터 품질 개선
[전투 공간] - 단순 Plane 바닥 → Arena 계층 구조로 교체 (Floor, 벽 4개, Objects) - PolygonDarkFortress 외부 에셋 임포트 (전투 공간 디자인 적용) - 바닥 아래 검은 평면(FloorBase) 추가로 카메라 저각도 시 허공 노출 방지 - NavMesh 리베이크 [카메라] - PlayerCamera에 SphereCast 기반 지형 충돌 감지 추가 - 카메라가 바닥 아래를 비출 때 최소 높이 보장 [캐릭터] - 플레이어 CharacterController skinWidth 정상화 (0.0001 → 0.03) - 보스 NavMeshAgent baseOffset 조정으로 발 파묻힘 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,11 @@ namespace Colosseum.Player
|
||||
[SerializeField] private float minPitch = -30f;
|
||||
[SerializeField] private float maxPitch = 60f;
|
||||
|
||||
[Header("Collision")]
|
||||
[SerializeField] private float collisionRadius = 0.2f;
|
||||
[SerializeField] private LayerMask collisionMask = ~0; // 기본: 모든 레이어
|
||||
[SerializeField] private float minHeightAboveGround = 0.3f; // 바닥 위 최소 카메라 높이
|
||||
|
||||
private Transform target;
|
||||
private float yaw;
|
||||
private float pitch;
|
||||
@@ -104,12 +109,7 @@ namespace Colosseum.Player
|
||||
{
|
||||
if (target == null || cameraInstance == null) return;
|
||||
|
||||
Quaternion rotation = Quaternion.Euler(pitch, yaw, 0f);
|
||||
Vector3 offset = rotation * new Vector3(0f, 0f, -distance);
|
||||
offset.y += height;
|
||||
|
||||
cameraInstance.transform.position = target.position + offset;
|
||||
cameraInstance.transform.LookAt(target.position + Vector3.up * height * 0.5f);
|
||||
UpdateCameraPosition();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -156,8 +156,28 @@ namespace Colosseum.Player
|
||||
Vector3 offset = rotation * new Vector3(0f, 0f, -distance);
|
||||
offset.y += height;
|
||||
|
||||
cameraInstance.transform.position = target.position + offset;
|
||||
cameraInstance.transform.LookAt(target.position + Vector3.up * height * 0.5f);
|
||||
Vector3 pivot = target.position + Vector3.up * height * 0.5f;
|
||||
Vector3 desiredPos = target.position + offset;
|
||||
|
||||
// pivot → desiredPos 방향으로 SphereCast해서 지형 충돌 감지
|
||||
Vector3 dir = desiredPos - pivot;
|
||||
float maxDist = dir.magnitude;
|
||||
if (Physics.SphereCast(pivot, collisionRadius, dir.normalized, out RaycastHit hit, maxDist, collisionMask, QueryTriggerInteraction.Ignore))
|
||||
{
|
||||
// 충돌 지점에서 collisionRadius만큼 pivot 쪽으로 당김
|
||||
desiredPos = hit.point + dir.normalized * collisionRadius;
|
||||
}
|
||||
|
||||
// 카메라 아래에 지면이 너무 가까우면 위로 밀어올려 바닥 아래면이 보이지 않게 함
|
||||
if (Physics.Raycast(desiredPos, Vector3.down, out RaycastHit groundHit, minHeightAboveGround + 1f, collisionMask, QueryTriggerInteraction.Ignore))
|
||||
{
|
||||
float groundY = groundHit.point.y + minHeightAboveGround;
|
||||
if (desiredPos.y < groundY)
|
||||
desiredPos.y = groundY;
|
||||
}
|
||||
|
||||
cameraInstance.transform.position = desiredPos;
|
||||
cameraInstance.transform.LookAt(pivot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user