我正在制作一个统一的塔防游戏,但我卡住了。我希望我的枪或炮塔面对敌人,直到他们超出范围,但每0.5秒后它会更新并面对其范围内的另一个敌人,尽管第一个敌人也在范围内。需要帮助在c#游戏代码
这里是我的代码:
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,所以这可能不是正确的代码,但你会明白......) –
是的,这听起来像是他们不希望它不断地改变目标,所以保持一个“主动目标”变量将是一个好方法。另外,我强烈建议添加一个包围炮塔范围的箱子对撞机,并用它来限制你必须搜索的敌人数量。 https://unity3d.com/learn/tutorials/topics/physics/colliders-triggers可能是有趣的。 Unity内置了强大的空间索引功能,所以很愚蠢的是不利用它。如果甚至有内置的“最近邻居”算法,我也不会感到惊讶。 – drsimonz