【问题标题】:Infinite Parallax in Unity not working as intendedUnity 中的无限视差未按预期工作
【发布时间】:2021-01-19 17:58:49
【问题描述】:

这是一个疯狂的问题。如果您需要,请与我联系,并要求提供任何其他详细信息!

我尝试了来自this youtube tutorial 的本教程,以创建一个无限视差,它随着相机的移动而移动。首先,摄像机通过作为主摄像机的电影机锁定在玩家身上。

这是我的统一编辑器屏幕:

拆分图层以显示实际图层:

正如您所见,Background Parallax 图层中有这三个图层,这些图层是一个单独的视差场景,其中 sprite 被复制三次并彼此靠近放置。 [第 1、2 和 3 层是场景中复制的相同精灵集合]

层次结构中第 1、2 和 3 层的每个子对象只是一个精灵,例如:一棵树、灌木或下面的地面。

MainCamera 属性:

相机连接到四处移动的玩家身上。

当玩家向前移动时,当图层即将完成时,该图层不会被复制。简单地说,不是翻滚给人无限的感觉。

问题[在玩家向前移动时层没有“到达”在玩家面前]:

此外,我尝试通过进入场景来调试游戏,只是发现当我点击播放按钮时,所有三层都相互重叠,而不是它们的分布方式。他们只是堵塞了相机,如下所示:

我只是希望视差在我继续前进时是无限的,而不是像上面看到的那样看到破碎的场景。

附加到每个层的子(精灵)的视差代码(不包括第 1、2、3 层,因为它们只是用于整理层次结构的空对象):

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

public class Parallax : MonoBehaviour
{
    private float spriteLength, startpos;
    public GameObject cam;
    public float parallaxEffect;

    // Start is called before the first frame update
    void Start()
    {
        startpos = transform.position.x;
        spriteLength = GetComponent<SpriteRenderer>().bounds.size.x;       
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        float temp = (cam.transform.position.x * (1 - parallaxEffect));
        float dist = (cam.transform.position.x * parallaxEffect);      

        transform.position = new Vector3(startpos + dist, transform.position.y, transform.position.z);
        if (temp > startpos + spriteLength)
        {
            startpos += spriteLength;
        }
        else if (temp < startpos - spriteLength)
        {
            startpos -= spriteLength;
        }    
    }
}

上面的代码只是在玩家移动时沿 x 方向(左右)移动精灵。 我相信由于相机连接到播放器,层的滚动不会发生。只是一种预感。非常感谢任何帮助!

【问题讨论】:

  • 您为每一层的parallaxEffect 变量分配了哪些值?
  • 它是一个浮点值,例如:编辑器中精灵的SerializedField中的0.4值

标签: unity3d


【解决方案1】:

我相信你已经把这些颠倒了:

if (temp > startpos + spriteLength)
    {
        startpos += spriteLength;
    }
    else if (temp < startpos - spriteLength)
    {
        startpos -= spriteLength;
    }   

如果位置大于某个位置,则它会增加长度。这意味着它总是大于那个位置并且总是增加。另一边也一样。你需要的是:

if (temp > startpos + spriteLength)
    {
        startpos -= spriteLength;
    }
    else if (temp < startpos - spriteLength)
    {
        startpos += spriteLength;
    }   

【讨论】:

  • 这并不能解决问题。但我确实发现了一些东西,我相信由于精灵以不同的速度移动(视差效应),以较慢速度移动的精灵跟不上以更快速度移动的精灵。
【解决方案2】:

所以,我只是放弃了做这种视差的整个方法,而是找到了另一种做无限视差的方法。 youtube 上的这个tutorial 可以帮助您从头开始创建无限视差。

创建视差后,如果您遇到视差滞后或抖动的问题,您可以尝试以下技巧,看看它是否运行顺畅:

  • 尝试在 FixedUpdate() 和 LateUpdate() 之间交替使用
  • 尝试更改播放器上的插值(插值或外插或无)。尝试与上述步骤组合
  • 最后,这对我有用:尝试通过单击精灵而不是对象来更改精灵的像素大小。我的是 100,但是当我把它改成 64 时,它跑得像黄油一样光滑

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2022-08-07
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多