У меня есть проблемы со сценарием для «Fiel Of View» врага. После просмотра учебника, чтобы создать поле зрения для игрока, я думал, что могу переключить его на врагов, чтобы они обнаружили игрока и сделали некоторые другие вещи. Я создал логическую переменную «playerInRange», чтобы определить, обнаруживает ли враг игрока и устанавливает ли эта переменная значение true или false. Он отлично работает с одним врагом. Когда я добавляю еще один, новый враг не обнаружит игрока. Возможно, это связано с сопрограммой, но я не уверен. Может быть, у вас есть намек на меня. Вот немного моего кода (я удалил большую часть комментариев, чтобы сделать его немного меньше):Поле зрения для врага работает только с 1 противником
void Start() {
StartCoroutine("FindTargetsWithDelay", .2 f);
}
IEnumerator FindTargetsWithDelay(float delay) {
while (true) {
yield
return new WaitForSeconds(delay);
FindVisibleTargets();
}
}
public void FindVisibleTargets() {
visibleTargets.Clear();
Collider[] targetsInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, targetMask);
for (int i = 0; i < targetsInViewRadius.Length; i++) {
Transform target = targetsInViewRadius[i].transform;
Vector3 dirToTarget = (target.position - transform.position).normalized;
if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle/2) {
float dstToTarget = Vector3.Distance(transform.position, target.position);
if (!Physics.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask)) {
// Not so nice solution!
// The movement should be in a separate script!
visibleTargets.Add(target);
nav.SetDestination(player.position);
anim.SetBool("IsRunning", true);
if (dstToTarget < attackRange) {
playerInRange = true;
Debug.Log(playerInRange);
}
}
} else {
anim.SetBool("IsRunning", false);
playerInRange = false;
Debug.Log(playerInRange);
}
}
}
OverlapSphere имеет targetMask, является ли эта переменная установлена правильно игрока слой? – Rob
Привет Роб, спасибо за ваш комментарий. targetMask настроен правильно (для моей точки зрения): ** public LayerMask targetMask; ** Я могу выбрать, какой слой является целевым слоем. Первый враг отлично работает с ним, но не второй.:/ – t3chnico
Вы надеваете «Я говорю, что вы добавили еще один». Я подозреваю, что вы не читали, что этот скрипт делает подсказку: если первый враг видит игрока, а второй - нет, что происходит? ... как насчет того, если сначала НЕ видит игрока , но второй делает?) – Adam