Unity Ai GameObject移动时不断提高速度

时间:2019-02-08 18:44:11

标签: c# unity3d

如果玩家存在或不存在,并且玩家存在杀死该玩家,我做了一些代码来搜索敌人,代码工作正常,但是每当敌人移动速度不断提高时,我都不想速度完全提高了,因此如何使其以相同的启动速度运动而不增加 这是我的代码

void Update () {
    if (target == null) {
        if (!searchingForThePlayer) {
            searchingForThePlayer = true;
            StartCoroutine (searchForPlayer ());
        }
        return;
    }

    if (Vector3.Distance (target.position, transform.position) < 20) {

        transform.position = Vector2.MoveTowards (transform.position, target.position, 1f * Time.deltaTime);
        if (target.position.x < transform.position.x && !facingRight) 
            Flip ();
        if (target.position.x > transform.position.x && facingRight)
            Flip ();

    } else {

    }

    StartCoroutine (UpdatePath ());
}
IEnumerator searchForPlayer () {
    GameObject sRusult = GameObject.FindGameObjectWithTag ("Player");
    if (sRusult == null) {
        yield return new WaitForSeconds (0.5f);
        StartCoroutine (searchForPlayer ());
    } else {
        target = sRusult.transform;
        searchingForThePlayer = false;
        StartCoroutine (UpdatePath ());
        yield return null;
    }

}
IEnumerator UpdatePath () {
    if (target == null) {
        if (!searchingForThePlayer) {
            searchingForThePlayer = true;
            StartCoroutine (searchForPlayer ());
        }
        yield return null;
    } else {
        if (Vector3.Distance (target.position, transform.position) < 20) {

            transform.position = Vector2.MoveTowards (transform.position, target.position, 1f * Time.deltaTime);
            if (target.position.x < transform.position.x && !facingRight)
                Flip ();
            if (target.position.x > transform.position.x && facingRight)
                Flip ();

        } else {

        }
    }
    // Start a new path to the target position, return the result to the OnPathComplete method

    yield return new WaitForSeconds (1f / 2f);
    StartCoroutine (UpdatePath ());
}

void Flip () {
    Vector3 scale = transform.localScale;
    scale.x *= -1;
    transform.localScale = scale;
    facingRight = !facingRight;
}

1 个答案:

答案 0 :(得分:3)

在每一帧中,您都使用Update()方法启动UpdatePath()协程。然后,在UpdatePath()中启动另一个UpdatePath()协程。在任何情况下都不要启动它,这样可以确保UpdatePath()永远运行。

由于您还继续在Update()中开始新的游戏,因此这意味着您将不断堆积在越来越多的协同程序上,这意味着游戏运行的越多,每一帧被调用的UpdatePath()就越多。

换句话说,从技术上讲,您的对象的速度并没有增加,只是MoveTowards()被调用的次数,确实具有相同的最终结果。

至于修复,我建议重组您的代码。例如,我非常怀疑Update()UpdatePath()彼此接近完全相同。我还发现UpdatePath()会在运行结束时自行启动。