私は無限のランナーゲームに取り組んでいます。私はプログラミングの初心者であり、thisとthisチュートリアルを取り組んでいるので、私はこのコードがどのように動作するかを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;
}
}
スクリプトは遊びの数秒間正常に動作しますが、すぐに新しいプラットフォームを作成することから始まり、それは私が避けようとしているものです。私は、プラットフォームが無効になっていないので、コードはプラットフォームを移動できず、代わりに新しいプラットフォームを作成するということが起こっていると思います。私はそれが簡単な修正だと確信していますが、私は何をすべきか分かりません。誰でもこれを修正する方法を知っていますか?ありがとう。
これだけです!画面の外に出た後にスクリプトを無効にするスクリプトをプラットフォームに追加しました。私はチュートリアルのその部分を逃したと思う...ありがとう! – MayorDump