오류수정2

This commit is contained in:
2026-09-01 21:44:35 +09:00
parent 527dc54218
commit 787ee66ba2
2 changed files with 19 additions and 8 deletions

View File

@@ -14,6 +14,11 @@
/// 캐릭터보다 카메라 가까이, 캐릭터보다 먼저(Queue Geometry-100) 그리면 /// 캐릭터보다 카메라 가까이, 캐릭터보다 먼저(Queue Geometry-100) 그리면
/// 그 뒤의 캐릭터 픽셀이 깊이 테스트에서 탈락한다. 알파를 0 으로 덮는 방법과 달리 /// 그 뒤의 캐릭터 픽셀이 깊이 테스트에서 탈락한다. 알파를 0 으로 덮는 방법과 달리
/// 같은 자리에 그려진 다른 것(채팅창 등)을 건드리지 않는다. /// 같은 자리에 그려진 다른 것(채팅창 등)을 건드리지 않는다.
///
/// 사각형은 카메라 근평면 바로 앞에 둔다. 캐릭터 근처에 두면 무릎이나 코처럼
/// 튀어나온 부위가 사각형보다 앞에 놓여 일부만 가려지고, 그걸 피하려고 포즈마다
/// 깊이를 다시 재는 것은 낭비다. 원근 보정 덕분에 깊이를 당겨도 가려지는 화면 넓이는
/// 그대로이므로, 그냥 최대한 앞에 두면 어떤 포즈든 한 번에 해결된다.
/// </summary> /// </summary>
[DefaultExecutionOrder(100)] // WindowClimber(LateUpdate) 가 위치를 정한 뒤에 따라간다 [DefaultExecutionOrder(100)] // WindowClimber(LateUpdate) 가 위치를 정한 뒤에 따라간다
public class PlatformOccluder : MonoBehaviour public class PlatformOccluder : MonoBehaviour
@@ -26,10 +31,19 @@ public class PlatformOccluder : MonoBehaviour
"직접 참조해야 빌드에서 셰이더가 빠지지 않는다")] "직접 참조해야 빌드에서 셰이더가 빠지지 않는다")]
[SerializeField] Shader occluderShader; [SerializeField] Shader occluderShader;
[Header("동작")] [Header("깊이")]
[Tooltip("캐릭터보다 카메라 쪽으로 얼마나 앞에 둘지(월드 단위). " + // 사각형을 카메라 근평면 바로 앞에 둔다. 그러면 캐릭터의 어느 부위도 그보다
"너무 작으면 깊이 정밀도 문제로 지글거리고, 너무 크면 다른 것까지 가린다")] // 앞에 올 수 없으므로 포즈가 무엇이든 항상 전부 가려진다.
[SerializeField] float depthBias = 0.05f; //
// 깊이를 바꿔도 가려지는 화면 영역은 그대로다 — ScreenToWorldPoint 가 원근을
// 보정하기 때문에, 깊이가 얕아지면 사각형이 작아지는 대신 화면에서 차지하는
// 넓이는 같다. 그래서 "최대한 앞"이 손해 없이 가장 안전한 선택이다.
//
// 3D 씬에 캐릭터 말고는 가릴 것이 없고, 채팅창과 포즈 메뉴는 ScreenSpaceOverlay
// 캔버스라 깊이 테스트를 거치지 않는다. 잘못 가릴 대상이 없다.
[Tooltip("카메라 근평면에서 얼마나 띄울지(월드 단위). " +
"근평면보다 앞에 두면 사각형이 잘려나가 아무것도 못 가리므로 0 보다 커야 한다")]
[SerializeField] float nearPlaneOffset = 0.01f;
[Tooltip("발판 위쪽 경계를 얼마나 내릴지(픽셀). 양수면 발판선보다 아래부터 가린다. " + [Tooltip("발판 위쪽 경계를 얼마나 내릴지(픽셀). 양수면 발판선보다 아래부터 가린다. " +
"머리가 살짝 더 보이게 하고 싶을 때 조절한다")] "머리가 살짝 더 보이게 하고 싶을 때 조절한다")]
@@ -83,8 +97,7 @@ void LateUpdate()
/// <summary>발판의 X 범위 × (발판선 아래 ~ 화면 아래)를 덮는 사각형으로 갱신한다.</summary> /// <summary>발판의 X 범위 × (발판선 아래 ~ 화면 아래)를 덮는 사각형으로 갱신한다.</summary>
void UpdateQuad(DesktopPlatform platform) void UpdateQuad(DesktopPlatform platform)
{ {
// 캐릭터와 같은 평면보다 살짝 앞. 여기서 깊이를 써야 캐릭터가 탈락한다. float d = viewCamera.nearClipPlane + Mathf.Max(0.001f, nearPlaneOffset);
float d = Mathf.Max(0.01f, climber.CharacterDepth - depthBias);
float top = platform.Y - topOffset; float top = platform.Y - topOffset;
corners[0] = viewCamera.ScreenToWorldPoint(new Vector3(platform.XMin, 0f, d)); corners[0] = viewCamera.ScreenToWorldPoint(new Vector3(platform.XMin, 0f, d));

View File

@@ -173,8 +173,6 @@ public bool AutoClimb
/// </summary> /// </summary>
public DesktopPlatform? CurrentPlatform => hasStanding ? standingPlatform : (DesktopPlatform?)null; public DesktopPlatform? CurrentPlatform => hasStanding ? standingPlatform : (DesktopPlatform?)null;
/// <summary>카메라로부터 캐릭터까지의 깊이. 가림 사각형을 같은 평면 근처에 두는 데 쓴다.</summary>
public float CharacterDepth => depth;
// 목표 // 목표
float walkTargetX; float walkTargetX;