我希望能夠檢測到寬線上的點擊。我有一個從那里獲取的函式,它設法檢測一個點是否正好在它上面,但我想添加一些容差來檢測對所有渲染線的點擊。
這是我當前的功能,(從那里獲取確定一個點是否在一條線上的其他兩個點之間):
public bool PointIsOnLine(Vector2 currPoint, UILineRenderer line)
{
Vector2 point1 = line.points[0];
Vector2 point2 = line.points[1];
float dxc = currPoint.x - point1.x;
float dyc = currPoint.y - point1.y;
float dxl = point2.x - point1.x;
float dyl = point2.y - point1.y;
float cross = dxc * dyl - dyc * dxl;
if (cross != 0)
return false;
if (Mathf.Abs(dxl) >= Mathf.Abs(dyl))
return dxl > 0 ?
point1.x <= currPoint.x && currPoint.x <= point2.x :
point2.x <= currPoint.x && currPoint.x <= point1.x;
else
return dyl > 0 ?
point1.y <= currPoint.y && currPoint.y <= point2.y :
point2.y <= currPoint.y && currPoint.y <= point1.y;
}
您可以使用訪問線的粗細line.thickness
uj5u.com熱心網友回復:
要檢查一個點是否在一條線段附近,您首先要找到該點在線上的投影:
var dirNorm = (point2 - point1).Normalized;
var t = Vector2.Dot(currPoint - point1, dirNorm );
下一步是鉗位該t
值。如果您有一條線段,則限制應該是[0, Length]
.
var tClamped = Mathf.Clamp(t, 0, (point2 - point1).Length);
然后,您可以將其轉換回一個點
var closestPoint = point1 dirNorm * tClamped;
然后你可以得到距離
var dist = Vector2.Distance(currPoint, closestPoint);
添加檢查以查看距離是否小于某個值,然后您就會得到答案。
請注意,您希望盡可能地將事物保留為向量。除非絕對必要,否則不要使用單個 x/y 值。Unity3D 有相當不錯的矢量函式選擇,使用它們!另請注意,這可能會進行一些優化,但將其劃分為各個函式可能很有用,即一個函式獲取t
-value,一個獲取最近點,另一個獲取距離等。這些函式可能是重復用于其他事情。
uj5u.com熱心網友回復:
感謝@JonasH 的幫助,這是我現在的(作業)解決方案!
public bool PointIsOnLine(Vector3 point, UILineRenderer line)
{
Vector3 point1 = line.points[0];
Vector3 point2 = line.points[1];
var dirNorm = (point2 - point1).normalized;
var t = Vector2.Dot(point - point1, dirNorm);
var tClamped = Mathf.Clamp(t, 0, (point2 - point1).magnitude);
var closestPoint = point1 dirNorm * tClamped;
var dist = Vector2.Distance(point, closestPoint);
if(dist < line.thickness / 2)
{
return true;
}
return false;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/491133.html
上一篇:如何在UnityC#中使用Color32?我試圖找出方法,但它似乎不起作用
下一篇:如何將物體扔到玩家面對的方向?