【发布时间】:2021-08-23 19:03:51
【问题描述】:
我有一个双面游戏,炮塔需要找到最近的目标并带有特定标签。
LeftPlayer 有 3 个标签,用于 3 种不同的敌人类型。 RightPlayer 有 3 个标签,用于 3 种不同的敌人类型。 所以总共有 6 个标签,每个 Player 3 个。
目前我正在使用 Udemy 的 RealmRush 课程中的 FindClosestTarget 方法,该方法几乎可以正常工作,但遗憾的是双方的炮塔都针对所有 6 种敌人类型。这就是为什么我试图找到一个使用标签的解决方案。
我可以举出前面提到的 Udemy RealmRush 方法的例子,它可能是可挽救的,并且可以为每一方拆分成单独的脚本,但我不知道该怎么做。该脚本还包含我注释掉的使其基于标签的失败尝试。无论我在哪里寻找解决方案,我都只找到一个标签的示例,该标签也无法正常工作。如果您认为它可以比当前版本更容易保存,我很乐意这样做。
using Vector3 = UnityEngine.Vector3;
public class TargetLocator : MonoBehaviour
{
[SerializeField] Transform weapon;
[SerializeField] ParticleSystem projectileParticles;
[SerializeField] float range = 1.5f;
[SerializeField] Transform enemy;
//public GameObject Target;
public float maxDistance;
void Update()
{
/*Target = FindClosestEnemy();
range = Vector3.Distance(transform.position, Target.transform.position);
if (maxDistance < range)
{
FindClosestEnemy();
}*/
FindClosestTarget();
AimWeapon();
}
/*public GameObject FindClosestEnemy()
{
Enemy[] enemies;
enemies = GameObject.FindGameObjectsWithTag("LeftBrute");
GameObject closest;
float maxDistance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (Enemy enemy in enemies)
{
Vector3 diff = enemy.transform.position - position;
float currentDistance = diff.sqrMagnitude;
if (currentDistance < maxDistance)
{
closest = Target;
maxDistance = currentDistance;
}
}
return Target;
}*/
void FindClosestTarget()
{
Enemy[] enemies = FindObjectsOfType<Enemy>();
Transform closestTarget = null;
float maxDistance = Mathf.Infinity;
foreach (Enemy enemy in enemies)
{
float targetDistance = Vector3.Distance(transform.position, enemy.transform.position);
if (targetDistance < maxDistance)
{
closestTarget = enemy.transform;
maxDistance = targetDistance;
}
}
enemy = closestTarget;
}
public void AimWeapon()
{
float maxDistance = Vector3.Distance(transform.position, enemy.transform.position);
if (maxDistance < range)
{
weapon.LookAt(enemy.transform.position);
Attack(true);
}
else
{
Attack(false);
Debug.Log("Target not found");
}
}
public void Attack(bool isActive)
{
var emissionModule = projectileParticles.emission;
emissionModule.enabled = isActive;
}
}
【问题讨论】:
-
我没有看到你在哪里检查代码中的标签...
-
正如帖子中提到的,它在注释掉的部分。它读作敌人 = GameObject.FindGameObjectsWithTag("LeftBrute");或者你是什么意思?
-
但是我理解错了吗,还是一个炮塔只跟随一个标签?为什么在一个脚本中需要所有三个标签?
-
因为在任何给定时间,地图上的炮塔都可能有 3 种潜在的目标类型(标签)。我希望 TargetLocator 脚本将这 3 个标签作为一组处理,然后始终以最接近炮塔的那个为目标。由于我有两个方面,应该分别处理(LeftPlayer 和 RightPlayer),我不能使用 Udemy 的方法,它完全忽略了哪个标签属于哪个播放器,因为它没有使用任何标签。由于我找不到任何与我需要的东西相似的东西,所以我来这里寻求帮助。如果您还有任何问题,请告诉我。