창 올라타기

This commit is contained in:
2026-08-26 11:01:56 +09:00
parent 65024110df
commit cab0d772b1
18 changed files with 1335 additions and 31 deletions

View File

@@ -39,9 +39,12 @@ public class ClickThroughHitTest : MonoBehaviour
[Header("검증용")]
[SerializeField] bool showDebugHud = true;
[Tooltip("커서가 캐릭터 위에 있으면 살짝 커지게 해서 히트테스트를 눈으로 확인")]
[Tooltip("커서가 캐릭터 위에 있을 때 미세하게 커지는 반응. 과하면 화면 제한 계산에도 영향을 준다")]
[SerializeField] bool visualizeHover = true;
[SerializeField] float hoverScale = 1.15f;
[Tooltip("호버 시 확대 배율. 1.03 정도가 자연스럽다. 값이 크면 드래그 시 화면 가장자리까지 못 간다")]
[Range(1f, 1.2f)]
[SerializeField] float hoverScale = 1.03f;
#pragma warning restore 0414
@@ -53,6 +56,15 @@ public class ClickThroughHitTest : MonoBehaviour
/// <summary>현재 OS 커서가 캐릭터 위에 있는지.</summary>
public bool IsOverCharacter { get; private set; }
/// <summary>
/// true 인 동안 커서 위치와 무관하게 클릭을 받는다.
///
/// 드래그 중에는 커서가 캐릭터를 벗어나기 마련인데, 그때 클릭 통과가 다시 켜지면
/// 마우스 입력이 뒤 창으로 새면서 드래그가 끊긴다. 드래그 같은 연속 조작은
/// 이 스위치로 히트테스트를 잠시 무력화한다.
/// </summary>
public bool ForceInteractive { get; set; }
int clickCount;
uint currentExStyle;
string lastAction = "-";
@@ -83,8 +95,14 @@ void Update()
PollNoActivateToggle();
IsOverCharacter = HitTest(out var hit);
SetClickThrough(!IsOverCharacter);
UpdateHoverVisual(IsOverCharacter ? hit.transform : null);
SetClickThrough(!IsOverCharacter && !ForceInteractive);
// 드래그 중에는 커서가 캐릭터를 벗어나도 호버 표시를 유지한다.
// 화면 끝까지 끌면 캐릭터는 제한에 걸려 멈추고 커서만 더 나가는데,
// 그때 크기가 원래대로 돌아가면 손에서 놓친 것처럼 보인다.
Transform hoverTarget = IsOverCharacter ? hit.transform
: (ForceInteractive ? hovered : null);
UpdateHoverVisual(hoverTarget);
var mouse = Mouse.current;
if (IsOverCharacter && mouse != null && mouse.leftButton.wasPressedThisFrame)