我有一个带盒子的橱柜。当我查看该框并按下鼠标按钮时,我想用翻译打开/关闭它。我想移动框,直到它的 X 坐标为1.0(起点为1.345)。但它的移动时间比这一点长。
我尝试使用FixedUpdate,但它没有帮助..
public LayerMask mask;
private bool shouldClose;
private bool changeXCoordinate;
private Transform objectToMove;
void Update ()
{
if (changeXCoordinate)
OpenCloseBox();
else if(DoPlayerLookAtCupboardBox() && Input.GetMouseButtonDown(0))
changeXCoordinate = true;
}
bool DoPlayerLookAtCupboardBox()
{
RaycastHit _hit;
Ray _ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
bool isHit = Physics.Raycast(_ray, out _hit, 1.5f, mask.value);
if (isHit && !changeXCoordinate)
{
objectToMove = _hit.transform;
return true;
}
else
return false;
}
void OpenCloseBox()
{
if (shouldClose)
{
if(objectToMove.position.x != 1.345f) // It must stop at this point, but it don't
{
changeXCoordinate = false;
shouldClose = !shouldClose;
}
else
objectToMove.Translate(Vector3.right * Time.deltaTime);
}
else
{
if (objectToMove.position.x >= 0.1f) // The same problem here..
{
changeXCoordinate = false;
shouldClose = !shouldClose;
}
else
objectToMove.Translate(Vector3.left * Time.deltaTime);
}
}
答案 0 :(得分:2)
最好使用补间引擎,例如http://dotween.demigiant.com/。
如果你安装了Dotween,你只需使用
即可transform.DOMove(new vector3(1 ,0 , 1) , duration);
您还可以为补间设置缓动。或使用Oncomplete fucntions;
transform.DOMove(new vector3(1 ,0 , 1) , duration).SetEase(Ease.OutCubic).OnCompelete(() => { shouldClose = true; });
但你的问题的答案是,职位不是确切的数字所以你不应该使用这样的东西!=,你必须使用<或者> 。 为了解决你的问题我会建议你做这样的事情;
if(x > 1.345f)
{
x = 1.345f
}
这将解决您的问题。
答案 1 :(得分:1)
在这种情况下,您应该使用动画,这样可以完全控制动作的任何方面。
如果你真的想使用代码,你可以使用Vector3.MoveTowards,它可以创建一个从位置A到位置B的线性平移每帧一定的步数:
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step * Time.deltaTime);
至于你的问题,你正在检查这个位置是否是某个浮点数。但由于价值不准确,比较浮点数在计算机中并不准确。
1.345最有可能是1.345xxxxxx,这与1.34500000不同。所以它永远不会平等。
编辑:使用相等性也会导致您检查值是大于还是相等。但请考虑一下:
start : 10 movement : 3
if(current >= 0){ move(movement);}
frame1 : 10
frame2 : 7
frame3 : 4
frame4 : 1
frame5 : -2 we stop here
这就是为什么在希望移动到精确点时应该使用动画或MoveTowards。或者添加额外的:
if(current >= 0){ move(movement);}
else { position = 0; }