Vector3.MoveTowards将对象放置在错误的位置

时间:2019-10-30 02:42:48

标签: c# unity3d

由于某种原因,我的对象从不翻译正确的数量。这是为什么?我试过使用其他功能,但是它们与以下功能的动画方式不同。因此,我该如何设置它,使其在原先的位置以下精确地平移200个像素。

更新: 由于尚未找到解决方案,因此我将提供有关该问题的更深入的说明。

我有6个UIImage,所有这些均附加到名为“ LogDrop”的脚本中。还有一个GameControl脚本,一旦用户执行某项操作,就会将一个名为“活动”的布尔值设置为“真”。在“ LogDrop”脚本中,更新功能正在连续运行,并检查“ active”是否设置为true,如果设置为true,则所有日志都应该减少300个空格。

当我启动程序时,用户会触发活动的布尔值,并且日志向下移动,但不能向下移动300个空格。

我当前的更新代码为:

void Update()
{
    if (active)
    {
        if (!positionSet)
        {
            endPosition = new Vector3(transform.position.x, transform.position.y - 300, transform.position.z);
            positionSet = true;
        }
        if (Vector3.Distance(transform.position, endPosition) > 0.00001)
        {
            transform.position = Vector3.MoveTowards(transform.position, endPosition, 250 * Time.deltaTime);
        }
        else
        {
            active = false;
            positionSet = false;
        }
    }
}

当我运行程序并触发“活动”时,日志甚至向下移动730.8个空格。我不知道值730.8的来源...一旦日志移动并完成移动,“活动”将重新设置为false。但是,当用户再次触发布尔值时,即使该函数再次运行,日志也不会再次移动。

1 个答案:

答案 0 :(得分:0)

Vector3.MoveTowards计算并返回当前位置和目标位置之间的位置。 (第一个和第二个参数)。第三个参数是每次通话朝目标位置移动的距离(或距离)。

如果希望对象每次调用精确移动200个单位,则必须确保第三个参数等于或大于200f。

但是,您出于目的使用了错误的功能。

实际上,您可以直接直接设置位置

var endPosition = new Vector3(
  transform.position.x, 
  transform.position.y - 200, 
  transform.position.z);
  
transform.position = endPosition;

编辑:

根据Vector3.MoveTowards文档,您的代码应该可以按需要工作。 (移动对象并在endPosition处停止)

我想事实并非如此,这就是为什么你在这里。我也许可以为您提供这种小巧的解决方案。

void Update()
{
    if(active)
    {
        if(!positionSet)
        {
            endPosition = new Vector3(transform.position.x, transform.position.y - 200, transform.position.z);
            positionSet = true;
        }
        var step = 250 * Time.deltaTime;
        if (Vector3.Distance(transform.position, endPosition) < step) {
          transform.position = endPosition;
        }else {
          transform.position = Vector3.MoveTowards(transform.position, endPosition, step);
        }
    }
}