OverlapCircle не найдет игрока - PullRequest
0 голосов
/ 01 февраля 2020

Я пытался дать NPC игры, над которой я работаю, над способностью «чувствовать», когда Игрок находится рядом. Я создал этот скрипт, и по неизвестным причинам bool "found" остается false, а когда я автоматически устанавливаю его в true, он возвращается в false (он все равно отправляет позицию игрока в скрипт goTo, так что, по крайней мере, работает). Кто-нибудь знает, как решить эту проблему?

public class NPCLookForPlayerScript : MonoBehaviour {

public bool found;    //player found
public float awareness;   //how large is the circlecast
public int keepLooking; //for how much time, after losing sight of the player, he tries to keep on looking for him
public GameObject player;  //variable to lock on to the player
int timer;    //variable to decrement while player isn't in line of sight

NPCGoToScript goTo;

// Use this for initialization
void Start () {
    goTo = GetComponent<NPCGoToScript>();
}

// Update is called once per frame
void Update () {
    //he's always looking for the player
    Collider2D coll = Physics2D.OverlapCircle((Vector2)transform.position, awareness);

    //if the player is found, keep looking for him
    if (coll.gameObject == player)
    {
        found = true;
        timer = keepLooking;
    }

    //if the player was found, 
    if (found)
    {
        timer = timer - 1;    //less time to look for the player
        goTo.newPosition(player.transform.position);
    }

    //if the player is out of sight for too much time, stop looking for him
    if (timer <= 0)
    {
        found = false;
    }
}

void OnDrawGizmos()
{
    Gizmos.color = Color.green;

    Gizmos.DrawWireSphere((Vector2)transform.position, awareness);
}

}

Поскольку кто-то заставил меня заметить, что значения переменных не записаны в коде, позвольте мне прояснить: я работаю над единством, у этого скрипта есть c значения, которые могут быть изменены инспектором, что очень полезно, так как этот скрипт должен использоваться для разных типов NPC. Значит, значения не равны нулю. осведомленность = 5f и keepLooking = 20. На игровом поле есть игрок GameObject.

1 Ответ

0 голосов
/ 01 февраля 2020

Вы никогда не устанавливаете начальные значения ни для одного из своих полей:).

таймер объявляется, но никогда не устанавливается на что-либо, по сути, равное 0. Также осведомленность (ваш радиус) тоже никогда не устанавливается, поэтому по умолчанию 0.0f.

Итак, ваш код ...

  1. Выполняет Physics2D.OverlapCircle с радиусом ноль (т.е. без круга)

  2. Пропускает логи c в операторе coll == player, потому что нет круга для столкновения с игроком.

  3. Пропускает логи c в операторе found причина найдено ложно

  4. Затем выполняется лог c в операторе timer <= 0, в результате чего таймер равен 0 (никогда не определялся)

  5. Продолжает устанавливать найденный в ложное значение для каждого кадра, во веки веков, вечной спокойной ночи

Плеер, получающий данные преобразования, должен происходить только тогда, когда вы вручную устанавливаете значение true в инспекторе, а затем только для одного кадра, поскольку в следующем операторе он возвращается к значению false.

Вам необходимо указать значение для полей больше 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...