2016-11-09 569 views
1

我有一些代码,当它执行时,它会向前推送一个字符。问题在于角色永远不会停止移动并永远持续下去。有没有办法阻止角色在2秒后移动?这里是我正在使用的代码:在Unity中停止更新功能

public class meleeAttack : MonoBehaviour 
{ 
    public int speed = 500; 
    Collider storedOther; 
    bool isHit = false; 

    void Start() 
    { 
    } 

    void Update() 
    { 
     if (isHit == true) 
     { 
      storedOther.GetComponent<Rigidbody>().AddForce(transform.forward * speed); 
     } 

    } 



    void OnTriggerStay(Collider other) 
    { 
     if (other.gameObject.tag == "Player" && Input.GetKeyUp(KeyCode.F)) 
     { 
      storedOther = other; 
      isHit = true; 
     } 
    } 

} 

我不确定是否有办法停止update()函数,以便停止字符移动。

+0

不要在更新函数中调用'storedOther.GetComponent ()'。在'Start()'过程中调用它一次并保存刚体,当你得到一个新的碰撞体时,对'OnTriggerStay'做同样的事情。 –

回答

2

更新功能是Unity脚本生命周期的一部分。如果您想停止执行更新功能,则需要停用该脚本。对于这一点,你可以简单地使用:

enabled = false; 

这将禁用脚本的生命周期的执行,所以防止被称为更新功能。

现在,看起来你正在对角色施加一个力量来使其移动。你可能想要做的是在两秒钟后移除你角色上的任何力量。为此,您可以使用协同程序,该协程不仅可以在一个框架上执行,而且可以根据需要在多个框架上执行。为此,您可以创建一个返回IEnumerator参数的函数,并调用协程与StartCoroutine方法:

bool forcedApplied = false; 

void Update() 
{ 
    if (isHit == true && forceApplied == false) 
    { 
     storedOther.GetComponent<Rigidbody>().AddForce(transform.forward * speed); 

     forceApplied = true; 

     StartCoroutine(StopCharacter); 

     isHit = false; 
    } 

} 

IEnumerator StopCharacter() 
{ 
    yield return new WaitForSeconds(2); 

    storedOther.GetComponent<Rigidbody>().velocity = Vector3.zero; 

    forceApplied = false; 
} 

这些可能是不同的方式来实现你想要做什么。这取决于你选择与你当前的游戏相关的东西,并以这种方式修改你的脚本。

+0

我添加了你写的代码,虽然它确实阻止了字符移动,但它不断重复这个过程。所以角色每2秒退回一次。我是否需要在更新功能中更改某些内容,以便永久停止移动角色,而不是每隔几秒钟移动角色? – sam1319

+0

问题可能是你的isHit变量总是等于true。我修改了我的示例,以便在应用该力后将其设置为false。 – Isuka