2026-07-10 노예계약서 서명 기능
This commit is contained in:
49
Assets/02_Scripts/Interaction/PenTip.cs
Normal file
49
Assets/02_Scripts/Interaction/PenTip.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using UnityEngine;
|
||||
|
||||
// 펜촉. 이 오브젝트의 +Z(파란 축)가 펜촉이 가리키는 방향이 되도록
|
||||
// 펜 프리팹의 촉 끝에 빈 오브젝트로 배치할 것.
|
||||
// 촉이 DrawablePaper에 닿아 있는 동안 매 프레임 잉크를 찍는다.
|
||||
// 펜 자체는 XRGrabInteractable로 잡는다 — 이 스크립트는 잡혔는지 여부와 무관하게
|
||||
// 접촉만 검사하므로, 잡지 않은 펜이 종이에 꽂혀 있으면 그때도 그려진다는 점만 유의.
|
||||
public class PenTip : MonoBehaviour
|
||||
{
|
||||
[Header("Ink")]
|
||||
[SerializeField] private Color _inkColor = new Color(0.08f, 0.08f, 0.1f, 1f); // 순검정보다 자연스러운 잉크색
|
||||
[Tooltip("선 굵기 — 종이 가로 대비 지름 비율 (0.015 = 1.5%)")]
|
||||
[SerializeField, Range(0.003f, 0.1f)] private float _brushSize = 0.015f;
|
||||
|
||||
[Header("Contact")]
|
||||
[Tooltip("펜촉 끝에서 이 거리 안에 종이가 있으면 접촉으로 판정")]
|
||||
[SerializeField] private float _contactDistance = 0.01f;
|
||||
[SerializeField] private LayerMask _paperMask = ~0;
|
||||
|
||||
// 펜촉이 종이를 살짝 뚫고 들어가도 인식되도록 촉 뒤쪽에서부터 레이를 쏜다
|
||||
private const float CastBack = 0.03f;
|
||||
|
||||
private DrawablePaper _currentPaper;
|
||||
private Vector2 _lastUv;
|
||||
|
||||
private void Update()
|
||||
{
|
||||
Vector3 origin = transform.position - transform.forward * CastBack;
|
||||
if (Physics.Raycast(origin, transform.forward, out var hit, CastBack + _contactDistance, _paperMask, QueryTriggerInteraction.Ignore))
|
||||
{
|
||||
var paper = hit.collider.GetComponentInParent<DrawablePaper>();
|
||||
if (paper != null)
|
||||
{
|
||||
Vector2 uv = hit.textureCoord; // MeshCollider 필수
|
||||
|
||||
if (paper == _currentPaper)
|
||||
paper.DrawStroke(_lastUv, uv, _inkColor, _brushSize); // 이어 그리기
|
||||
else
|
||||
paper.StampAt(uv, _inkColor, _brushSize); // 새 접촉 — 점 하나
|
||||
|
||||
_currentPaper = paper;
|
||||
_lastUv = uv;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_currentPaper = null; // 접촉 끊김 — 다음에 닿으면 새 선 시작
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user