Le gif promis (50Mo la bête) :
https://www.dropbox.com/s/o7o2kt9b1m...anePool.gif?dl
On voit les vagues, et un peu les nuages, qui disparaissent une fois hors-champs et réapparaissent devant. En plus de faire cette rotation, tu noteras que je n'en recréée pas de nouveaux : j'en ai une réserve, je les disable quand je n'en ai pas besoin et je les reenable quand il faut de nouveau en afficher.
Et en bonus, le script qui fait ça :
Code:
using UnityEngine;
using System.Collections.Generic;
public class TilesSpawner : MonoBehaviour
{
public GameObject prefab;
public float parallaxLevel = 0;
float parallaxSpeed;
GroundTile lastTile;
List<GroundTile> currentTiles;
// Use this for initialization
void Start ()
{
currentTiles = new List<GroundTile>();
parallaxSpeed = CameraManager.Instance.speed*parallaxLevel/100f;
GroundTile[] previousTiles = GetComponentsInChildren<GroundTile>();
for(int i = 0; i < previousTiles.Length; i++)
{
previousTiles[i].DisableEntity();
GameObject.Destroy(previousTiles[i].gameObject);
}
InitTiles();
}
void InitTiles()
{
currentTiles.Clear();
int tilesCount = 0;
lastTile = (GroundTile) Spawn();
lastTile.transform.SetParent (transform);
currentTiles.Add(lastTile);
do{
tilesCount = currentTiles.Count;
Update();
}while(currentTiles.Count > tilesCount);
}
// Update is called once per frame
void Update ()
{
if( (parallaxLevel < 100
&& lastTile.transform.position.x + lastTile.width/2f < CameraManager.Instance.GetScreenCenterPosition().x + CameraManager.Instance.cameraWidth + 20)
|| (parallaxLevel > 100
&& lastTile.transform.position.x - lastTile.width/2f > CameraManager.Instance.GetScreenCenterPosition().x + CameraManager.Instance.cameraWidth + 20) )
{
float sign = (parallaxLevel < 100 ? 1f : -1f);
Vector3 lastTilePosition = lastTile.transform.position;
lastTilePosition.x += sign * lastTile.width/2f;
lastTile = (GroundTile) Spawn();
lastTilePosition.x += sign * lastTile.width/2f;
lastTile.transform.position = lastTilePosition;
lastTile.transform.SetParent (transform);
currentTiles.Add(lastTile);
}
for(int i = 0; i < currentTiles.Count; i++)
{
if(currentTiles[i].readyToUse)
{
currentTiles.RemoveAt(i);
i--;
}
}
}
void FixedUpdate()
{
if(parallaxLevel != 0)
{
for(int i = 0; i < currentTiles.Count; i++)
{
Vector3 newPosition = currentTiles[i].transform.position;
newPosition.x += parallaxSpeed*Time.fixedDeltaTime;
currentTiles[i].transform.position = newPosition;
}
}
}
protected virtual PoolableEntity Spawn()
{
return PoolManager.Instance.Get(prefab, transform.position);
}
}