Когда игрок входит в триггер лампы, появляется сообщение, что он может с ней взаимодействовать. Выходит - пропадает. Пока игрок в триггере, нажатие клавиши включает/выключает лампу с изменением текстуры, однако некоторые нажатия порой будто игнорируются, и свет не переключается. Ниже приведён скрипт, повешенный на триггер.
Синтаксис:
Используется 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;
}
}
}
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 на объекте или не изменять текстуру при нажатии. Не влияет, иногда даже хуже становится. Изменение клавиши с клавиатуры на мышь не повлияло. Выключатель тут ни при чём, он просто включает и выключает компоненты света при нажатии независимо от ламп. Скрипт на триггерах ламп делает всё остальное. Подскажите, если знаете, в чём проблема.