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