如何将禁用的游戏对象从一个列表移动到另一个列表?
How to Move disabled gameObjects from one list to another?
我一直在制作一个无穷无尽的 运行ner 游戏。我有一组随机生成的瓷砖(4 个大气压)。出于优化目的,我决定不在玩家 运行 时实例化和销毁游戏对象,尽管它确实禁用了它们,并且在需要从停用的图块中生成图块时。我制作了两个列表 active 和 deactivate 这将执行上述场景。我设法禁用了它们,但我不知道如何将它们添加到禁用列表并在何时生成它们。需要。我怎样才能实现它。
这是代码和我到目前为止所做的。
TileManager.cs
void Update ()
{
//Vector3 offset = new Vector3(0f, 0f, Time.time * speed);
//GameObject go;
//go.transform.SetParent(transform);
if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength))
{
SpawnTile();
DeleteTile();
}
}
private void DeleteTile()
{
//Destroy(activeTiles[0]);
activeTiles[0].SetActive(false);
activeTiles.RemoveAt(0);
//deactivatedTiles.RemoveAt(0);
}
private void SpawnTile(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);
go.transform.position = Vector3.forward * spawnZ;
spawnZ += tileLength;
activeTiles.Add(go);
//go.SetActive(false);
//if (deactivatedTiles != null)
//{
// Debug.Log("Has a Tile");
// deactivatedTiles[0].SetActive(true);
//}
//Debug.Log(deactivatedTiles);
}
非常感谢您的帮助。
您可以在需要时将它们从后面移到前面,而不是停用然后重新激活您的磁贴,如下所示:
|---|---|---|---|
|---|---|---|---|
|
V
|---|---|---|---|
|---|---|---|---|
(第一张图是旧状态,第二张图是之后的状态)。而不是
if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength)) {
SpawnTile();
DeleteTile();
}
做类似的事情
if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength)) {
if (activeTiles.Count() < (NumberOfTilesThatFitOnScreen + 1)) {
var spawnedTile = SpawnTileAtFront();
activeTiles.Add(spawnedTile);
} else {
var movedTile = activeTiles[0];
MoveTileToFront(movedTile);
//Puts the moved tile at the end of the array, so the next tile that will be moved is always the one in back
activeTiles.RemoveAt(0);
activeTiles.Add(movedTile);
}
}
然后像这样实现这两个方法:
private void MoveTileToFront(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);
MoveTileToFront(go);
return go;
}
将 NumberOfTilesThatFitOnScreen
设置为完全填满屏幕的图块数。
现在您的游戏应该不断生成新的方块,直到有足够的方块,这样如果您更改最后一个或第一个方块,它就不会显示在屏幕上。然后,一旦达到这个数量,游戏应该拿走最后一个方块(不在屏幕上)并将其移到前面(也不应该在屏幕上)。然后你的角色会再次遇到这个方块,另一个屏幕外的方块会被移到前面,依此类推。理想情况下,角色看起来像是在无限的路径上
只需将磁贴从活动列表移动到停用列表,如下所示:
private void DisposeActiveTile(int index)
{
GameObject unused_tile = activeTiles[index];
activeTiles.RemoveAt(index);
deactivatedTiles.Add(unused_tile);
}
private GameObject GetLastUnusedTile()
{
if(deactivatedTiles.Count == 0)
return null;
int last_index = deactivatedTiles.Count - 1;
GameObject unused_tile = deactivatedTiles[last_index];
deactivatedTile.RemoveAt(last_index);
return unused_tile;
}
从列表中删除对象时,如果对象被另一个变量引用,则该对象不会被销毁。
我一直在制作一个无穷无尽的 运行ner 游戏。我有一组随机生成的瓷砖(4 个大气压)。出于优化目的,我决定不在玩家 运行 时实例化和销毁游戏对象,尽管它确实禁用了它们,并且在需要从停用的图块中生成图块时。我制作了两个列表 active 和 deactivate 这将执行上述场景。我设法禁用了它们,但我不知道如何将它们添加到禁用列表并在何时生成它们。需要。我怎样才能实现它。
这是代码和我到目前为止所做的。
TileManager.cs
void Update ()
{
//Vector3 offset = new Vector3(0f, 0f, Time.time * speed);
//GameObject go;
//go.transform.SetParent(transform);
if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength))
{
SpawnTile();
DeleteTile();
}
}
private void DeleteTile()
{
//Destroy(activeTiles[0]);
activeTiles[0].SetActive(false);
activeTiles.RemoveAt(0);
//deactivatedTiles.RemoveAt(0);
}
private void SpawnTile(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);
go.transform.position = Vector3.forward * spawnZ;
spawnZ += tileLength;
activeTiles.Add(go);
//go.SetActive(false);
//if (deactivatedTiles != null)
//{
// Debug.Log("Has a Tile");
// deactivatedTiles[0].SetActive(true);
//}
//Debug.Log(deactivatedTiles);
}
非常感谢您的帮助。
您可以在需要时将它们从后面移到前面,而不是停用然后重新激活您的磁贴,如下所示:
|---|---|---|---|
|---|---|---|---|
|
V
|---|---|---|---|
|---|---|---|---|
(第一张图是旧状态,第二张图是之后的状态)。而不是
if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength)) {
SpawnTile();
DeleteTile();
}
做类似的事情
if (playerTransform.position.z - safeZone > (spawnZ - amtOfTilesOnScreen * tileLength)) {
if (activeTiles.Count() < (NumberOfTilesThatFitOnScreen + 1)) {
var spawnedTile = SpawnTileAtFront();
activeTiles.Add(spawnedTile);
} else {
var movedTile = activeTiles[0];
MoveTileToFront(movedTile);
//Puts the moved tile at the end of the array, so the next tile that will be moved is always the one in back
activeTiles.RemoveAt(0);
activeTiles.Add(movedTile);
}
}
然后像这样实现这两个方法:
private void MoveTileToFront(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);
MoveTileToFront(go);
return go;
}
将 NumberOfTilesThatFitOnScreen
设置为完全填满屏幕的图块数。
现在您的游戏应该不断生成新的方块,直到有足够的方块,这样如果您更改最后一个或第一个方块,它就不会显示在屏幕上。然后,一旦达到这个数量,游戏应该拿走最后一个方块(不在屏幕上)并将其移到前面(也不应该在屏幕上)。然后你的角色会再次遇到这个方块,另一个屏幕外的方块会被移到前面,依此类推。理想情况下,角色看起来像是在无限的路径上
只需将磁贴从活动列表移动到停用列表,如下所示:
private void DisposeActiveTile(int index)
{
GameObject unused_tile = activeTiles[index];
activeTiles.RemoveAt(index);
deactivatedTiles.Add(unused_tile);
}
private GameObject GetLastUnusedTile()
{
if(deactivatedTiles.Count == 0)
return null;
int last_index = deactivatedTiles.Count - 1;
GameObject unused_tile = deactivatedTiles[last_index];
deactivatedTile.RemoveAt(last_index);
return unused_tile;
}
从列表中删除对象时,如果对象被另一个变量引用,则该对象不会被销毁。