如果您能想象一款游戏,玩家将永远穿越隧道。为此,我的相机是静止的,隧道向后移动,给人以运动的感觉。
屏幕上总是有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>
为什么要这样做?
答案 0 :(得分:2)
在同时循环遍历数组的同时删除和添加数组绝不是一个好主意。
我建议另一种方法:
创建一个TunnelManager Empty,并附加一个脚本,该脚本会随机产生一部分Tunnel预制阵列。
为每个隧道预制脚本提供以下脚本: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);