Unity перемещает изображения от 0 до 1920 бесконечно для эффекта параллакса - PullRequest
0 голосов
/ 25 мая 2019

У меня есть 5 разных изображений из этого пакета активов .

Я хочу использовать их в качестве фона на моем стартовом экране. Я просто хочу, чтобы они двигались (стиль параллакса) бесконечно.

Это изображения, а не спрайты, поэтому они отображаются на элементе canvas.

Теперь у меня проблемы с пониманием того, как их перемещать с 0 на 1920, чтобы они не покидали камеру. Я мог бы переместить их, но они выйдут из камеры.

Вот пример того, как я перемещаю один слой с сопрограммой:

public IEnumerator PlayParallax() {
        while (true) {
            imageContainer.GetComponentInChildren<Image>().transform.position = new Vector3(imageContainer.GetComponentInChildren<Image>().transform.position.x + 1, imageContainer.GetComponentInChildren<Image>().transform.position.y, imageContainer.GetComponentInChildren<Image>().transform.position.z);
            yield return new WaitForSeconds(0.1f);
        }   
    }

1 Ответ

0 голосов
/ 25 мая 2019

Я решил это, сделав копию каждого слоя. Например, layer_0 виден в поле зрения камеры, layer_0_0 находится слева. И двигаться, и когда layer_0 полностью покинул камеру, он помещается в начало и так далее:

public class ParalaxPlayer : MonoBehaviour {

    [SerializeField] GameObject imageContainer;

    public IEnumerator PlayParallax() {
        while (true) {
            // first layer
            imageContainer.GetComponentsInChildren<Image>()[0].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[0].transform.position.x + 0.3f, 
                imageContainer.GetComponentsInChildren<Image>()[0].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[0].transform.position.z);
            imageContainer.GetComponentsInChildren<Image>()[1].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[1].transform.position.x + 0.3f, 
                imageContainer.GetComponentsInChildren<Image>()[1].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[1].transform.position.z);

            if (imageContainer.GetComponentsInChildren<Image>()[0].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[0].transform.position = new Vector3(-1920, 0, 0);
            }

            if (imageContainer.GetComponentsInChildren<Image>()[1].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[1].transform.position = new Vector3(-1920, 0, 0);
            }

            // seconds layer
            imageContainer.GetComponentsInChildren<Image>()[2].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[2].transform.position.x + 0.7f,
                imageContainer.GetComponentsInChildren<Image>()[2].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[2].transform.position.z);
            imageContainer.GetComponentsInChildren<Image>()[3].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[3].transform.position.x + 0.7f, 
                imageContainer.GetComponentsInChildren<Image>()[3].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[3].transform.position.z);

            if (imageContainer.GetComponentsInChildren<Image>()[2].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[2].transform.position = new Vector3(-1920, 0, 0);
            }

            if (imageContainer.GetComponentsInChildren<Image>()[3].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[3].transform.position = new Vector3(-1920, 0, 0);
            }

            // third layer
            imageContainer.GetComponentsInChildren<Image>()[4].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[4].transform.position.x + 1.1f,
                imageContainer.GetComponentsInChildren<Image>()[4].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[4].transform.position.z);
            imageContainer.GetComponentsInChildren<Image>()[5].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[5].transform.position.x + 1.1f,
                imageContainer.GetComponentsInChildren<Image>()[5].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[5].transform.position.z);

            if (imageContainer.GetComponentsInChildren<Image>()[4].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[4].transform.position = new Vector3(-1920, 0, 0);
            }

            if (imageContainer.GetComponentsInChildren<Image>()[5].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[5].transform.position = new Vector3(-1920, 0, 0);
            }

            // fourth layer
            imageContainer.GetComponentsInChildren<Image>()[6].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[6].transform.position.x + 1.5f,
                imageContainer.GetComponentsInChildren<Image>()[6].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[6].transform.position.z);
            imageContainer.GetComponentsInChildren<Image>()[7].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[7].transform.position.x + 1.5f,
                imageContainer.GetComponentsInChildren<Image>()[7].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[7].transform.position.z);

            if (imageContainer.GetComponentsInChildren<Image>()[6].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[6].transform.position = new Vector3(-1920, 0, 0);
            }

            if (imageContainer.GetComponentsInChildren<Image>()[7].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[7].transform.position = new Vector3(-1920, 0, 0);
            }

            // fifth layer
            imageContainer.GetComponentsInChildren<Image>()[8].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[8].transform.position.x + 1.9f,
                imageContainer.GetComponentsInChildren<Image>()[8].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[8].transform.position.z);
            imageContainer.GetComponentsInChildren<Image>()[9].transform.position = new Vector3(imageContainer.GetComponentsInChildren<Image>()[9].transform.position.x + 1.9f,
                imageContainer.GetComponentsInChildren<Image>()[9].transform.position.y, imageContainer.GetComponentsInChildren<Image>()[9].transform.position.z);

            if (imageContainer.GetComponentsInChildren<Image>()[8].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[8].transform.position = new Vector3(-1920, 0, 0);
            }

            if (imageContainer.GetComponentsInChildren<Image>()[9].transform.position.x >= 1920) {
                imageContainer.GetComponentsInChildren<Image>()[9].transform.position = new Vector3(-1920, 0, 0);
            }

            yield return new WaitForSeconds(0.005f);
        }   
    }

    void Start() {
        StartCoroutine(PlayParallax());
    }

    void Update() {

    }
}
...