gpt4 book ai didi

c# - InvokeRepeating() 限制? (C#)

转载 作者:行者123 更新时间:2023-11-30 20:24:55 27 4
gpt4 key购买 nike

我目前正在尝试以给定的速率实例化游戏对象。通常 InvokeRepeating 会完成这项工作,除了这次在实例化对象时我不希望速率是常量

我知道应该在代码的 Start() 部分内调用 InvokeRepeating。所以我的问题是:有什么办法可以解决这个问题,还是我必须采取不同的方法?

提前谢谢大家!

这是说明我正在谈论的问题的部分代码:

using UnityEngine;
using System.Collections;

public class InstantiateLARSpider : MonoBehaviour {

public float instantiateRate;
public GameObject xSpider;
private Vector3 position;
public float minimumSpeed;

void Start () {

// instantiateRate is a variable that I want to modify over time.
InvokeRepeating("NewSpider", 1.0f, instantiateRate);
}

void NewSpider ()
{
position = new Vector3(transform.position.x, Random.Range(-4.5f,4.5f), 0);
Debug.Log("Instantiated");
var Spider = Instantiate(xSpider, position, Quaternion.identity) as GameObject;
if(transform.position.x>=11.0f){
Spider.rigidbody2D.velocity = new Vector2(-1.0f * Random.Range(minimumSpeed, 6.0f), 0.0f);
}
else if(transform.position.x<=-11.0f){
Spider.rigidbody2D.velocity = new Vector2(1.0f * Random.Range(minimumSpeed, 6.0f), 0.0f);
}
//I was thinking about increasing the instantiateRate by 0.1 every time a Spider is instantiated.
instantiateRate -= 0.1f;
minimumSpeed += 0.1f;
}

最佳答案

在这种情况下,在调用 InvokeRepeating 之后更改 instantiateRate 实际上不会更改 InvokeRepeating 收到的参数的副本。要反射(reflect) InvokeRepeating 的功能,您最终可能会得到类似于以下内容的内容:

    public delegate void MethodToCall(); //A delegate - you can pass in any method with the signature void xxx() in this case!
public IEnumerator InvokeRepeatingRange(MethodToCall method, float timeUntilStart, float minTime, float maxTime)
{
yield return new WaitForSeconds(timeUntilStart);
while (true)
{
method(); //This calls the method you passed in
yield return new WaitForSeconds(Random.Range(minTime, maxTime))
}
}

我在这台机器上没有 Unity,所以我无法验证它是否编译(主要是 Random.Range 部分,其余部分我非常熟悉)。在你的情况下你会这样调用它:

    void Start()
{
StartCoroutine(InvokeRepeatingRange(NewSpider, 2, 5, 10));
}

void NewSpider() //Since NewSpider matches the signature void xxx(), we can pass it to InvokeRepeatingRange()
{
//...
}

调整 InvokeRepeatingRange 内部的参数和逻辑以获得所需的效果,也许:

    public delegate void MethodToCall();
public IEnumerator InvokeRepeatingDecreasingTime(MethodToCall method, float timeUntilStart, float minTime, float maxTime)
{
float currentTime = maxTime;
yield return new WaitForSeconds(timeUntilStart);
while (currentTime >= minTime)
{
method();
currentTime -= .1f;
yield return new WaitForSeconds(currentTime);
}
}

希望这能为您提供一种新的方式来思考这种做事模式并回答您原来的问题。

编辑:更新了更好的变量名和更多的解释。 添加了评论中提到的 StartCoroutine() 调用!

关于c# - InvokeRepeating() 限制? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25516686/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com