无限移动的隧道未正确对齐

时间:2018-06-29 08:30:58

标签: c# unity3d

如果您能想象一款游戏,玩家将永远穿越隧道。为此,我的相机是静止的,隧道向后移动,给人以运动的感觉。

屏幕上总是有3个迷你隧道同时粘在一起,当一个隧道移出玩家视野时,会在前端产生一个新的隧道,使人觉得它是无限的。

这工作正常,除非删除了一条隧道。此后的隧道似乎停止移动一帧,这导致前面的隧道在其中移动并重叠,我不确定为什么。

每个隧道的长度恰好为116.25,默认情况下,第一个隧道在屏幕上显示。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main_container">
  <p contenteditable=true>Some text</p>
  <p contenteditable=true>Some text</p>
  <p contenteditable=true>Some text</p>
</div>

为什么要这样做?

2 个答案:

答案 0 :(得分:2)

在同时循环遍历数组的同时删除和添加数组绝不是一个好主意。

我建议另一种方法:

  1. 创建一个TunnelManager Empty,并附加一个脚本,该脚本会随机产生一部分Tunnel预制阵列。

  2. 为每个隧道预制脚本提供以下脚本:a)将其向下移动,b)到达端点(即116.25f)时将其自身删除。在此之前,应先将TunnelManager的“生成新隧道片段”方法调用为空。

像这样,不需要遍历每个帧并从中添加或删除数组。

答案 1 :(得分:1)

在单个框架中删除和实例化游戏对象可能相对昂贵,但是我不能说太多,因为他们不了解其几何形状,材质等。

不过,我能说的是,您删除和添加隧道的方式可能会导致一个隧道不会在每一帧都更新,而另一条隧道会更新两次

您正在执行以下操作:

for index i =0, do while i < the number of tunnels
  if the tunnel is too far away
    destroy it and create a new one, add it to the end of the list of tunnels
    reposition the tunnel at index i

如果您正在处理第二条隧道,并且距离太远,则会将其删除,并将新的隧道添加到列表的末尾。 重新放置它,然后我们转到列表中的下一项(这是您刚刚添加并已重新放置的隧道)

也许可以尝试用新的隧道替换当前索引处的项目,以免在迭代隧道时弄乱隧道的更新顺序。确保您为List<T>变量使用了tunnels,然后尝试以下操作:

        //do not call tunnels.RemoveAt(i); instead : 

        //And spawn the new one
        int randomTunnel = Random.Range(0, easyTunnels.Length);
        Vector3 startingPos = new Vector3(0, 0, newZPos);
        GameObject tunnel = Instantiate(levelsArray[level][randomTunnel]);
        tunnel.transform.position = startingPos;
        tunnels[i] = tunnel;

红利提示:同样,它只针对渲染的每一帧将它们移动特定的量。

由于每秒渲染的帧数是可变的,因此隧道部分的速度可能会随着帧速率而下降或跳跃。

尝试以下操作:

tunnelPos.position = new Vector3(tunnelPos.position.x, tunnelPos.position.y, zPos -= speed * Time.DeltaTime);