当被告知时,团结5惯例不会退出

时间:2016-08-09 19:45:35

标签: c# function unity3d unity5 coroutine

我正在制作一个玩家与机器人作战的游戏,我已经实现了一些代码,以便在符合条件的情况下让AI向后移动并旋转离开玩家。然而,执行此操作的常规程序将永远循环,我不确定如何使其中断。

void Update () 
    {
        //looking at player
        playerVelocity = ((TTarget.position - previous).magnitude) / Time.deltaTime;
        previous = TTarget.position;

        GameObject thePlayer = GameObject.Find("Player");
        PlayerMovement playerMovement = thePlayer.GetComponent<PlayerMovement>();
        enemyHit = playerMovement.hitEnemy;

        if (enemyHit == false)
        {
            //enemy moving
            transform.LookAt(TTarget);
            transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed);
        }
        else if (enemyHit == true)
        {
            StartCoroutine("Evade");
            //Debug.Log ("Hello");
            StopCoroutine("Evade");
        }
    }

    IEnumerator Evade()
    {
        //GameObject thePlayer = GameObject.Find("Player");
        //PlayerMovement playerMovement = thePlayer.GetComponent<PlayerMovement>();
        //enemyHit = playerMovement.hitEnemy;

        transform.Translate(Vector3.back * Time.deltaTime * movementSpeed);
        yield return new WaitForSeconds(1);

        Vector3 to = new Vector3(0, -45, 0);
        if (Vector3.Distance(transform.eulerAngles, to) > 0.01f)
        {
            transform.eulerAngles = Vector3.Lerp(transform.rotation.eulerAngles, to, 99*Time.deltaTime);
        }

        yield break;


    }

1 个答案:

答案 0 :(得分:0)

你的问题是你正在启动协程,然后立即停止它。

void Update () 
{
    enemyHit = playerMovement.hitEnemy;

    if (enemyHit == false)
    {
        //enemy moving
        transform.LookAt(TTarget);
        transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed);
    }
    else if (enemyHit == true)
    {
        StartCoroutine("Evade");
        Debug.Log ("Back From Coroutine");
        StopCoroutine("Evade");
        Debug.Log("Stopped Coroutine");
    }
}

IEnumerator Evade()
{
    Debug.Log("Starting Coroutine");
    transform.Translate(Vector3.back * Time.deltaTime * movementSpeed);
    yield return new WaitForSeconds(1);

    Debug.Log("This is never called");

    Vector3 to = new Vector3(0, -45, 0);
    if (Vector3.Distance(transform.eulerAngles, to) > 0.01f)
    {
        transform.eulerAngles = Vector3.Lerp(transform.rotation.eulerAngles, to, 99*Time.deltaTime);
    }
    yield break;
}

这将输出:

Starting Coroutine
Back From Coroutine
Stopped Coroutine

我认为更好的做法就是选择布尔和Invoke http://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

private bool avoidPlayer = false;
void Update () 
{
    enemyHit = playerMovement.hitEnemy;

    if (enemyHit == false)
    {
        //enemy moving
        transform.LookAt(TTarget);
        transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed);
    }
    else if (enemyHit == true)
    {
        transform.Translate(Vector3.back * Time.deltaTime * movementSpeed);
        avoidPlayer = true;
    }
    // Invoke the evade function every second until we have avoided the player
    if(avoidPlayer)
        Invoke("Evade", 1);
}

void Evade()
{
    Vector3 to = new Vector3(0, -45, 0);
    if (Vector3.Distance(transform.eulerAngles, to) > 0.01f)
        transform.eulerAngles = Vector3.Lerp(
                                    transform.rotation.eulerAngles, to, 99*Time.deltaTime);
    else
        avoidPlayer = false;
}