1. 代码
    row
    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
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class ParallaxBackground : MonoBehaviour
    {
    private GameObject cam; // 相机对象,用于获取相机的位置
    [SerializeField] private float parallaxEffect; // 视差效果的强度,控制背景移动的速度
    private float xPosition; // 背景的初始x轴位置
    private float length; // 背景图像的长度,用于循环背景

    // Start 在游戏开始时调用一次
    void Start()
    {
    cam = GameObject.Find("Main Camera"); // 找到名为 "Main Camera" 的游戏对象,并将其赋值给 cam

    length = GetComponent<SpriteRenderer>().bounds.size.x; // 获取背景图片的长度(x轴方向),用于判断何时循环背景

    xPosition = transform.position.x; // 记录背景的初始 x 轴位置
    }

    // Update 每帧都会调用一次
    void Update()
    {
    float distanceMoved = cam.transform.position.x * (1 - parallaxEffect);
    // 计算相机移动的距离(乘以1减去视差效果)

    float distanceToMove = cam.transform.position.x * parallaxEffect;
    // 根据相机的 x 轴位置和视差效果计算背景应移动的距离

    transform.position = new Vector3(xPosition + distanceToMove, transform.position.y);
    // 更新背景的位置,使其在 x 轴上移动,y 轴保持不变

    if (distanceMoved > xPosition + length)
    {
    xPosition = xPosition + length;
    // 如果相机移动的距离超过背景的当前 x 位置加上背景长度,就将背景 x 位置加上一个背景长度,实现循环效果
    }
    else if (distanceMoved < xPosition - length)
    {
    xPosition -= length;
    // 如果相机移动的距离小于背景的当前 x 位置减去背景长度,就将背景 x 位置减去一个背景长度,实现循环效果
    }
    }
    }