Как создать плитку в конце другой движущейся плитки?

Я пытаюсь создать игру Endless runner, в которой игрок остается неподвижным в начале координат осей, а плитки прокручиваются с фиксированной скоростью по оси Z по мере их создания. Прилагаемый скрипт создает 5 плиток в начале, уже прокручивая их со скоростью, установленной в GameManager, а затем продолжает создавать плитки на основе фиксированной скорости появления.

Проблема, с которой я сталкиваюсь, заключается в вычислении правильного расстояния между плитками после создания первых пяти экземпляров, так что каждый конец плитки перекрывается.

Я прикрепляю то, что я написал до сих пор, в сценарии TileManager, в надежде, что кто-то знает, как действовать, или, возможно, знает другой метод. Спасибо!

public class TileManager : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private GameObject[] tilesArray;
    [SerializeField] private int tilesToSpawn = 5;
    [SerializeField] private float zPosSpawn = 0f;
    [SerializeField] private float tileLength = 20f;
    [SerializeField] private float scrollCoefficient;

    private float timeSinceLastSpawned;
    private float spawnRate;

    void Start()
    {
        //scrollingObjectsSpeed = -1,5f
        spawnRate = GameManager.Instance.scrollingObjectsSpeed * -1;
        SpawnLogic();
    }

    void Update()
    {
        timeSinceLastSpawned += Time.deltaTime;
        
        if (timeSinceLastSpawned >= spawnRate)
        {
            timeSinceLastSpawned = 0;
            SpawnTiles(Random.Range(1, tilesArray.Length));
        }
          
    }
    private void SpawnLogic()
        {
            for (int i = 0; i < tilesToSpawn; i++)
            {
                if (i == 0)
                {
                    SpawnTiles(0);
                }
                else
                {
                    SpawnTiles(Random.Range(0, tilesArray.Length));
                }
            }
        }

    private void SpawnTiles(int tileIndex)
    {
        scrollCoefficient = (GameManager.Instance.scrollingObjectsSpeed * -1f) * spawnRate ;
        Instantiate(tilesArray[tileIndex], transform.forward * zPosSpawn, Quaternion.identity);
        zPosSpawn = (zPosSpawn + tileLength) -  scrollCoefficient;
    }
}
`

person Luckydraw    schedule 21.12.2020    source источник


Ответы (1)


У меня была такая же проблема с предыдущей игрой, и я предложу вам лучший способ ее решить.

1

создайте список GameObjects для сохранения ваших плиток.

List<GameObject> tiles;

2

сохранить плитки в списке

tiles.Add((GameObject)Instantiate(tilesArray[tileIndex], transform.forward * zPosSpawn, Quaternion.identity);

3

проверьте каждую плитку, чтобы увидеть ее положение

for(int i = 0; i < tiles.Count; i++)
    {

         if(grids[i].transform.position.z <= lowerPosition)
        {
            
            DestroyObject(tiles[i]);
            tiles.Add((GameObject)Instantiate(tilesArray[tileIndex], transform.forward * zPosSpawn, Quaternion.identity);
        }
    }

DestroyObject() — это простая функция, но не забудьте удалить сетку:

void DestroyObject(GameObject tile)
{
    
    Destroy(grid);
    tiles.remove(tile);
}

Надеюсь, это полезно!

person Leoverload    schedule 22.12.2020
comment
Хорошо! Большое спасибо за ваш ответ, это действительно полезно! Единственное, чего я не понимаю, так это почему вы написали список сеток. Какова его цель, если у меня уже есть список плиток? - person Luckydraw; 22.12.2020
comment
Да, извините, я изменил это - person Leoverload; 22.12.2020