Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将实例化的tilespreab从停用的tile交换到activetile?_C#_List_Unity3d_Unity5 - Fatal编程技术网

C# 如何将实例化的tilespreab从停用的tile交换到activetile?

C# 如何将实例化的tilespreab从停用的tile交换到activetile?,c#,list,unity3d,unity5,C#,List,Unity3d,Unity5,大家好,我一直在制作一款3d无止境跑步者游戏并进行实验,但遇到了一个问题。这就是我想要实现的目标。我有两个游戏对象列表,分别是activeTiles和deactivatedTiles。根据我的想法,我想首先将所有预制瓷砖添加到停用瓷砖列表中。接下来我有一个float amtTileOnScreen变量,它控制放在播放器前面要运行的磁贴数量。然后,考虑到屏幕上的磁贴数量,我从停用磁贴列表中随机选取一个磁贴作为激活磁贴,并将其放在播放器前面。使用过的磁贴被放回停用的磁贴列表,整个循环开始 问题是我如

大家好,我一直在制作一款3d无止境跑步者游戏并进行实验,但遇到了一个问题。这就是我想要实现的目标。我有两个游戏对象列表,分别是activeTiles和deactivatedTiles。根据我的想法,我想首先将所有预制瓷砖添加到停用瓷砖列表中。接下来我有一个
float amtTileOnScreen
变量,它控制放在播放器前面要运行的磁贴数量。然后,考虑到屏幕上的磁贴数量,我从停用磁贴列表中随机选取一个磁贴作为激活磁贴,并将其放在播放器前面。使用过的磁贴被放回停用的磁贴列表,整个循环开始

问题是我如何做到这一点?我们将不胜感激

这是我试过的

public class TileManager : MonoBehaviour 
{

    public GameObject[] tilePrefabs;

    private Transform playerTransform;
    private float spawnZ = -12f;
    private float tileLength = 24.0f;
    private int amtOfTilesOnScreen = 5;
    private float safeZone = 56.0f;
    private GameObject spawnedTile;



    public static List<GameObject> activeTiles;
    public static List<GameObject> deactivatedTiles;
    private int lastPrefabIndex = 0;
    private Vector3 transformTiles;

    // Use this for initialization
    void Start () 
    {

        activeTiles = new List<GameObject>();
        deactivatedTiles = new List<GameObject>();
        playerTransform = GameObject.FindGameObjectWithTag("Player").transform;

        for (int i = 0; i < amtOfTilesOnScreen; i++)
        {

            if (i < 1)
            {
                activeTiles.Add(SpawnTileAtFront(0));
            }
            else
            {
                activeTiles.Add(SpawnTileAtFront());
            }
        }


    }

    void Update () 
    {    
        if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength))
        {
            for (int i = 0; i < tilePrefabs.Length; i++)
            {
                spawnedTile = SpawnTileAtFront();
                deactivatedTiles.Add(spawnedTile);
                Debug.Log(deactivatedTiles.Count);
            }
            if (activeTiles.Count < (amtOfTilesOnScreen + 1))
            {
                activeTiles.Add(GetRandomDeactivatedTile());
                MoveTileToTheFront(GetRandomDeactivatedTile());
            }
            else
            {
                var disposeTile = activeTiles[0];
                deactivatedTiles.Add(disposeTile);
                DisposeActiveTiles(0);
            }

        }

    }

    private void MoveTileToTheFront(GameObject tile)
    {
        tile.transform.position = Vector3.forward * spawnZ;
        spawnZ += tileLength;
    }

    private GameObject SpawnTileAtFront(int prefabIndex = -1)
    {
        GameObject go;
        if (prefabIndex == -1)
        {
            go = Instantiate(tilePrefabs[RandomPrefabIndex()]) as GameObject;
        }
        else
        {
            go = Instantiate(tilePrefabs[prefabIndex]) as GameObject;
        }

        go.transform.SetParent(transform);
        MoveTileToTheFront(go);
        return go;
    }

    private void DisposeActiveTiles(int index)
    {
        GameObject unusedTile = activeTiles[index];
        activeTiles.RemoveAt(index);
        deactivatedTiles.Add(unusedTile);
    }

    private GameObject GetRandomDeactivatedTile()
    {
        if (deactivatedTiles.Count == 0)
            return null;
        int randomIndex = Random.Range(0, deactivatedTiles.Count);
        GameObject unusedTile = deactivatedTiles[randomIndex];
        deactivatedTiles.RemoveAt(randomIndex);
        return unusedTile;
    }

    private int RandomPrefabIndex()
    {
        if (tilePrefabs.Length <= 0)
        {
            return 0;
        }

        int randomIndex = lastPrefabIndex;
        while (randomIndex == lastPrefabIndex)
        {
            randomIndex = Random.Range(0, tilePrefabs.Length);
        }
        lastPrefabIndex = randomIndex;
        return lastPrefabIndex;
    }
}
公共类TileManager:MonoBehavior
{
公共游戏对象[]tilePrefabs;
私有转换玩家转换;
专用浮点数z=-12f;
专用浮点数长度=24.0f;
私有int amtOfTilesOnScreen=5;
私人浮动安全区=56.0f;
私有游戏对象生成文件;
公共静态列表;
公共静态列表停用文件;
私有索引=0;
私有向量3;
//用于初始化
无效开始()
{
activeTiles=新列表();
停用文件=新列表();
playerTransform=GameObject.FindGameObjectWithTag(“玩家”).transform;
for(int i=0;i(spawnZ-amtoftilenscreen*tillelength))
{
for(int i=0;i如果(tilePrefabs.Length问题似乎出在哪里?有什么不起作用,而您希望它起作用?@EmreE由于某种原因,tile的激活次数超过了
amtOfTileOnScreen
变量中指定的次数,并且在开始时,如果我暂停,则会根据请求实例化5个tile,然后再添加5个tile集。然后总共有10个tile被激活第9块瓷砖之后,第10块瓷砖之前有一个巨大的缺口。而且瓷砖不会从后面移除。谢谢Mikki Koivisto。
void Update () 
{    
    while (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength))
    {
        // we need to add a new tile in front of the player
        GameObject t;

        if (deactivatedTiles.Count == 0) {
            // no deactivated tiles so we need to instantiate a new tile
            t = SpawnTileAtFront ();
        } else {
            // otherwise take deactivated tile into use
            t = GetRandomDeactivatedTile ();
            MoveTileToTheFront (t);
        }
        // new tile is now active tile
        activeTiles.Add (t);

        // take oldest active tile and move it to deactivated list
        DisposeActiveTiles(0);
    }

}