2016-12-27 3 views
0

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

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); 

    } 
} 
} 

А вот код для объекта Пулера:

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; 

} 
} 

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

ответ

0

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

0

Функция

public GameObject GetPooledObject(){...}

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

newPlatform.SetActive (true);

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

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

+0

Вот и все! Добавлен скрипт на платформы, которые дезактивируют их после выхода из экрана. Наверное, я пропустил ту часть учебника ... Спасибо! – MayorDump

Смежные вопросы