miepzerino
2025-04-05 ad8af928065a506d0d28f98d51222d7afa1f47e2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class BackgroundManager : MonoBehaviour
{
    [System.Serializable]
    public class BackgroundLayer
    {
        public float yThreshold;
        public Sprite backgroundSprite;
        [Range(0f, 1f)] public float parallaxEffect = 0.5f;
    }
 
    [SerializeField] private SpriteRenderer spriteRenderer;
    [SerializeField] private SpriteRenderer transitionRenderer; // Add this field
    [SerializeField] private BackgroundLayer[] backgroundLayers;
    [SerializeField] private float transitionDuration = 1f;
    private bool isTransitioning = false; // Add this field
 
    private Transform cameraTransform;
    private Vector3 lastCameraPosition;
    private int currentLayerIndex = 0;
    private float startPositionX;
 
    private void Start()
    {
        cameraTransform = Camera.main.transform;
        lastCameraPosition = cameraTransform.position;
        startPositionX = transform.position.x;
 
        if (spriteRenderer == null)
            spriteRenderer = GetComponent<SpriteRenderer>();
 
        // Set initial background
        if (backgroundLayers != null && backgroundLayers.Length > 0)
            spriteRenderer.sprite = backgroundLayers[0].backgroundSprite;
 
        if (transitionRenderer == null)
        {
            var transitionObj = new GameObject("TransitionLayer");
            transitionObj.transform.parent = transform;
            transitionObj.transform.localPosition = new Vector3(0, 0, -2); // Set Z to -2
            transitionObj.transform.localScale = Vector3.one; // Match scale
            transitionRenderer = transitionObj.AddComponent<SpriteRenderer>();
            transitionRenderer.sortingOrder = spriteRenderer.sortingOrder + 1;
            transitionRenderer.sortingLayerName = spriteRenderer.sortingLayerName; // Match background layer
        }
        transitionRenderer.color = new Color(1, 1, 1, 0); // Start fully transparent
    }
 
    private void Update()
    {
        // Calculate parallax movement
        Vector3 cameraDelta = cameraTransform.position - lastCameraPosition;
        Vector3 newPosition = transform.position;
 
        // Update X position with parallax
        float parallaxX = (cameraTransform.position.x - startPositionX) * GetCurrentParallaxEffect();
        newPosition.x = startPositionX + parallaxX;
 
        // Update Y position to follow camera
        newPosition.y = cameraTransform.position.y;
 
        transform.position = newPosition;
 
        // Check for background change
        float currentY = cameraTransform.position.y;
        int newLayerIndex = currentLayerIndex;
 
        for (int i = 0; i < backgroundLayers.Length; i++)
        {
            if (currentY > backgroundLayers[i].yThreshold)
            {
                newLayerIndex = i;
                break;
            }
        }
 
        if (newLayerIndex != currentLayerIndex && !isTransitioning) // Add transition check
        {
            StartCoroutine(TransitionBackground(backgroundLayers[newLayerIndex].backgroundSprite));
            currentLayerIndex = newLayerIndex;
        }
 
        lastCameraPosition = cameraTransform.position;
    }
 
    private float GetCurrentParallaxEffect()
    {
        if (backgroundLayers == null || backgroundLayers.Length == 0)
            return 0.5f;
        return backgroundLayers[currentLayerIndex].parallaxEffect;
    }
 
    private IEnumerator TransitionBackground(Sprite newSprite)
    {
        if (isTransitioning) yield break;
        isTransitioning = true;
 
        // Setup transition renderer
        transitionRenderer.sprite = newSprite;
        transitionRenderer.transform.localPosition = Vector3.zero;
 
        // Fade in new sprite over old one
        float elapsedTime = 0;
        while (elapsedTime < transitionDuration)
        {
            elapsedTime += Time.deltaTime;
            float alpha = elapsedTime / transitionDuration;
            transitionRenderer.color = new Color(1, 1, 1, alpha);
            yield return null;
        }
 
        // Switch the sprites
        spriteRenderer.sprite = newSprite;
        transitionRenderer.color = new Color(1, 1, 1, 0);
 
        isTransitioning = false;
    }
}