在 Unity 的游戏中,有多种方法可以将对象捕捉在一起,例如在前文所提到的使用单位比例进行捕捉,那么这里将谈谈在 Unity 中游戏对象足够靠近一个接触点时实现捕捉。
例如在场景中有一个立方体和一块底板,当我拖动立方体靠近底板时,立方体会自动捕捉并对齐到底板上,大概是这么个意思。

那么一般情况下,这涉及到设置捕捉距离浮点的变量值:
public float snapDistance = 1;
通常的流程还需用于检查对象的移动或鼠标输入,这样可以方便检测控制目标的位置,当足够接近捕捉点时将对象捕捉。
那么此时对象的目标位置远离捕捉点,则不在进行捕捉,可以试试以下代码:
public Vector3 targetPosition;
public Vector3 snapPosition;
public float snapDistance = 1;
void Update()
{
transform.position = targetPosition;
if (Vector3.Distance(snapPosition, targetPosition) < snapDistance)
{
transform.position = snapPosition;
}
}
如果你希望在接近游戏对象时捕捉到的任何位置,可以尝试执行以下代码。
class SnapOn {
public Transform[] anchors;
public Transform movable;
public float SnapDistance = 1f;
Update() {
// 首先找到最近的物体,但通过所有物体并保存最短距离
var distance = float.max;
var point = vector3.zero;
foreach(var anchor in anchors)
{
var d = Vector3.Distance(transform.position, anchor.position);
if (d < distance)
{
distance = d;
point = anchor.position;
}
}
// 现在检查是否有任何它应该捕捉到的东西。
if (distance > SnapDistance) // 检测距离,如果很远,保持可移动与可渲染。
{
movable.position = transform.position;
}
else // 位置足够近,可以捕捉。
{
movable.position = point;
}
}
以上代码如果忽略跟踪与渲染对象的移动位置分开。
例如正在捕捉到某个位置的实例,将不太可能在单个帧中将对象移动足够远以允许取消捕捉。
综上所述,靠近接触点的对象捕捉方法仅适用于将对象捕捉到单个或多个已知的接触点上,同样的捕捉方法因类型而有所差异,但似乎使用任何一种方法他们自己都是相似点。