unity3d 如何在循环中跳过变换中已删除的项目?

bzzcjhmw  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(103)

我有一个代码,循环通过一个变换,并发送每个游戏对象在说变换到一个航点。这位工作正常。
当我使用碰撞删除一个游戏对象时,这个问题就出现了。在被删除的对象之后,在转换中索引的对象被抛出了航点路径。(在被删除的对象之前索引的对象仍然存在)。
我的问题是如何让ForLoop跳过Transform中删除的元素,这样程序就不会像这样"中断"。
我想可能有一个相当简单的解决方案,但我确实在网上看了看,关于这一点的文章很少。

private void MoveToNextWaypoint()
{
    for (int i = 0; i < targets.Count; i++)
    {
        var targetWaypointTransform = _waypoints[_nextWaypointIndex];
        targets[i].MoveTo(targetWaypointTransform.position, MoveToNextWaypoint);
        targets[i].transform.LookAt(_waypoints[_nextWaypointIndex].position);
        _nextWaypointIndex++;

        if (_nextWaypointIndex >= _waypoints.Count)
            _nextWaypointIndex = 0;
    }
}

(第一个目标[i]行上的断点)
谢谢你的帮助!
注意:对象不一定按顺序删除。

epggiuax

epggiuax1#

你的问题似乎可以归结为这样一句话:
如何让ForLoop跳过转换中删除的元素
答案是:

private void MoveToNextWaypoint()
{
    for (int i = 0; i < targets.Count; i++)
    {
        if (targets[i] == null) continue;
        var targetWaypointTransform = _waypoints[_nextWaypointIndex];
        targets[i].MoveTo(targetWaypointTransform.position, MoveToNextWaypoint);
        targets[i].transform.LookAt(_waypoints[_nextWaypointIndex].position);
        _nextWaypointIndex++;

        if (_nextWaypointIndex >= _waypoints.Count)
            _nextWaypointIndex = 0;
    }
}

注意for循环中的第一个条件,检查数组中的元素是否为null。重载的equality ==不仅检查项是否为null,还检查基础托管对象是否也设置为删除。
我们看不到你代码的大部分,但是你暗示你从Transform中获取数组,如果在这个框架中完成,可能在一小段时间内,仍然包含已经标记为销毁的项目。

相关问题