- Home /
Object Pooling Script for Autorunner?
I'm getting an error message in my script and I just don't know what to do. Can I get some help?
Error Message: Assets\Scripts\TileManager.cs(45,58): error CS7036: There is no argument given that corresponds to the required formal parameter 'value' of 'Dictionary>.Add(int, List)'
using System.Collections;
using UnityEngine;
using System.Collections.Generic;
public class TileManager : MonoBehaviour
{
public GameObject[] tilePrefabs;
Dictionary<int, List<GameObject>> tilePool = new Dictionary<int, List<GameObject>>();
private Transform playerTransform;
private float spawnZ = -10f;
private float tileLength = 27.7016f;
private float safeZone = 22.5f;
private int amnTilesOnScreen = 4;
private int lastPrefabIndex = 0;
private List<GameObject> activeTiles;
// Start is called before the first frame update
private void Start()
{
activeTiles = new List<GameObject>();
playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
for (int i = 0; i < amnTilesOnScreen; i++)
{
if (i < 2)
SpawnTile(0);
else
SpawnTile();
}
}
// Update is called once per frame
private void Update()
{
if (playerTransform.position.z - safeZone > (spawnZ - amnTilesOnScreen * tileLength))
{
SpawnTile();
DeleteTile();
}
}
private void SpawnTile(int prefabIndex = -1)
{
//make sure prefabIndex is set correctly.
if (!tilePool.ContainsKey(prefabIndex)) tilePool.Add(new List<GameObject>());
GameObject go = tilePool[prefabIndex].Find(x => !x.activeSelf); // find disabled gameobject to reuse
if (go == null)
{
go = Instantiate(tilePrefabs[prefabIndex]) as GameObject;
tilePool[prefabIndex].Add(go);
}
//set position for go and else
}
private void DeleteTile()
{
activeTiles[0].SetActive(false);//disable for reuse
activeTiles.RemoveAt(0);
}
private int RandomPrefabIndex()
{
if (tilePrefabs.Length <= 1)
return 0;
int randomIndex = lastPrefabIndex;
while (randomIndex == lastPrefabIndex)
{
randomIndex = Random.Range(0, tilePrefabs.Length);
}
lastPrefabIndex = randomIndex;
return randomIndex;
}
}
Answer by Larry-Dietz · Dec 10, 2019 at 03:06 PM
You are defining tilePool as a Dictionary> So when you are adding to the tilePool, you need to provide an INT as a key, and the list of gameobjects. Your add statement is only providing a list of game objects. You are missing the int key.
Hope this helps, -Larry
Can you show me? I'm sorry but I'm still quite a beginner and I'm having trouble following your instructions.
try this...
if (!tilePool.Contains$$anonymous$$ey(prefabIndex)) tilePool.Add(prefabIndex, new List<GameObject>());
That should create a new list of gameobjects, with the key being the prefabIndex you are passing in.
Well the error is now gone but now I get this when launching the game. The tiles spawn far away on startup.
IndexOutOfRangeException: Index was outside the bounds of the array. Tile$$anonymous$$anager.SpawnTile (System.Int32 prefabIndex) (at Assets/Scripts/Tile$$anonymous$$anager.cs:53) Tile$$anonymous$$anager.Start () (at Assets/Scripts/Tile$$anonymous$$anager.cs:31)
This is a definite improvement though as now I can start the game with your script changes.
Your answer
Follow this Question
Related Questions
How to reset a prefab used in object pool ? 2 Answers
How can I tell what prefabs a child object (script) is in? 2 Answers
How To Make Objects Appear Lit Without Using Lighting 2 Answers
IOS Object Pooling 0 Answers
Audio, play when laser hits object 1 Answer