关于unity2D中游戏背景的无限延长

1.背景的移动

       原理:现在有一个背景,我们首先应在Start中获取它的初始位置(不在Update中获取是因为会一直更新坐标,导致背景起飞),以及对主摄像机的引用。如果一直保持背景xy坐标和摄像机xy的一致,看起来会有点怪。所以对摄像机的x坐标的数值进行一定程度的缩小,并将缩小后的坐标赋给背景。(具体情况具体分析,不一定非得是x,也不一定非得是缩小)

    private GameObject cam;

    [SerializeField] private float parallaxEffect;

    private float xPosition;


    void Start()
    {
        //也可选择不赋值,直接用Camera.main代替cam
        cam = GameObject.Find("Main Camera");

        xPosition = transform.position.x;
    }

    void Update()
    {
        float xDistanceToMove = cam.transform.position.x * parallaxEffect;
        transform.position = new Vector3(xPosition + xDistanceToMove, transform.position.y);
    }

        parallaxEffect是缩放的系数,为1就是背景一比一跟着摄像机动。


2.背景的无限延长(缩放系数小于1大于0)

        缩放系数在0-1时,背景前进的速度会小于摄像机的速度,因此需要在摄像机即将离开背景时进行操作使背景延续,且不影响连贯性。

        原理:缩放系数会导致背景的x坐标与摄像机的x坐标产生一定差距,当这个差距大于(往左走是小于)背景长度的n倍时(n的数值取决于背景坐标更新过几次),就可以对背景的x坐标进行操作。(同样的,具体情况具体分析)

    void Start()
    {
        //也可选择不赋值,直接用Camera.main代替cam

        cam = GameObject.Find("Main Camera");

        //获取一个初始位置,让背景不会因为一直刷新而起飞
        xPosition = transform.position.x;

        //获取背景长度
        length = GetComponent<SpriteRenderer>().bounds.size.x;
    }

    void Update()
    {
        float xOffest = cam.transform.position.x * (1 - parallaxEffect);
        float xDistanceToMove = cam.transform.position.x * parallaxEffect;

        transform.position = new Vector3(xPosition + xDistanceToMove, transform.position.y);

        //这里有xPosition,是因为差距一直在变大,虽然背景位置更新了,但差距的计算与背景的后续位置没什么关系,只和初始位置和缩放系数有关。
        //而且每一次背景位置更新就代表差距多一个length
        //举个例子,A开汽车,B骑自行车。在二者速度恒定,且A速度大于B的情况下。A与B的距离会一直变大,且每间隔一定时间,误差就会增加同样的数值(length)
        //而这个例子中,距离的大小只和二者速度之差以及初始位置有关,与二者位置无关。
        if (xOffest > xPosition + length)
        {
            xPosition += length;
        }
        else if (xOffest < xPosition - length)
        {
            xPosition -= length;
        }
    }
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值