// Namespaces, deren Klassen wir verwenden
using System; // bietet Serializable
using System.Collections.Generic; // List<T>
using UnityEngine; // Alle Unity-spezifischen Klassen (Transform, MonoBehaviour usw.)

// Eine kleine serialisierbare Hilfsklasse für die Ebenen
[Serializable()]
public class ScrollLayer {

    // Geschwindigkeit des Scrolling für diese Ebene
    public float scrollFactor = 1F;
    
    // Referenz auf die Ebene
    public Transform layerRoot = null;
}

// Einfache Implementierung des Parallax Scrolling Effekts in Unity
public class ParallaxScroller : MonoBehaviour {

    // Liste der Ebenen, die gescrollt werden.
    public List<ScrollLayer> scrollLayers = new List<ScrollLayer>();

    // Die Kamera, die sich bewegt.
    public Camera movingCam;

    // Die letzte Kameraposition, um die Differenz zur aktuellen
    // Position ermitteln zu können. Wir brauchen nur (x, y).
    private Vector2 lastCameraPosition;

    // Awake() wird als erstes nach dem Laden der Szene aufgerufen
    public void Awake() {
        // Falls keine movingCam zugewiesen ist:
        // Hängen wir vielleicht an einer Kamera?
        if (movingCam == null) {
            movingCam = GetComponent<Camera>();
        }
        // Auch nicht? Ok, dann die Hauptkamera :-)
        if (movingCam == null) {
            movingCam = Camera.main;
        }
    }

    // Start() wird vor dem ersten Update aufgerufen, nachdem
    // Awake() bei allen Komponenten aufgerufen wurde
    // Die Kameraposition beim Szenenstart sichern.
    public void Start() {
        lastCameraPosition = movingCam.transform.position;
    }

    // Update() wird jeden Frame aufgerufen, bevor das nächste 
    // Bild gezeichnet wird
    // Ermittelt die Positionsdifferenz und bewegt die Ebenen
    // entsprechend rückwärts.
    public void Update() {
        // Die Differenz der Kamera-Position ermitteln
        Vector2 diff = lastCameraPosition - (Vector2)movingCam.transform.position;

        // Alle Ebenen anhand ihrer Geschwindigkeit bewegen
        foreach (ScrollLayer scrollLayer in scrollLayers) {
            scrollLayer.layerRoot.position
              -= scrollLayer.scrollFactor * (Vector3)diff;
        }

        // Die Kameraposition sichern, um im nächsten Frame
        // wieder die Differenz zur vorherigen Position ermitteln
        // zu können
        lastCameraPosition = movingCam.transform.position;
    }

}
