我正在制作一个玩家与机器人作战的游戏,我已经实现了一些代码,以便在符合条件的情况下让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;
}
答案 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;
}