Files

50 lines
2.2 KiB
C#

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