Unity 5 - объединение объектов не деактивирует объекты

Я работаю над бесконечным бегуном. Я новичок в программировании, работаю над этим и это руководство, поэтому я не уверен на 100%, как этот код работает, из-за чего сложно понять, как исправить мои проблемы. Предполагается, что код использует пул объектов для создания платформ, затем активирует их, деактивирует, перемещает перед игроком и снова активирует. (По крайней мере, я так думаю) Это дает игроку бесконечные платформы, по которым он может бегать, без необходимости постоянно создавать новые платформы. Вот код генератора платформ:

using UnityEngine;
using System.Collections;

public class PlatformGenerator : MonoBehaviour
{

public GameObject thePlatform;
public Transform generationPoint;
public float distanceBetween;

private float platformWidth;

public float distanceBetweenMin;
public float distanceBetweenMax;

private int platformSelector;
private float[] platformWidths;
//  public GameObject[] thePlatforms;

public ObjectPooler[] theObjectPools;

private float minHeight;
private float maxHeight;
public Transform maxHeightPoint;
public float maxHeightChange;
private float heightChange;

void Start ()
{
//      platformWidth = thePlatform.GetComponent<BoxCollider2D> ().size.x;

    platformWidths = new float[theObjectPools.Length];

    for (int i = 0; i < theObjectPools.Length; i++)
    {
        platformWidths[i] =             theObjectPools[i].pooledObject.GetComponent<BoxCollider2D>().size.x;
    }

    minHeight = transform.position.y;
    maxHeight = maxHeightPoint.position.y;
}

void Update ()
{
    if (transform.position.x < generationPoint.position.x)
    {
        distanceBetween = Random.Range (distanceBetweenMin, distanceBetweenMax);

        platformSelector = Random.Range (0, theObjectPools.Length);

        heightChange = transform.position.y + Random.Range (maxHeightChange, -maxHeightChange);
        //          if you want to have platforms generating outside boundries, comment out this code:
        if (heightChange > maxHeight)
        {
            heightChange = maxHeight;
        }
        else if (heightChange < minHeight)
        {
            heightChange = minHeight;
        }

        transform.position = new Vector3 (transform.position.x + (platformWidths[platformSelector] / 2) + distanceBetween, heightChange, transform.position.z);

 //         Instantiate (/*thePlatform*/ thePlatforms[platformSelector], transform.position, transform.rotation);

        GameObject newPlatform = theObjectPools[platformSelector].GetPooledObject();

        newPlatform.transform.position = transform.position;
        newPlatform.transform.rotation = transform.rotation;
        newPlatform.SetActive (true);

        transform.position = new Vector3 (transform.position.x + (platformWidths[platformSelector] / 2), transform.position.y, transform.position.z);

    }
}
}

И вот код для Object Pooler:

public class ObjectPooler : MonoBehaviour
{
public GameObject pooledObject;
public int pooledAmount;

List<GameObject> pooledObjects;

void Start ()
{
    pooledObjects = new List<GameObject>();

    for (int i = 0; i < pooledAmount; i++)
    {
        GameObject obj = (GameObject) Instantiate (pooledObject);
        obj.SetActive (false);
        pooledObjects.Add (obj);
    }
}

public GameObject GetPooledObject()
{
    for (int i = 0; i < pooledObjects.Count; i++)
    {
        if (!pooledObjects[i].activeInHierarchy)
        {
            return pooledObjects[i];
        }
    }

    GameObject obj = (GameObject) Instantiate (pooledObject);
    obj.SetActive (false);
    pooledObjects.Add (obj);
    return obj;

}
}

Скрипт нормально работает несколько секунд игры, но вскоре начинает создавать новые платформы, чего я и стараюсь избегать. Я думаю, что происходит то, что платформы не отключаются, поэтому код не может перемещать платформы, а вместо этого создает новые. Я уверен, что это легко исправить, но я не уверен, что делать. Кто-нибудь знает, как это исправить? Спасибо.


person MayorDump    schedule 27.12.2016    source источник


Ответы (2)


Насколько я вижу, в вашем коде нет функций для возврата объектов в пул. Существует функция для получения объекта из пула, который автоматически создает экземпляр, если это необходимо, в противном случае извлекается из пула, и у вас есть логика метода запуска для предварительного пула, но вы никогда не возвращаете объекты обратно. Вам нужно создать функцию для возврата объектов обратно в пул.

person chosendeath    schedule 29.12.2016

Функция

public GameObject GetPooledObject(){...}

возвращает объект poolObject из пула, если объект отключен в иерархии. В противном случае он создает новый объект пула и возвращает его.

newPlatform.SetActive (true);

В функции обновления вы устанавливаете активный объект пула, но никогда не деактивируете его. Следовательно, ваш пулер продолжает генерировать новые объекты. Вам необходимо деактивировать объект с помощью object.setActive(false);

Вы можете сделать это своевременно - скажем, каждые 2 секунды объект исчезает (но для разных уровней вам нужно будет изменить это время), или вы можете вычислить, если объект был пересечен и находится далеко позади, тогда вы можете деактивировать его.

person theawless    schedule 29.12.2016
comment
Вот и все! На платформы добавлен скрипт, который деактивирует их после выхода из экрана. Кажется, я пропустил эту часть урока... Спасибо! - person MayorDump; 05.01.2017