每个台阶(零件)都有多个碰撞体,所有碰撞体勾选触发器,除了紫色台阶(下称A)外,正常台阶(下称B)另有鼠标拖动的相关代码和刚体。
想要达到B接近A时产生的一个吸附效果,我想到的方案是if判断AB两者的中心坐标,当两者中心坐标值相差不大时,B的坐标值变更为A的坐标值,然后再将A销毁。
//此段代码在鼠标拖动的脚本内
void OnTriggerStay(Collider collider)
{
if (gameObject.tag == collider.gameObject.tag)
{
if((transform.position - collider.transform.position).sqrMagnitude < 1)
{
dragged = false;//false时,关闭鼠标拖动的功能
this.gameObject.transform.position = collider.gameObject.transform.position;
//transform.position = Vector3.MoveTowards(transform.position, collider.gameObject.transform.position, Time.deltaTime);
//yield return new WaitForSeconds(1.0f);
Destroy(collider.gameObject);
}
}
}
然而在使用时.B一旦和A产生接触,A很快就进行了销毁,但是B停留在原地并没有移动到A的位置上。改用MoveToWards和协程延时仍旧如此。
失效的原因是什么?如何更改?又或者有没有其他好的实现吸附效果的设计?
你把碰撞体编辑的很小再试试呢
失效的原因,是代码12行写的检测到持续碰撞就销毁了碰撞物体。 修改协程也不好用的原因也在于此,因为11行代码并没有起到延时销毁的作用,建议将12行代码修改为: Destroy(collider.gameObject, 1f); 这样再试试看,是否有移动吸附效果,若还有问题请追问。
void OnTriggerStay(Collider collider)
{
if (gameObject.tag == collider.gameObject.tag)
{
if ((transform.position - collider.transform.position).sqrMagnitude <= 0.3)
{
//dragged = false;
transform.position = collider.gameObject.transform.position;
if(transform.position == collider.gameObject.transform.position)
{
Debug.Log(transform.position);
Debug.Log(collider.gameObject.transform.position);
dragged = false;
}
}
}
}
我让它在AB坐标相等的时候(B是固定不动的(0,0,0)),debug显示两者坐标值,然而当显示的时候,B在inspect面板上的坐标却并不是(0,0,0),难道是因为float类型导致了精度丢失了吗?
我复制你的trigger代码测试了一下,没问题,就是精度丢失。