C#写的一个简单的自动贴合脚本,可以实现物体移动后,将物体放回原位的功能。
前言
本文采用标志位进行物体位置判断,设置自动贴合距离。两物体处于自动贴合距离内时,根据物体标志位的三维坐标和欧拉角,进行平移和旋转操作,实现贴合操作。
一、设置物体标志位
Target:绘制一个蓝色四边形,表示贴合平面位置;一条红色射线,表示贴合平面的欧拉角。
在需要自动贴合的两物体下创建空物体,命名为Target,并将标志位脚本挂载在空物体上。
Vector2 halfSize = Size * 0.5f; Gizmos.color = Color.red; float lineLength = Mathf.Min(Size.x, Size.y); Gizmos.DrawLine(transform.position, transform.position + transform.forward * lineLength); Gizmos.color = Color.blue; Vector3 topLeft = transform.position - (transform.right * halfSize.x) + (transform.up * Size.y) / 2; Vector3 topRight = transform.position + (transform.right * halfSize.x) + (transform.up * Size.y) / 2; Vector3 bottomLeft = transform.position - (transform.right * halfSize.x) - (transform.up * Size.y) / 2; Vector3 bottomRight = transform.position + (transform.right * halfSize.x) - (transform.up * Size.y) / 2; Gizmos.DrawLine(topLeft, topRight); Gizmos.DrawLine(topRight, bottomRight); Gizmos.DrawLine(bottomRight, bottomLeft); Gizmos.DrawLine(bottomLeft, topLeft);
二、自动贴合操作
1.贴合操作脚本
设置两个Transform变量接收两物体的位置信息
Transform m_door;
Transform T_door;
void Start()
{
m_door = this.transform.Find("Target");
if (m_door == null)
{
Debug.LogError("本地对象未找到位置标志");
}
T_door = m_Target.Find("Target");
if (T_door == null)
{
Debug.LogError("目标对象未找到位置标志");
}
}
判断两物体的位置是否小于设置距离
public bool IsClose()
{
if (m_door != null && T_door != null)
{
if (Vector3.Distance(m_door.position, T_door.position) <= Distance)
{
return true;
}
}
return false;
}
贴合物体计算移动距离,进行位置移动,移动脚本挂载的父物体(模型)
public void MoveTo()
{
Vector3 moveVector = T_door.position - m_door.position;
m_door.parent.Translate(moveVector, Space.World);
}
贴合物体计算欧拉角,进行旋转
public void RotateThis1()
{
Vector3 RotateAix = Vector3.Cross(m_door.forward, T_door.forward);
float angle = Vector3.Angle(m_door.forward, T_door.forward) + 180;
m_door.parent.Rotate(RotateAix, angle, Space.World);
float Anle = Vector3.Angle(T_door.up, m_door.up);
Debug.Log(Anle);
m_door.parent.Rotate(T_door.forward, Anle, Space.World);
}
2.Unity中脚本挂载
在需要自动贴合的两物体下创建空物体,用于挂载标志位脚本。
注:空物体命名为Target,需与脚本内一致,否则获取不到位置信息
Size设置标志位显示大小,此处显示非必要,可以不显示。
两物体有一个为移动物体(位置变动去贴合另一个物体),A为移动物体。将自动贴合脚本挂载在移动物体A上,在Target初选择B物体,Distance设置贴合距离。
运行后,两物体标志位面贴近到Distance以内,自动贴合,并可以分离。
总结
C#写的一个简单的自动贴合脚本,可以实现物体移动后,将物体放回原位的功能。标志位可以自由移动,放置在任意位置和角度。完整代码请看主页。



