You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.5 KiB
C#
90 lines
2.5 KiB
C#
using UnityEngine;
|
|
|
|
public class LineTouchDetector : MonoBehaviour
|
|
{
|
|
public LineRenderer lineRenderer;
|
|
public float touchRadius = 0.5f; // Max distance to detect a touch
|
|
|
|
private ScrollingLineRenderer scrollingLineRenderer;
|
|
|
|
private void Start()
|
|
{
|
|
scrollingLineRenderer = GetComponentInParent<ScrollingLineRenderer>();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
DetectTouchOrClick();
|
|
}
|
|
|
|
private void DetectTouchOrClick()
|
|
{
|
|
Vector3 touchPos;
|
|
bool touched = false;
|
|
|
|
// Detect touch on mobile
|
|
if (Input.touchCount > 0)
|
|
{
|
|
Touch touch = Input.GetTouch(0);
|
|
touchPos = touch.position;
|
|
touched = true;
|
|
}
|
|
// Detect mouse click on PC
|
|
else if (Input.GetMouseButtonDown(0))
|
|
{
|
|
touchPos = Input.mousePosition;
|
|
touched = true;
|
|
}
|
|
else
|
|
{
|
|
return; // No input detected
|
|
}
|
|
|
|
// Convert screen position to world position
|
|
Ray ray = Camera.main.ScreenPointToRay(touchPos);
|
|
if (Physics.Raycast(ray, out RaycastHit hit, 100f))
|
|
{
|
|
// Check if the touch is close to the LineRenderer
|
|
if (IsTouchNearLine(hit.point))
|
|
{
|
|
Debug.Log("[LineTouchDetector] Line touched! Sending decision to server...");
|
|
scrollingLineRenderer.SendDecisionToServer();
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool IsTouchNearLine(Vector3 touchPoint)
|
|
{
|
|
float minDistance = float.MaxValue;
|
|
Vector3[] positions = new Vector3[lineRenderer.positionCount];
|
|
lineRenderer.GetPositions(positions);
|
|
|
|
for (int i = 0; i < positions.Length - 1; i++)
|
|
{
|
|
float dist = DistanceFromPointToLineSegment(touchPoint, positions[i], positions[i + 1]);
|
|
if (dist < minDistance)
|
|
{
|
|
minDistance = dist;
|
|
}
|
|
}
|
|
|
|
return minDistance <= touchRadius;
|
|
}
|
|
|
|
private float DistanceFromPointToLineSegment(Vector3 point, Vector3 lineStart, Vector3 lineEnd)
|
|
{
|
|
Vector3 closestPoint = ClosestPointOnLineSegment(point, lineStart, lineEnd);
|
|
return Vector3.Distance(point, closestPoint);
|
|
}
|
|
|
|
private Vector3 ClosestPointOnLineSegment(Vector3 point, Vector3 a, Vector3 b)
|
|
{
|
|
Vector3 ap = point - a;
|
|
Vector3 ab = b - a;
|
|
float ab2 = ab.sqrMagnitude;
|
|
float ap_ab = Vector3.Dot(ap, ab);
|
|
float t = Mathf.Clamp01(ap_ab / ab2);
|
|
return a + ab * t;
|
|
}
|
|
}
|