-1

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

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

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

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

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

真正的问题是,每次立方体行进 12 米并且是时候实例化一个新的 pylon 时,它会像 20 个 pylons 一样生成,因为我在更新函数中使用了它,它会将位置视为浮点数,实例化完整的数字, 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);
}
4

1 回答 1

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

于 2017-04-16T00:29:57.017 回答