RaycastHit все возвращает true

329
09 марта 2017, 20:57

В моей 3d игре на юнити я нажимаю на объекты, после чего происходит какое-то действие. Для этого я определяю, что игрок смотрит на объект, что он достаточно близко, и что он нажал ЛКМ. Но если первое нажатие происходит без ошибок, то дальше для взаимодействия с объектом достаточно на него посмотреть, нажимать ЛКМ не нужно - это хочу исправить.

private Collider thisCollider; // коллайдер объекта, на который нажимаем
public int ActionNumber { get; private set; }
void Start ()
{
    thisCollider = GetComponent<Collider>();
}
void Update ()
{
    if (Input.GetButton("Fire1") && DoPlayerLookAtObject())
        ActionsList();
}
bool DoPlayerLookAtObject()
{
    int layerMask = 1 << 9; // игнорирую коллайдер игрока
    layerMask = ~layerMask;
    RaycastHit _hit;
    Ray _ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
    bool isHit = Physics.Raycast(_ray, out _hit, 2.0f, layerMask);        
    if (isHit && _hit.collider == thisCollider)
        return true; // здесь ошибка - все время возвращает true после первого нажатия на объект
    else
        return false;
}
public bool ActionsList()
{
    if (DoPlayerLookAtObject())
        switch (thisCollider.name)
        {
            // у каждого объекта, с которым взаимодействую, есть коллайдер,
            // уникальное имя и прикрепленный данный класс
            case "barthender":   ActionNumber = 1; return true;
            case "doorToStreet": ActionNumber = 2; return true;
            default: Debug.Log("Error: Out of range"); break;
        }
    return false;
}

К каждому объекту, с которым будет взаимодействие, прикрепляю верхний скрипт, а в другом классе проверяю, было-ли нажатие:

// для каждого объекта, на который будем нажимать, своя переменная
public OnMousePressCasino onMousePressCasinoBarthender;
public OnMousePressCasino onMousePressCasinoDoorToStreet;
// по номеру определяем, на какой объект ожидается нажатие
if (onMousePressCasinoBarthender.ActionNumber == 1 &&
    onMousePressCasinoBarthender.ActionsList())
    // do something
if (onMousePressCasinoDoorToStreet.ActionNumber == 2 &&
    onMousePressCasinoDoorToStreet.ActionsList())
    // do something
READ ALSO
Не работают команды контекстного меню

Не работают команды контекстного меню

Есть TreeView содержащий данные двух типовКаждый тип данных имеет своё контекстное меню

265
форматированный вывод c#

форматированный вывод c#

Как в данную строку вместо f4 - на место 4 подставить переменную в которую будет попадать нужное количество знаков

348
C# работа с базой данных MySQL (подключение)

C# работа с базой данных MySQL (подключение)

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

593
Asp.Net MVC. Смена сервера во время работы

Asp.Net MVC. Смена сервера во время работы

Проект AspNet MVC, который работает с базой данных MySQl с помощью EF 6

284