【发布时间】: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