Вопрос об изменении непрозрачности объектов с помощью кнопки пользовательского интерфейса - PullRequest
0 голосов
/ 09 февраля 2019

Внутри пустого игрового объекта есть 3 куба: redCube , blueCube , & greenCube .Каждый куб имеет свой собственный стандартный прозрачный материал: red_mat , blue_mat и green_mat .

Прикрепите скрипт к пустому игровому объекту и добавьте кнопку UI (нельзя использовать кнопку переключения) на сцену.При нажатии кнопки пользовательского интерфейса все 3 куба меняют непрозрачность с 1f до 0.5f.При повторном нажатии кнопки пользовательского интерфейса все 3 куба изменяют непрозрачность с 0.5f на 1f.

Проблема в том, что когда я нажимаю кнопку UI один раз, непрозрачность всех кубов становится 0.5f (пока все хорошо ...).Когда я снова нажимаю кнопку пользовательского интерфейса, непрозрачность всех кубов меняется на 1f, НО , все материалы кубов становятся белыми и не возвращаются к своему первоначальному цвету.Мне нужно, чтобы кто-то показал мне, как это работает.

Как изменить значение альфа-канала только при нажатии кнопки пользовательского интерфейса?Я пробовал общие материалы / общие материалы.Но это не сработало.Возможно я использовал это неправильно.

using UnityEngine;

public class OpacityController : MonoBehaviour
{

    public float opacity = 0.5f; //opacity control
    public Component[] renderer; //get all the children renderer component

    int i = 0; //toggle the button

    void Start()
    {
        renderer = GetComponentsInChildren<Renderer>();

    }

    public void OnOpacityButton()
    {
        Color color1 = GetComponent<Renderer>().material.color;
        color1.a = 0.5f;
        Color color2 = GetComponent<Renderer>().material.color;
        color2.a = 1f;

        i++;
        if (i % 2 == 1) //toggle the button
        {
            foreach (Renderer col in renderer)
                col.sharedMaterial.color = color1;

        } else
        {
            foreach (Renderer col in renderer)
                col.sharedMaterial.color = color2;
        }
    }
}

1 Ответ

0 голосов
/ 09 февраля 2019

Вы должны использовать material вместо sharedmaterial, если хотите изменить материал определенного игрового объекта.Я бы предложил использовать bool вместо int для отслеживания состояния переключения.

Я реорганизовал ваш код с некоторыми другими улучшениями и комментариями:

using UnityEngine;

public class OpacityController : MonoBehaviour
{
    public float opacity = 0.5f; //opacity control
    public Component[] renderers; //get all the children renderer component

    private bool toggle = false;

    private void Start()
    {
        renderers = GetComponentsInChildren<Renderer>();
    }

    public void OnOpacityButton()
    {
        // invert the toggle value
        toggle = !toggle;

        // select the opacity value using the trinary operator
        float newOpacity = toggle ? opacity : 1f;

        // assign the new opacity to all the renderers
        foreach (Renderer renderer in renderers)
        {
            // copy the current color and assign a new opacity to it.
            Color newColor = renderer.material.color; 
            newColor.a = newOpacity;

            // assign the new color to material rather than sharedmaterial to change only the current material
            renderer.material.color = newColor; 
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...