【Unity2D】背景分层实现

        2D游戏如果只有一层背景显得比较单调,为了提现更强的空间感,可以通过添加多个背景层,并且让背景层随着角色的移动而缓慢移动,距离近的背景层移动较快,反之移动较慢。代码实现如下:

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

public class LayeringBackground : MonoBehaviour
{
    private void Awake()
    {
        _cam = Camera.main.transform;
    }

    void Start()
    {
        _preCamPos = _cam.position;

        _parralaxScales = new float[_backgrounds.Length];
        for(int i = 0; i < _parralaxScales.Length; ++i)
        {
            _parralaxScales[i] = Mathf.Pow(_bgMoveScaleFactor, i + 1);
        }

        // 判断背景是否作为了相机的子物体
        _bFollowCamera = new bool[_backgrounds.Length];
        for(int i = 0; i < _backgrounds.Length; ++i)
        {
            if (_cam == _backgrounds[i].parent)
                _bFollowCamera[i] = true;
            else
                _bFollowCamera[i] = false;
        }
    }

    void Update()
    {
        for(int i = 0; i < _backgrounds.Length; ++i)
        {
            float offsetX = (_preCamPos.x - _cam.position.x) * _parralaxScales[i];
            Vector3 offset2Camera = _cam.position - _preCamPos;
            var targetPos = _backgrounds[i].position;

            // 背景跟随相机移动
            if (!_bFollowCamera[i])
            {
                targetPos += offset2Camera;
            }
            targetPos.x += offsetX;
            _backgrounds[i].position = targetPos;
        }

        _preCamPos = _cam.position;
    }

    [Header("前面的移动快,后面的移动慢")]
    public Transform[] _backgrounds;
    public float _bgMoveScaleFactor = 0.25f;

    float[] _parralaxScales;
    private Transform _cam;
    private Vector3 _preCamPos;
    bool[] _bFollowCamera;
}

效果图:

不同背景层的移动速度不同。

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现Unity2D背景滚动,可以按照以下步骤: 1. 创建一个空对象作为背景对象,将需要用作背景的素材(例如图片或精灵)作为子对象添加到该对象中。 2. 给背景对象添加一个新的脚本(例如“BackgroundScroller”),在该脚本中添加以下代码: ```c# public class BackgroundScroller : MonoBehaviour { public float scrollSpeed; private Vector2 savedOffset; private Renderer renderer; void Start() { renderer = GetComponent<Renderer>(); savedOffset = renderer.sharedMaterial.GetTextureOffset("_MainTex"); } void Update() { float x = Mathf.Repeat(Time.time * scrollSpeed, 1); Vector2 offset = new Vector2(x, savedOffset.y); renderer.sharedMaterial.SetTextureOffset("_MainTex", offset); } void OnDisable() { renderer.sharedMaterial.SetTextureOffset("_MainTex", savedOffset); } } ``` 3. 在“BackgroundScroller”脚本中,将“scrollSpeed”参数设置为背景滚动的速度(例如0.5表示半秒钟滚动一次),并将“renderer”设置为背景对象的渲染器。 4. 在“Update”函数中,使用“Mathf.Repeat”函数计算当前时间的重复值,并将其设置为背景材质的偏移量。这将使背景材质在“X”轴上滚动,而“savedOffset”变量将保存背景材质的原始偏移量。 5. 在“OnDisable”函数中,将背景材质的偏移量重置为初始值,以确保背景对象在重新启用时有正确的初始状态。 6. 将“BackgroundScroller”脚本添加到背景对象中,然后运行游戏,即可看到背景对象按照设置的速度滚动。 希望这个步骤能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值