Невозможно переключить световой компонент в Unity 3D - PullRequest
0 голосов
/ 13 июля 2020

У меня есть скрипт, прикрепленный к led1, как показано на изображении ниже. Его единственная цель - обнаружить, когда я щелкаю светодиод и включаю дочерний светодиод led1. Обнаружение щелчка светодиода отлично работает с Raycast, однако попытка включения и выключения светодиода не работает с простым light.enabled = !light.enable, но работает работать, если я сделаю light.enabled = true или light.enabled = false. Это меня так сильно смущает, потому что я не вижу причин для этого. Кто-нибудь знает, почему я не могу просто переключить его?

введите описание изображения здесь

Этот код никоим образом не работает для включения чего-либо.

void Update()
{
    // On left mouse click 
    const int left_mouse_click = 0;
    if (Input.GetMouseButtonDown(left_mouse_click))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        
        if (Physics.Raycast(ray, out hit, 600.0f))
        {
            if (hit.transform != null)
            {
                GameObject led = hit.transform.gameObject;
                Light light = led.transform.GetChild(light_source_child).GetComponent<Light>();

                // This code does not work for anything
                light.enabled = !light.enabled;
}

Этот код работает для включения светодиода, но, конечно, не выключается снова.

void Update()
{
    // On left mouse click 
    const int left_mouse_click = 0;
    if (Input.GetMouseButtonDown(left_mouse_click))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit, 600.0f))
        {
            if (hit.transform != null)
            {
                GameObject led = hit.transform.gameObject;
                Light light = led.transform.GetChild(light_source_child).GetComponent<Light>();

                // Works for turning LED on
                light.enabled = true;
}

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

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Что делать, если вы не получаете компонент Light, а вместо этого замените его компонентом GameObject.

Старый код:

GameObject led = hit.transform.gameObject;
Light light = led.transform.GetChild(light_source_child).GetComponent<Light>();

Новый код с использованием преобразования:

foreach (Transform child in hit.transform)
    //Assigns the first child of the Hit Game Object
    GameObject light = child.GetChild(0).gameObject;

Отключить / включить GameObejct:

// This code should work now
light.SetActive(!light.activeSelf);
0 голосов
/ 14 июля 2020

Я решил проблему. У меня есть несколько светодиодных объектов, и у меня есть сценарий, связанный с каждым из них. Это заставило его выполнить 64 раза, и технически код работал, но, будучи четным числом, казалось, что ничего не происходит, и это, очевидно, было подвержено ошибкам. Таким образом, перемещение скрипта на верхний родительский объект и использование кода light.enable = !light.enable; сработало!

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