如何在需要时停止翻译?

时间:2016-01-16 08:06:33

标签: c# unity3d translate

我有一个带盒子的橱柜。当我查看该框并按下鼠标按钮时,我想用翻译打开/关闭它。我想移动框,直到它的 X 坐标为1.0(起点为1.345)。但它的移动时间比这一点长。

enter image description here

我尝试使用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);            
    }
}

2 个答案:

答案 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; }