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(); 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; // 접촉 끊김 — 다음에 닿으면 새 선 시작 } }