如何降低Unity2D中的实例化频率

时间:2018-07-01 20:12:07

标签: c# unity3d

我正在尝试像这样降低击球频率:

public class createShot : MonoBehaviour {

    public GameObject shot;

    void Update()
    {
        StartCoroutine("Shot");
    }

    IEnumerator Shot()
    {
        if (Input.GetKey("space"))
        {
            Instantiate(shot, transform.position, transform.rotation);
            yield return new WaitForSeconds(1f);
        }
    }
}

但是它可以在不到一秒钟的时间内发送大量照片……有人可以帮忙吗?这是Unity5中的2D项目

2 个答案:

答案 0 :(得分:3)

也许您想要更多类似这样的东西:

float elapsedTime;
[SerializeField]
float targetTime = 1f;

void Update() 
{
    elapsedTime += Time.deltaTime;

    if(elapsedTime >= targetTime && Input.GetKey(KeyCode.Space))
    {
        elapsedTime = 0;
        Instantiate(shot, transform.position, transform.rotation);
    }
}

这将增加计时器elapsedTime,并检查计时器是否超过了targetTime

我也鼓励您尽可能停止使用字符串。在调用方法或请求类似GetKey中的键的方法时,请勿使用它们。它们会产生垃圾并降低您的软件速度。

答案 1 :(得分:1)

或者...

使用已经编写的完全相同的代码,我们可以进行一些细微调整,使一切正常。

<QueryList> 
    <Query Id="0" Path="Security">
        <Select Path="Security">
            *[System[(EventID=4624)]]
            and *[EventData[Data[@Name='LogonType'] and (Data=1 or Data=8 or Data=9)]]
        </Select>
        <Suppress Path="Security">
            *[EventData[Data[@Name='TargetUserName'] and (Data='SYSTEM')]]
        </Suppress>
    </Query>
</QueryList>

顺便说一句,您应该始终使用前导大写字母来命名课程,例如public class createShot : MonoBehaviour { public GameObject shot; void Start() //create the coroutine once { StartCoroutine("Shot"); } IEnumerator Shot() { while(true) { //do this forever! //This is what makes it loop and what allows the WaitForSeconds() do its job if (Input.GetKey("space")) { Instantiate(shot, transform.position, transform.rotation); yield return new WaitForSeconds(1f); } else { yield return null; //wait 1 frame instead } } } } 而不是CreateShot