如何在另一个移动瓷砖的末端实例化瓷砖?

问题描述

我正在尝试创建一个“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;
    }
}
`

解决方法

我在之前的游戏中遇到了同样的问题,我会向您建议解决此问题的最佳方法。

1

创建一个游戏对象列表来保存您的图块。

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],Quaternion.identity);
        }
    }

DestroyObject() 只是一个简单的函数,但要记得移除网格:

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

希望有用!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...