Unity 5 - 对象池不禁用对象

问题描述:

我正在制作一个无尽的亚军游戏。我非常喜欢编程,因此我的thisthis教程正在工作,所以我不能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; 

} 
} 

该脚本工作正常播放了几秒钟,但很快就开始打造新的平台,这是我想要避免的。我认为发生的事情是平台没有被禁用,所以代码不能移动平台,而是创建新的平台。我相信这是一个简单的解决方案,但我不知道该怎么做。任何人都知道如何解决这个问题?谢谢。

就我所见,代码中没有将对象返回到池的功能。有一个函数可以从池中获取一个对象,如果需要它会自动实例化,否则从池中拉出,并且在启动方法逻辑中有预先池,但是你永远不会放回对象。您需要创建一个函数将对象返回到池中。

功能

public GameObject GetPooledObject(){...}

如果对象在层次结构禁用返回从池中poolObject。否则它实例化一个新的池对象并返回它。

newPlatform.SetActive (true);

在更新功能,您的poolObject设置为活跃,但从来没有关闭它。 因此,你的池不断生成新的对象。您需要停用对象使用object.setActive(false);

您可以及时做到这一点 - 例如说每2秒钟对象消失(但对于不同的级别,您将需要改变这次),或者您可以计算对象是否已被穿过并且是远远落后,那么你可以停用它。

+0

就是这样!在屏幕上停用后,在平台上添加了一个脚本。我想我错过了教程的那一部分...谢谢! – MayorDump