我可以在Update()函数中只调用一次代码吗?

时间:2017-04-15 22:12:13

标签: c# unity3d infinite spawning runner

所以我尝试使用C#代码统一制作一个游戏,现在......我有一个跳过挂架的立方体......它是一个无限的亚军游戏。

问题在于我想根据立方体行进的距离来生成挂架......

让我们说这个立方体已经走了12米,每当幼崽走过那个距离时我想要产生一个新的pilon,所以它走了12米,产生了一个新的塔,它又行进了12米,产生了一个新的塔等等...

我想让幼崽旅行越来越快,这就是为什么我需要知道塔架需要产生的距离。

我尝试使用函数Instantiate(),并使用if语句查找多维数据集的transform.position.z

真正的问题是,每次立方体行进12米并且是时候实例化一个新的塔架,它会产生20个塔架,因为我在更新功能中使用它,并且它将该位置视为浮动,实例化全数,12,1; 12,2; 12,3; 134 ......直到; 12,99 ......我想知道如何只生产一次塔架。

另外......如果您有更好的产生挂架的解决方案,请告诉我。

  This is the code that I used to spawn the pylons ,respectively the functions that I used.
 Some of this are the variables that I used.

    public float cameraSpeed = 1;
    public float horizontalSpeed;
    private int spawnIndex;
    public float spawnDistance;
    private int[] prevPoints;
    public GameObject[] pilon;
    public GameObject spawnMainPoint;
    public Transform[] spawnPoints;
    public Transform[] coinsSpawnPoint;
    public float enamySpeed;
    private int currentPoint;
    public Transform[] pointPosition;

void FixedUpdate () {
    int currPosition = (int)transform.position.z;
    if (currPosition % spawnDistance == 0f) {
        SpawnCoinPylon ();
        SpawnNormalPylon ();
    }

void SpawnNormalPylon ()
    {
        spawnIndex = Random.Range (0, spawnPoints.Length);
        Instantiate (pilon[0], spawnPoints [spawnIndex].position,spawnPoints [spawnIndex] .rotation);

    }
    void SpawnCoinPylon(){
        Instantiate (pilon[1], coinsSpawnPoint [0].position,spawnPoints [spawnIndex] .rotation);
    }

谢谢!

更新:

我设法拉了它,这是正确工作的代码:

private int currPosition ;

void Start () {
    currPosition = (int) transform.position.z;
}
void FixedUpdate () {
    bool hasSpawnedPylon = false;
    if (currPosition != (int)transform.position.z) {
        if ((int)transform.position.z % spawnDistance == 1) {
        if (!hasSpawnedPylon) {
            SpawnCoinPylon ();
                SpawnNormalPylon ();
                    currPosition = (int)transform.position.z;
        }
        }
    }
        else
        {
            hasSpawnedPylon = false;
        }
}

    void SpawnNormalPylon ()
{
    spawnIndex = Random.Range (0, spawnPoints.Length);
    Instantiate (pilon[0], spawnPoints [spawnIndex].position,spawnPoints [spawnIndex] .rotation); 

}
void SpawnCoinPylon(){
    Instantiate (pilon[1], coinsSpawnPoint [0].position,spawnPoints [spawnIndex] .rotation);
}

1 个答案:

答案 0 :(得分:1)

我希望这能解决你的问题。

    bool hasSpawnedPylon = false;
    void FixedUpdate()
    {
        int currPosition = (int)transform.position.z;
        if (currPosition % spawnDistance == 0f)
        {
            if (!hasSpawnedPylon)
            {
                SpawnCoinPylon();
                SpawnNormalPylon();
            }
        }
        else
        {
            hasSpawnedPylon = false;
        }
    }

请注意,检查floats是否与0f完全相同是一种不好的做法,会导致您不会发现的错误。通常最好将其与(difference of two floats) < some small threshold values进行比较。这是因为在floats值时,int通常会存在微小差异。例如,5.0f通常存储为0.4999f0.5001f