【发布时间】:2018-04-10 03:03:11
【问题描述】:
我正在统一制作塔防游戏,但我被卡住了。我希望我的枪或炮塔一直面对敌人,直到他们超出范围,但每 0.5 秒后,它会更新并面对其范围内的另一个敌人,尽管第一个敌人也在范围内。
这是我的代码:
void Start ()
{
InvokeRepeating("UpdateTarget", 0f , 0.5f );
}
void UpdateTarget()
{
GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTag);
float shortestDistance = Mathf.Infinity;
GameObject nearestEnemy = null;
foreach (GameObject enemy in enemies)
{
float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
if (distanceToEnemy < shortestDistance)
{
shortestDistance = distanceToEnemy;
nearestEnemy = enemy;
}
}
if (nearestEnemy != null && shortestDistance <= range)
{
target = nearestEnemy.transform;
}
else
{
target = null;
}
}
【问题讨论】:
-
也许一开始你应该检查是否已经有一个活动的目标,如果有,不要改变它。喜欢:
if (target != null && Vector3.Distance(transform.position, target.transform.position) <= range) return;(注意:我不了解 Unity,所以这可能不是正确的代码,但你明白了......) -
是的,听起来他们不希望它不断更改目标,因此维护“活动目标”变量将是一个好方法。另外,我强烈建议添加一个包围炮塔范围的盒子对撞机,并使用它来限制您必须搜索的敌人数量。 unity3d.com/learn/tutorials/topics/physics/colliders-triggers 可能会感兴趣。 Unity 内置了强大的空间索引功能,因此不利用它是愚蠢的。如果有内置的“最近邻”算法,我不会感到惊讶。