【Unity】视差无限滚动背景

视差背景实际上背景跟着摄像机移动,每一层背景都和摄像机移动的速度有一定的差值,就形成了视差。例如,摄像机移动了5格,第一层背景移动了两格,第二层背景移动了一格,就形成了视差。

先贴代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParallaxBackground : MonoBehaviour
{
    private Transform mainCameraTransform;//主相机的transform
    private Vector3 lastCameraPosition;//记录主相机上一帧的位置
    private float textureUnitSizeX;//获得背景图在项目中的单位长度

    public Vector2 bgMoveCoefficient;//背景相对于主相机移动长度系数

    // Start is called before the first frame update
    void Start()
    {
        mainCameraTransform = Camera.main.transform;//获得主相机transform
        lastCameraPosition = mainCameraTransform.position;

        Sprite sprite = GetComponent<SpriteRenderer>().sprite;
        Texture2D texture = sprite.texture;
        textureUnitSizeX = texture.width / sprite.pixelsPerUnit;//计算出纹理占多少个单位长度
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void LateUpdate()
    {
        Vector3 offsetPosition = mainCameraTransform.position - lastCameraPosition;
        transform.position += new Vector3(offsetPosition.x * bgMoveCoefficient.x, offsetPosition.y * bgMoveCoefficient.y, transform.position.z);
        lastCameraPosition = mainCameraTransform.position;

        //如果主摄像机和背景图x相差一个背景图的宽度
        if(Mathf.Abs(mainCameraTransform.position.x - transform.position.x) >= textureUnitSizeX)
        {
            float offsetPositionX = (mainCameraTransform.position.x - transform.position.x) % textureUnitSizeX;
            transform.position = new Vector3(mainCameraTransform.position.x + offsetPositionX, transform.position.y, transform.position.z);
        }
    }
}

视差效果

1.首先需要获取主相机的transform,并记录主相机的position,后续需要计算出每一帧摄像机移动了多少。

mainCameraTransform = Camera.main.transform;//获得主相机transform
lastCameraPosition = mainCameraTransform.position;

2.在LateUpdate()中持续计算每一帧主相机移动了多少,并让背景的位置加上这个值(备注:意思是主相机移动多少,背景图片移动多少),就得到了背景跟随着主相机移动的效果。

private void LateUpdate()
{
	Vector3 offsetPosition = mainCameraTransform.position - lastCameraPosition;
	transform.position += new Vector3(offsetPosition.x, offsetPosition.y, transform.position.z);
	lastCameraPosition = mainCameraTransform.position;
}

3.因为视差是每层背景图移动的长度不同,所以我们稍微改动一下上面的代码

private void LateUpdate()
{
	Vector3 offsetPosition = mainCameraTransform.position - lastCameraPosition;
	transform.position += new Vector3(offsetPosition.x * bgMoveCoefficient.x, offsetPosition.y * bgMoveCoefficient.y, transform.position.z);
	lastCameraPosition = mainCameraTransform.position;
}

这里的bgMoveCoefficient(Vector2类型)是指背景移动的值相对于主相机移动的值的百分比,比如你想让背景在x轴比主相机移动得慢一些,就把它的x值设置小于1。
4.将脚本挂在每一层背景上,并设置bgMoveCoefficient的值,就能的到视差效果。

无限滚动

1.将每一层背景的Draw Mode 设置为Tiled
在这里插入图片描述
设置这个的目的是在改变纹理的大小时,可以以纹理内容进行填充空白部分。
2.将Sprite的宽度增加到三个屏幕的大小,确保背景在移动的时候不会看到边界。
在这里插入图片描述
这里的无限滚动其实是在背景图边界快要进入主相机的范围时,将背景图的位置改变。所以代码中,我们需要先计算出纹理在游戏场景中占几个单位长度。

Sprite sprite = GetComponent<SpriteRenderer>().sprite;
Texture2D texture = sprite.texture;
//因为texture.width是图片实际的像素值,但是在游戏中,一单位长度可能不是一像素(看自己在项目中设置了多少)
//也就是说position移动1可能不止1像素,所以得求出纹理实际在项目场景中占了多少个单位
//也就是纹理在项目场景中的实际width
textureUnitSizeX = texture.width / sprite.pixelsPerUnit;//计算出纹理占多少个单位长度

2.在每一帧中判断背景图边界是否进入主相机范围,即将进入了,就重新设置背景图的位置

//如果主摄像机和背景图x相差一个背景图的宽度
//因为前面把纹理的width值设置成了三倍的大小,当主相机和背景图相差一个背景图宽度时,就表明边界即将进入主相机的拍摄范围。
if(Mathf.Abs(mainCameraTransform.position.x - transform.position.x) >= textureUnitSizeX)
{
	//因为有可能背景图和主相机相差不是刚好一个背景图的宽度,可能有些误差,所以在这里计算出误差
	float offsetPositionX = (mainCameraTransform.position.x - transform.position.x) % textureUnitSizeX;
	//重置背景图位置
	transform.position = new Vector3(mainCameraTransform.position.x + offsetPositionX, transform.position.y, transform.position.z);
}

就得到了无限滚动的背景图了!
如有哪里有误或者哪里写得不好,麻烦大佬们指点一二!感谢!感谢!

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity 中的无限循环滚动指的是在游戏中创建一个物体或背景等,让其在场景中无限循环滚动。这种效果可以在游戏中创建视差背景无限滚动的平台、道路或是背景音乐等方面起到很好的效果。 实现无限循环滚动的方式有很多种,下面以一个2D平台为例来说明: 首先,我们需要创建一个滚动背景物体,可以是一个长方形图片或者其他形状的物体。然后将其放在场景内的合适位置。 接下来,使用脚本控制滚动的逻辑。在脚本中,我们可以通过改变物体的位置来实现滚动效果。 要实现无限循环滚动效果,我们可以通过以下步骤: 1. 获取背景物体的宽度或长度,以确定每次滚动的距离。 2. 创建一个新的背景物体,并将其放在当前背景物体的后面,以实现无缝连接的效果。 3. 在Update函数中,每帧都向左移动背景物体一定的距离,并检查背景物体是否已经超出屏幕范围。 4. 如果背景物体已经完全离开了屏幕,就将其移动到当前背景物体的后面,形成循环滚动效果。 通过这种方式,不断移动和循环使用背景物体,就可以实现无限循环滚动效果。 当然,根据具体的需求,我们还可以根据游戏的逻辑来控制滚动的速度、方向以及触发滚动的条件等。同时,注意在性能方面的考虑,避免过多的无用计算和占用资源。 总结起来,通过在Unity中使用合适的脚本逻辑和循环操作,就可以实现无限循环滚动效果,为游戏增加更好的视觉体验。 ### 回答2: Unity中实现无限循环滚动可以通过以下步骤: 步骤1:创建滚动组件 首先,在Unity中创建一个滚动组件,可以使用ScrollRect组件(滚动视图)和Content(滚动内容)对象来实现。将需要无限循环的滚动项(例如图片、文本等)添加到Content对象中。 步骤2:设置滚动效果 通过调整ScrollRect组件的属性,可以设置滚动的速度、方向等参数。根据实际需求,设置滚动效果为水平或垂直方向。确保Content的大小大于滚动视图的大小,以便产生滚动效果。 步骤3:编写脚本 为了实现无限循环滚动,需要编写一个脚本。这个脚本在滚动项到达滚动边界时,会将该滚动项移动到对应的另一边,以产生无限循环的效果。 编写脚本时,需要监听滚动组件的滚动事件,当滚动事件触发时,判断滚动项是否到达滚动边界。如果到达边界,将该滚动项的位置移动到对应的另一边,从而实现无限循环滚动效果。 步骤4:应用脚本 将编写好的脚本挂载到滚动组件上,运行游戏时即可看到无限循环滚动效果。 通过以上步骤,我们可以在Unity中实现无限循环滚动。无论滚动项的数量多少,都能够实现循环滚动效果,提升用户体验。 ### 回答3: Unity中的无限循环滚动是指在游戏中实现一个背景或者其他元素无限滚动效果。这样可以给玩家带来一种连续的世界感,增加游戏的真实感。 要实现无限循环滚动,首先需要创建一个背景或者元素的材质(Material)。在这个材质中,我们可以将纹理(Texture)的平铺(Tiling)设置得很大,比如设置为(10, 1)。然后将这个材质应用到相应的模型或者Sprite上。 接下来,创建一个相机(Camera)并调整好它的位置和角度,使得它能够看到需要无限滚动背景或者元素。然后将这个相机的背景色设为和游戏场景中其他元素的颜色一致,这样背景和其他元素的过渡会更加自然。 然后,我们需要编写一个脚本(Script)来实现滚动效果。在脚本中,我们可以使用相机的位置信息来计算滚动的距离。当相机的位置超过了一定阈值,我们就将背景或者元素的位置重置到初始位置,从而实现无限循环滚动。这个阈值可以根据具体游戏需求进行调整。 最后,将这个脚本挂载到主角(或者相机)上,使得滚动效果与玩家的移动进行同步。 总的来说,实现Unity中的无限循环滚动可以通过创建材质、调整相机位置、编写脚本来实现。这样就能够给玩家带来一个连续的世界感,增加游戏的真实感。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值