2016-12-27 3 views
0

私は無限のランナーゲームに取り組んでいます。私はプログラミングの初心者であり、thisthisチュートリアルを取り組んでいるので、私はこのコードがどのように動作するかを100%確信していないので、問題を解決する方法を見つけるのが難しくなります。 このコードでは、オブジェクトプーリングを使用してプラットフォームを作成し、それらをアクティブ化、非アクティブ化、プレーヤの前に移動して再度アクティブ化することになっています。 (少なくとも、私は思う)これは、常に新しいプラットフォームをインスタンス化することなく、プレイヤーが無限のプラットフォームを横断できるようにする。ここではプラットフォームGeneratorのコードです: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);

これはタイムリーに行うことができます - オブジェクトが消える(ただし、このレベルを変更するにはレベルが異なる)、オブジェクトが交差しているかどうかを計算することができますはるかに遅れて、それを無効にすることができます。

+0

これだけです!画面の外に出た後にスクリプトを無効にするスクリプトをプラットフォームに追加しました。私はチュートリアルのその部分を逃したと思う...ありがとう! – MayorDump

関連する問題