#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]");
}
}
}
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. Это был ответ. Это решило не только логическую проблему, но и основную проблему. Я обновил свой вопрос, чтобы направить людей к вашему ответу.