Система обнаружения игроков Unity не очень точна - PullRequest
0 голосов
/ 02 декабря 2018

Я написал код для системы обнаружения игроков.У меня есть босс, который будет продолжать искать позицию игрока, и как только игрок окажется в пределах определенного радиуса триггера сферического коллайдера, игрок будет обнаружен.Это делается с помощью raycast и OnTriggerStay и OnTriggerExit.

Проблема в том, что система обнаружения игроков не очень точна, поэтому иногда она работает, а иногда нет.Кажется, я не могу найти или понять, почему.

Вот часть кода (представляющая интерес), которую я написал:

 void OnTriggerStay(Collider other)
{
    if (other.gameObject.tag == "player")
    {

        playerDetected = false;

        Vector3 direction = other.transform.position - transform.position;
        float angle = Vector3.Angle(direction, transform.forward);

        Debug.DrawRay(transform.position + transform.up / 2, direction, Color.green);

        if (angle < fieldOfView)
        {

            RaycastHit hit;

            //if (Physics.Raycast(transform.position + transform.up / 2, direction, out hit, col.radius, ignoreRaycast))

            if (Physics.Raycast(transform.position + transform.up / 2, direction,out hit, col.radius))
            {
                if (hit.collider.gameObject.tag == "player")
                {
                    playerDetected = true;
                }
            }
        }
    }
}

void OnTriggerExit(Collider other)
{
    if (other.gameObject.tag == "player")
    {
        playerDetected = false;

    }
}

, а это полный код: https://pastebin.com/YZH9Fc99

Это покажет вам поведение (посмотрите, как включается и отключается тиканье PlayerDetected) https://gyazo.com/74961847eca520a335d18c194201d0c2

1 Ответ

0 голосов
/ 02 декабря 2018

Итак, я понял, что у игрока был меч с триггером-коллайдером.Когда она двигается, меч находится над коллайдером, и он не может его обнаружить.Это было решено путем добавления слоя к игроку и игнорирования всего, кроме слоя игрока.

add

public LayerMask ignoreRaycast;

Заменить

 if (Physics.Raycast(transform.position + transform.up / 2, direction,out hit, col.radius))

на

 if (Physics.Raycast(transform.position + transform.up / 2, direction,out hit, col.radius,ignoreRaycast))

Для ignoreRaycast выберите просто слой игрока

...