【问题标题】:Haw can i call the code only once in the Update() function?如何在 Update() 函数中只调用一次代码?
【发布时间】:2017-09-11 21:48:06
【问题描述】:

所以我正在尝试使用 C# 代码统一制作游戏,现在...我有一个可以在塔上跳跃的立方体...这是一个无限奔跑游戏。

问题是我想根据立方体行进的距离生成塔...

假设立方体已经行进了 12 米,我想在幼崽每次行进那个距离时产生一个新的 pilon,所以它行进了 12 米,产生了一个新的 pylon,它又行进了 12 米,产生了一个新的 pylon等等……

我想让幼崽移动得越来越快,这样我就需要知道塔需要生成的距离。

我尝试使用函数Instantiate(),并使用if语句寻找立方体的transform.position.z..

真正的问题是,每次立方体行进 12 米并且是时候实例化一个新的 pylon 时,它会生成 20 个 pylon,因为我在 update 函数中使用了它,它会将位置视为浮动,实例化全数,12,1; 12,2; 12,3; 13,4 ...直到; 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);
}

【问题讨论】:

  • 你如何利用时间来生成塔,并让玩家存活的时间越长越快。我认为这样做会简单得多。
  • 发布生成 20 多个对象的代码,这里有人可以帮助您找出问题所在。
  • 感谢您的回复。
  • 我对使用时间来生成塔架有点怀疑,我担心如果速度会增加像生成塔架这样的故障,或者其他类似的事情会出现。 ..我还没有尝试过...我宁愿以其他可能的方式来做。如果我没有其他方法,我想我将不得不尝试,但正如我所说,我真的不喜欢这个想法。

标签: c# unity3d infinite spawning runner


【解决方案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

【讨论】:

  • 感谢您的帮助,您的代码实际上并没有工作,但它有助于使最终结果工作。我更新了问题,所以你们可以看到我做了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多