沿着引导路径穿行

时间:2014-07-12 22:08:27

标签: c# unity3d

var distancesquared = (transform.position - currentpath.Current.position).sqrMagnitude;
if (distancesquared < 0.1f * 0.1f)
    currentpath.MoveNext ();

我创建了一个路径,使用一个变换数组来统一,现在如果我不使用上面的if语句而只是currentpath.MoveNext(),它只是沿着第一对点遍历并且不会去一个超越完成路径,这个if语句与遍历路径的关系是什么,请?

修改

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class followpath : MonoBehaviour {

    public enum followtype
    {
        movetowards,
        lerp
    }
    public followtype type = followtype.movetowards;
    public Pathdefinition path;
    public float speed = 1;
    public float maxdistancetodo = 0.1f;

    private IEnumerator<Transform>  currentpath;
    public void Start()
    {
        if (path == null)
        {
            Debug.LogError ("path can not be null", gameObject);
            return;
        }
        currentpath = path.getpathenumerator ();
        currentpath.MoveNext ();
        if (currentpath.Current == null)
            return;

        transform.position = currentpath.Current.position;
    }

    public void Update()
    {
        if (currentpath == null || currentpath.Current == null)
            return;
        if (type == followtype.movetowards)
            transform.position = Vector3.MoveTowards (transform.position, currentpath.Current.position, Time.deltaTime * speed);
        else if (type == followtype.lerp)
            transform.position = Vector3.Lerp (transform.position, currentpath.Current.position, Time.deltaTime * speed);


        var distancesquared = (transform.position - currentpath.Current.position).sqrMagnitude;
        if (distancesquared < maxdistancetodo* maxdistancetodo)
            currentpath.MoveNext ();
    }
}

1 个答案:

答案 0 :(得分:1)

当您将代码置于更新中时,它会执行每一帧。

if语句检查以确保您的对象在迭代到路径中的下一个目标点之前足够接近它的当前目标位置。

如果没有if语句,每个帧都会导致路径上的下一个停止加载到迭代器中。这发生在您的对象有机会接近其先前目标之前。此外,由于帧发生得如此之快,这意味着整个路径在不到一秒的时间内被迭代,并且对象在设法走得很远之前就会停止移动。