Как мне запретить кнопке пользовательского интерфейса сбрасывать начальное условие при каждом нажатии? Unity3D

#c# #unity3d #uibutton #reset #renderer

#c# #unity3d #uibutton #Сброс #средство визуализации

Вопрос:

Ответ на логическую проблему, предоставленный @Mario ниже, также решил основную проблему


Код в исходном сообщении (под строкой) имел несвязанную проблему (‘==’ вместо ‘=’), но при исправлении этого я понял, что у меня возникла проблема со строковым именем ‘cubeRend.material’, которое включает в себя дополнительный экземпляр после него и поэтому, похоже, не считается логически равным строковому имени ‘material[0].’

Однако я не ДУМАЮ, что это проблема, стоящая за проблемой сброса, потому что я нашел вопрос о подобной проблеме сброса на форуме Unity answer здесь: https://answers.unity.com/questions/1303925/ui-buttons-images-resets-after-scene-reloads-scrip.html

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


Я пытаюсь заставить кнопку пользовательского интерфейса изменять цвета в кубе при каждом нажатии. Материалы находятся в массиве. В функции запуска я устанавливаю начальное условие средства визуализации куба на material[0]. В функции ChangeCubeColor (на которую ссылается инспектор кнопки пользовательского интерфейса) я использую простой оператор if / else, чтобы проверить, какой материал в данный момент назначен кубу. При нажатии кнопки Unity, похоже, сбрасывает материал обратно в исходное состояние, а затем незаметно для глаз следуйте инструкциям if / else, чтобы установить цвет на 2-й цвет в массиве. Эффект заключается в том, что при первом воспроизведении кнопка меняет цвет, но каждый раз после этого цвет застревает на втором цвете.

Вот мой код. Я приношу извинения за все инструкции отладки. Я пытался выяснить, когда состояние менялось или не менялось. Я также включил скриншот моей консоли при первом воспроизведении и первых 3 нажатиях кнопки. Наконец, код с инструкциями отладки удален для ясности.

Заранее спасибо за любые идеи.

 using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;

    Renderer cubeRend;
 
    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        cubeRend.material = material[0];   

        Debug.Log(cubeRend.material);
    }

    public void CubeColorChange()
    {
        if(cubeRend.material = material[0])
        {
            Debug.Log("cubeRend.material = material[0]");
            cubeRend.material = material[1];
            Debug.Log("Make 1:  " cubeRend.material);
            Debug.Log("cubeRend.material = material[1]");
        }
        else if (cubeRend.material = material[1])
        {
            Debug.Log("cubeRend.material = material[1]");
            cubeRend.material = material[0];
            Debug.Log("Make 0:  "   cubeRend.material);
            Debug.Log("cubeRend.material = material[0]");
        }
    }
}
  

Вход в консоль при первом воспроизведении и первых 3 нажатиях кнопки

 using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;

    Renderer cubeRend;
 
    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        cubeRend.material = material[0];   
    }

    public void CubeColorChange()
    {
        if(cubeRend.material = material[0])
        {
            cubeRend.material = material[1];
        }
        else if (cubeRend.material = material[1])
        {
            cubeRend.material = material[0];
        }
    }
}
  

Комментарии:

1. Я удивлен, что он скомпилирован — вам нужно использовать == для сравнения в ваших if заявлениях. = для назначения.

2. Ах да, у меня изначально было ‘==’, и я удалил его, пока пытался выяснить что-то еще, что было не так. Хм … теперь это вообще не входит в оператор if / then.

Ответ №1:

Попробуйте этот способ. Это работает для 2 материалов, если вы хотите больше, вы можете использовать индекс int и обновлять индекс без использования if для каждого материала

 using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;
    public bool state;

    Renderer cubeRend;
 
    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        cubeRend.material = material[0];
        //state = false is material 0 //state = true is material 1
        state = false;
    }

    public void CubeColorChange()
    {
        //Change the state to the other state
        state = !state;
        cubeRend.material = (state) ? material[1] : material[0];
        
    }
}
  

РЕДАКТИРОВАТЬ 1:

Вот вариант с индексом для получения дополнительных материалов

 using UnityEngine;

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;
    public int index;

    Renderer cubeRend;

    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        index = 0;
        cubeRend.material = material[index];        
    }

    public void CubeColorChange()
    {
        //Increase index
        index = (material.Length - 1 > index) ? index   1 : 0;
        cubeRend.material = material[index];
    }
}
  

Комментарии:

1. Это был ответ. Это решило не только логическую проблему, но и основную проблему. Я обновил свой вопрос, чтобы направить людей к вашему ответу.