#c# #unity3d #object-pooling
#c# #unity3d #объединение объектов
Вопрос:
я работаю над игрой с бесконечным раннером, и я хочу добавить объединение объектов на платформы, но я получил 2 ошибки:
AssetsPlatformGenerator.cs(37,26): error CS1501: No overload for method 'SpawnObject' takes 1 arguments
AssetsObjectPool.cs(36,16): error CS0165: Use of unassigned local variable 'ToReturn'
Вот скрипт генератора платформы:
{
public GameObject ThePlatform;
public Transform GenerationPoint;
public float DistanceBetween;
private float PlatFormWidth;
public float DistanceBetweenMin;
public float DistanceBetweenMax;
public ObjectPool PlatformPool;
// Start is called before the first frame update
void Start()
{
PlatFormWidth = ThePlatform.GetComponent<BoxCollider2D>().size.x;
}
// Update is called once per frame
void Update()
{
if(transform.position.x < GenerationPoint.position.x)
{
DistanceBetween = Random.Range(DistanceBetweenMin, DistanceBetweenMax);
transform.position = new Vector3(transform.position.x PlatFormWidth DistanceBetween,
transform.position.y, transform.position.z);
//Instantiate(ThePlatform, transform.position, transform.rotation);
PlatformPool.SpawnObject(ThePlatform, transform.position, transform.rotation);
}
}
}
Вот сценарий ObjectPooler:
{
public GameObject ObjectToPool;
public List<GameObject> ThePool = new List<GameObject>();
public int StartAmount;
// Start is called before the first frame update
void Start()
{
for(int i = 0; i < StartAmount; i )
{
ThePool.Add(Instantiate(ObjectToPool));
ThePool[i].SetActive(false);
ThePool[i].transform.parent = transform;
}
}
// Update is called once per frame
void Update()
{
}
public GameObject SpawnObject(Vector3 Position)
{
GameObject ToReturn;
ToReturn = ThePool[0];
ThePool.RemoveAt(0);
ToReturn.transform.position = Position;
ToReturn.SetActive(true);
return ToReturn;
}
}
надеюсь, вы сможете мне помочь, потому что я новичок в программировании и сейчас не исправляю подобные вещи, и если вы видите другие вещи, которые я должен улучшить, было бы очень приятно, если бы вы рассказали мне об этом.
Ответ №1:
В скрипте пула объектов вы помещаете следующую функцию public GameObject SpawnObject(Vector3 Position), которая принимает только один аргумент для position . Но в генераторе платформы вы вызываете функцию с тремя аргументами PlatformPool.SpawnObject(ThePlatform, transform.position, transform.rotation). Итак, замените PlatformPool.SpawnObject(ThePlatform, transform.position, transform.rotation) в скрипте генератора платформы на PlatformPool.SpawnObject(transform.position);.
Комментарии:
1. Спасибо, вы исправили ошибку из-за большого количества аргументов, но я получил новую ошибку:
NullReferenceException: Object reference not set to an instance of an object PlatformGenerator.Update () (at Assets/PlatformGenerator.cs:37)
Ответ №2:
Первая ошибка, ваш метод запрашивает только один аргумент. Вы передаете 3. (Vector3 просто представляет точки x, y, z преобразования или GameObject.) Если вы хотите динамически передавать объект Vector3, вы можете сделать что-то вроде этого
Vector3 v = new Vector3 (0,0,0);
затем вы передаете его своему методу SpawnObject(v);
Для второй ошибки убедитесь, что список пула не пуст и вы назначаете их правильно, потому что вы назначаете его toReturn .
Ведение журнала очень помогает, попробуйте отладить что-то вроде этого
Debug.LogError(ThePool == null);
или проверьте его длину
Debug.LogError(ThePool.Length);
если это так, попробуйте добавить условие, чтобы не получить ошибку
if(ToReturn != null)
// ....
Комментарии:
1. спасибо, вы исправили ошибку, но теперь я получил новую ошибку:
NullReferenceException: Object reference not set to an instance of an object PlatformGenerator.Update () (at Assets/PlatformGenerator.cs:37)
2. GameObject, который вы пытаетесь использовать в строке 37, имеет значение null. Убедитесь, что вы создали экземпляр и назначили его.
3. здравствуйте, я все еще изучаю кодирование и не знаю, что мне нужно заменить, не могли бы вы мне сказать? Вот часть кода, в которой возникла ошибка:
public GameObject SpawnObject(Vector3 Position) { Debug.LogError(ThePool == null); GameObject ToReturn; ToReturn = ThePool[0]; ThePool.RemoveAt(0); ToReturn.transform.position = Position; ToReturn.SetActive(true); return ToReturn; }