【问题标题】:Can't get my For loop or Foreach loop past the first item on the list无法让我的 For 循环或 Foreach 循环超过列表中的第一项
【发布时间】:2020-06-20 11:37:13
【问题描述】:

我是这里的初学者,并试图寻找没有运气的解决方案。我试图通过标签和优先目标标签找到最近的对象。由于某种原因,循环不会超过列表中的第一项。这是我所拥有的:

public string[] PriorityTargets;
public float Range;

public GameObject projectileTarget;

void LateUpdate()
{
    float distanceToTarget;
    Debug.Log(PriorityTargets.Length);

    for (int i = 0; i <= PriorityTargets.Length; i++)
    {
        Debug.Log(PriorityTargets[i]);
        Debug.Log(i);

        GameObject Target = FindClosestTarget(PriorityTargets[i]);
        if (Target)
        {
            distanceToTarget = Vector3.Distance(transform.position, Target.transform.position);
            if (distanceToTarget <= Range)
            {
                projectileTarget = Target;
                Debug.Log("About to Break");
                break;
            }
        }
    }
}

调试器显示:

  • array.length 3
  • i 0
  • 仅字符串第一项

场景中没有带有 PriorityTargets[0] 标签的对象,所以它应该继续前进并在 PriorityTargets[1] 上中断。

此外,控制台永远不会显示“即将中断”。

这里是 FindClosestTarget 代码:

GameObject FindClosestTarget(string TargetTag)
{
    GameObject[] gos = GameObject.FindGameObjectsWithTag(TargetTag);

    GameObject closest = null;
    float distance = Mathf.Infinity;
    Vector3 position = transform.position;
    foreach (GameObject go in gos)
    {
        Vector3 diff = go.transform.position - position;
        float curDistance = diff.sqrMagnitude;

        if (curDistance < distance)
        {
            closest = go;
            distance = curDistance;
        }
    }

    return closest;

}

在 VisualStudio 中调试后,我得到的一些异常如下:

UnityEngine.UnassignedReferenceException: gadgetProjectile 的变量 projectileTarget 尚未分配。 您可能需要在检查器中分配 gadgetProjectile 脚本的 projectileTarget 变量。

UnityEngine.UnassignedReferenceException: gadgetProjectile 的变量 projectileTarget 尚未分配。 您可能需要在检查器中分配 gadgetProjectile 脚本的 projectileTarget 变量。

还有其他例外,但我不确定它们是否相关。如果存在带有第一个标签的目标,则脚本可以正常工作。

【问题讨论】:

  • 您的FindClosestTarget 代码可能有误。在您的问题中也包含该功能作为编辑。
  • 我不知道这是否是实际问题,但应该是if (Target !=null)
  • @Scott 刚刚添加,谢谢。
  • @pero 我相信在 Unity 中使用 if (Target) 效果更好
  • 如果您确实没有看到第 2/3 个数组成员的迭代,您可能有一个未捕获的异常。否则,我希望会出现中断消息。你试过用你的 IDE 调试它吗?

标签: c# for-loop unity3d foreach


【解决方案1】:

感谢您对我的耐心并推动我找到解决方案。

尝试在空项目中复制后,我发现了问题。

引用标签时,请确保您在 PriorityTargets[] 中使用的标签实际上是在 Unity 中定义的。

含义,如果你设置 PriorityTarget[0] 到像“dfsdsfsd”这样的随机名称,并且该名称不是项目中的现有标签,脚本将无法工作。

干杯

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多