MoveTowards无法正常工作

时间:2015-08-05 07:17:41

标签: unity3d unityscript

我想从我的数组中移动每个对象,我的意思是首先移动到[0]然后移动到[1],依此类推。我的动画有问题。

function exit( path : Array){
    var node : Node;
    var go : GameObject;

    for(var i=1 ; i < path.length ; i++){
        node = path[i] as Node;
        go = node.getContent() as GameObject;
        nodeS.getContent().transform.position =  Vector3.MoveTowards(nodeS.getContent().transform.position, go.transform.position  ,1);
    }
}

我在Update()内调用退出函数。结果,我得到了奇怪的动作,我明白问题出在for循环和Update函数之间。

1 个答案:

答案 0 :(得分:1)

你得到了奇怪的动作,因为在每个Update()(你exit()的每次调用)中,你都会遍历path中的所有节点,而只移动一个节点迈向他们的步骤这是因为Vector3.MoveTowards仅计算从当前目标的移动的下一步。你步骤的大小是&#34; 1&#34; (Vector3.MoveTowards())的第三个参数

所以基本上,在每个Update()中都会发生这种情况:

  • 将1个单位移近path
  • 的第一个节点
  • 将1个单位移近path
  • 的第二个节点
  • 将1个单位移近path
  • 的第三个节点

所以,我这样做是这样的:

function exit(path : Array) {

    var node : Node;
    var go : GameObject;

    node = path[CurrentNodeIndex] as Node;
    go : GameObject = node.getContent() as GameObject;


    if (!Mathf.Approximately(
            Vector3.Distance(nodeS.getContent().transform.position, go.transform.position),
            0
    )) {

        nodeS.getContent().transform.position = Vector3.MoveTowards(nodeS.getContent().transform.position, go.transform.position, 1);

    } else {
        CurrentNodeIndex++;
        Debug.Log("Starting to move towards next node: " + CurrentNodeIndex);

        if (CurrentNodeIndex >= path.length) {
            Debug.Log("The final node was reached!");
            return;
        }
    }
}

这是做什么的:

  1. path获取第一个节点(CurrentNodeIndex开头为1)
  2. 如果此节点与nodeS之间的当前距离(使用Vector3.Distance)不大约为0(使用Mathf.Approximately),则向节点靠近一步(使用Vector3.MoveTowards
  3. 每次更新都会调用此命令,直到两个节点之间的距离大约为0.然后CurrentNodeIndex会增加。
  4. 在下一次更新中,从path中选择下一个节点并重复此过程 - 开始向它移动
  5. 当到达path的最后一个节点时,返回。您还可以使用一些全局私有bool标志来指示并优化
  6. 请原谅任何编译错误;我没有使用Unityscript,而是使用C#,现在没办法测试它。

    顺便说一句,你有没有理由开始从path索引1而不是0?如果您打算从path的实际第一个节点开始,请将CurrentNodeIndex初始化为0而不是1。