Глючит реакция на нажатие в пределах триггера

Программирование на Юнити.

Глючит реакция на нажатие в пределах триггера

Сообщение Serafim3137 03 июн 2020, 12:34

Здравствуйте, я начинаю изучать Unity, и тут такая проблема. Сделал лампу с включением-выключением на клавишу клавиатуры при нахождении игрока в триггере, но оно работает нестабильно.
Когда игрок входит в триггер лампы, появляется сообщение, что он может с ней взаимодействовать. Выходит - пропадает. Пока игрок в триггере, нажатие клавиши включает/выключает лампу с изменением текстуры, однако некоторые нажатия порой будто игнорируются, и свет не переключается. Ниже приведён скрипт, повешенный на триггер.
Синтаксис:
Используется csharp
using System.Collections;           //Подключение системной библиотеки
using System.Collections.Generic;   //Подключение системной билиотеки
using UnityEngine;                  //Подключение библиотеки Unity

public class LightSwitch : MonoBehaviour
{
    public GameObject Light;//Публичная переменная для ссылки на объект источник света
    public GameObject Text; //Публичная переменная для ссылки на объект текст активации
    public GameObject Lamp; //Публичная переменная для ссылки на объект лампа

    //Публичные переменные для ссылок на материалы текстур для плафона
    //при включённом и выключенном свете
    public Material LightON, LightOFF;

    private Light SMR;      //Приватная переменная для сокращённого обращения
                            //к компоненту источник света
    private Renderer LghM;  //Приватная переменная для сокращённого обращения
                            //к компоненту Renderer, содержащему текстуры

    public KeyCode activateObj = KeyCode.E;//Назначение клавиши активации объекта

    //Событие, происходящее до того, как пройдёт первый кадр
    void Start()
    {
        //Скоращённое обращение к источнику света
        SMR = Light.GetComponent<Light>();
        //Сокращённое обращение к Renderer
        LghM = Lamp.GetComponent<Renderer>();
    }

    //Событие, происходящее каждый определённый отрезок времени
    void FixedUpdate()
    {
        //Если источник света включён
        if (SMR.enabled)
        {
            //Изменить текстуру плафона на включённый свет
            LghM.material = LightON;
        }
        //Если источник света выключен
        else
        {
            //Изменить текстуру плафона на выключённый свет
            LghM.material = LightOFF;
        }
    }

    //Событие наличия объекта с компонентом коллайдер в триггере
    void OnTriggerStay(Collider col)
    {
        //Если коллайдер - игрок
        if (col.tag == "Player")
        {
            Text.SetActive(true);//Активировать текст активации
            //При нажатии клавиши активации
            if (Input.GetKeyDown(activateObj))
            {
                useLight();//Вызвать пользовательскую функцию
            }
        }
    }

    //Событие выхода объекта с компонентом коллайдер из триггера
    void OnTriggerExit(Collider col)
    {
        //Если коллайдер - игрок
        if (col.tag == "Player")
        {
            //Деактивировать текст активации
            Text.SetActive(false);
        }
    }

    //Пользовательская функция для включения/выключения света лампы
    public void useLight()
    {
        //Если свет включен
        if (SMR.enabled)
        {
            SMR.enabled = false;//Выключить источник света
            //Изменить текстуру плафона на выключённый свет
            LghM.material = LightOFF;
        } else
        {
            SMR.enabled = true;//Включить источник света
            //Изменить текстуру плафона на включённый свет
            LghM.material = LightON;
        }
    }
}


Пробовал обходиться без кода в FixedUpdate, вместо enabled на свете использовать SetActive на объекте или не изменять текстуру при нажатии. Не влияет, иногда даже хуже становится. Изменение клавиши с клавиатуры на мышь не повлияло. Выключатель тут ни при чём, он просто включает и выключает компоненты света при нажатии независимо от ламп. Скрипт на триггерах ламп делает всё остальное. Подскажите, если знаете, в чём проблема.
Serafim3137
UNец
 
Сообщения: 2
Зарегистрирован: 03 июн 2020, 11:21

Re: Глючит реакция на нажатие в пределах триггера

Сообщение Xtir 05 июн 2020, 19:12

Вероятно, OnTriggerStay срабатывает не каждый кадр (но это не точно), поэтому и не получается уловить момент нажатия.
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

Re: Глючит реакция на нажатие в пределах триггера

Сообщение BornFoRdeatH 07 июн 2020, 01:33

Как минимум Input.GetKey нельзя использовать в обработке физики, результат будет непредсказуем. Перенесите обработку нажатия кнопок в Update
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Глючит реакция на нажатие в пределах триггера

Сообщение Serafim3137 24 июн 2020, 15:12

BornFoRdeatH писал(а):Как минимум Input.GetKey нельзя использовать в обработке физики, результат будет непредсказуем. Перенесите обработку нажатия кнопок в Update


Благодарю, сделал дополнительную булеву переменную, сделал её переключение при заходе/выходе в/из триггера, а Input.GetKey перенёс в Update с проверкой этой переменной, помогло
Serafim3137
UNец
 
Сообщения: 2
Зарегистрирован: 03 июн 2020, 11:21


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10