/
arti4
/
CourseWork
Обзор
Документация
Войти
/
arti4
/
CourseWork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Scriptes/Parallax.cs
162 строки
4 KB
arti4
Загрузить файлы в «Scriptes»
01 июн 2025, 11:57
01 июн 2025, 11:57
9c49e8f
Код
Авторство
О чём код?
using UnityEngine; public class Parallax : MonoBehaviour { [SerializeField, Range(0f, 1f)] float parallaxStrength = 0.1f; [SerializeField] bool mirrorLayers; [SerializeField] Transform[] layers; // ������ ���� ����� ������� private float layerWidth; [SerializeField] Transform followingTarget; [Header("�������������� ��������")] [SerializeField] bool useCustomVelocity = false; [SerializeField] Vector2 customVelocity; private Vector3 targetPreviousPosition; void Start() { if (!followingTarget) { followingTarget = Camera.main.transform; } if (layers == null || layers.Length == 0) { layers = new Transform[transform.childCount]; for (int i = 0; i < transform.childCount; i++) { layers[i] = transform.GetChild(i); } } if (layers.Length > 1) { float distance = Mathf.Abs(GetLayerX(layers[1]) - GetLayerX(layers[0])); if (distance > 0) { layerWidth = distance; } } targetPreviousPosition = followingTarget.position; } void Update() { Vector3 delta; if (useCustomVelocity) { delta = new Vector3(customVelocity.x, 0f, 0f) * Time.deltaTime; } else { delta = followingTarget.position - targetPreviousPosition; delta.y = 0f; targetPreviousPosition = followingTarget.position; } foreach (var layer in layers) { if (layer.TryGetComponent(out RectTransform rectTransform)) { Vector2 anchoredDelta = new Vector2(delta.x * parallaxStrength, 0f); rectTransform.anchoredPosition += anchoredDelta; } else { layer.position += delta * parallaxStrength; } } HandleLayerLooping(); } //��������� ���� void HandleLayerLooping() { if (layers.Length < 2) return; Transform leftMostLayer = layers[0]; Transform rightMostLayer = layers[layers.Length - 1]; float leftX = GetLayerX(leftMostLayer); float rightX = GetLayerX(rightMostLayer); float targetX = followingTarget.position.x; if (targetX > rightX - layerWidth / 2) { SetLayerX(leftMostLayer, rightX + layerWidth); if (mirrorLayers) { FlipLayer(leftMostLayer); } ShiftLayersToRight(); } else if (targetX < leftX + layerWidth / 2) { SetLayerX(rightMostLayer, leftX - layerWidth); if (mirrorLayers) { FlipLayer(rightMostLayer); } ShiftLayersToLeft(); } } //��������� X float GetLayerX(Transform layer) { if (layer.TryGetComponent(out RectTransform rect)) return rect.anchoredPosition.x; else return layer.position.x; } //��������� � void SetLayerX(Transform layer, float x) { if (layer.TryGetComponent(out RectTransform rect)) { Vector2 pos = rect.anchoredPosition; pos.x = x; rect.anchoredPosition = pos; } else { Vector3 pos = layer.position; pos.x = x; layer.position = pos; } } //����� ������� ���� ������ void ShiftLayersToRight() { Transform firstLayer = layers[0]; for (int i = 0; i < layers.Length - 1; i++) { layers[i] = layers[i + 1]; } layers[layers.Length - 1] = firstLayer; } //����� ������� ���� ����� void ShiftLayersToLeft() { Transform lastLayer = layers[layers.Length - 1]; for (int i = layers.Length - 1; i > 0; i--) { layers[i] = layers[i - 1]; } layers[0] = lastLayer; } //���������� �� ������� void FlipLayer(Transform layer) { Vector3 scale = layer.localScale; scale.x *= -1; layer.localScale = scale; } }