Ошибки при объединении объектов

#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; }