【问题标题】:How to instantiate a tile on the end of another moving tile?如何在另一个移动瓷砖的末端实例化一个瓷砖?
【发布时间】:2020-12-21 23:31:55
【问题描述】:

我正在尝试创建一个“Endless runner”游戏,其中玩家在轴的原点上保持静止,而瓷砖在 Z 轴上以固定的速度滚动,因为它们被实例化。 附加的脚本在开始时会以 GameManager 中设置的速度滚动时生成 5 个图块,然后根据固定的生成速率继续生成图块。

我面临的问题是在实例化前五个之后计算图块之间的正确距离,以便图块的每一端都重叠。

我在 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;
    }
}
`

【问题讨论】:

    标签: c# unity3d infinite-loop objectinstantiation


    【解决方案1】:

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

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

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

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

    希望有用!

    【讨论】:

    • 好的!非常感谢您的回答,这真的很有帮助!我唯一不明白的是你为什么要写网格列表。如果我已经有了图块列表,它的目的是什么?
    • 是的,对不起,我改了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多