YAVAY
@YAVAY
Я пожилая креветка

Как из нескольких клеток выделять только 1?

Делаю шахматы на Unity. Проблема с выделением клетки.
Идея такова: при нажатии на клетку она каким-нибудь цветом выделяется, а при повторном нажатии возвращается к изначальному цвету. Но если я выделил одну клетку, а потом нажал на другую выделяется другая, а первая не возвращается к изначальному цвету. Не могу понять как это реализовать. Помогите пожалуйста.

Код скрипта выделения:
public class LightOn : MonoBehaviour
{
    public GameObject lastChaged; // ранее выделенная фигура 
    // GameObject который в теории ссылается на предыдущую выделенную клетку 
    // и если изменить его цвет, то изменится и цвет предыдущей клетки

    public Material matChange; // цвет выделения (зелёный)
    Material myMat; // дефолтный цвет (чёрный / белый)


    private void Start()
    {
        myMat = GetComponent<Renderer>().material; // узнаём изначальный цвет клетки
    }


    public void OnMouseUp() // нажимаем на клетку
    {
        if (myMat == GetComponent<Renderer>().material) // если цвет объекта чёрный или белый
        {

            if (lastChaged != null) // проверка выделялалсь ли до этого какая-то фигура
            {
                //lastChaged.ResetColor(); // меняем цвет последней фигуры на дефольный
                lastChaged.GetComponent<Renderer>().material = myMat;
            }

            lastChaged = this.gameObject; // данная фигура стала прошлой

            GetComponent<Renderer>().material = matChange; // выделяем данную фигуру

            
        }
        else // установка изначального цвета
        {
            ResetColor(); // сброс цвета выделенной кнопки
        }
        
    }

    // сброс цвета
    public void ResetColor()
    {
        GetComponent<Renderer>().material = myMat;

    }

}
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
Давайте попробую попробовать пояснить суть))
LightOn - скрипт висит у вас видимо на каждой клетке.

и на каждой клетке есть поле/ссылка - public GameObject lastChaged.

и одна клетка про другую клетку - ничего знать не знает.
проверка - а было ли что-то выделено - проверит локальную для текущей клетки ссылку lastChaged - и ничего не обнаружит.

"выделятель" клеток, должен быть общим, глобальным.
какой-то скрипт посылающий лучи, или принимающий события из
public void OnMouseUp() // нажимаем на клетку

или ввести глобальную переменную "текущая выделенная".
чтобы любая клетка могла узнать про это.

надеюсь суть стала ясна.
удачи)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
YAVAY
@YAVAY Автор вопроса
Я пожилая креветка
РАБОТАЕТ! Храни вас Господь!!

Рабочий код (вдруг надо кому)

public class GlobalCS: MonoBehaviour
{
    // глобальная переменная (запоминает последнюю изменённую клетку)
    public static LightOn lastChangedSquare; 
}

public class LightOn : MonoBehaviour
{
    
    public Material matChange; // цвет выделения (зелёный)
    Material myMat; // дефолтный цвет (чёрный / белый)


    private void Start()
    {
        myMat = GetComponent<Renderer>().material; // узнаём изначальный цвет клетки
        //lastChaged = this.gameObject;
    }


    public void OnMouseUp() // нажимаем на клетку
    {
        if (myMat == GetComponent<Renderer>().material) // если цвет объекта чёрный или белый
        {
            if (GlobalCS.lastChangedSquare != null) // проверка на наличие объекта
            {
                GlobalCS.lastChangedSquare.ResetColor(); // вызываем метод сброса цвета
            }


            GlobalCS.lastChangedSquare = this; // данная фигура стала прошлой

            GetComponent<Renderer>().material = matChange; // выделяем данную фигуру

            
        }   
        else // установка изначального цвета
        {
            ResetColor(); // сброс цвета выделенной кнопки
        }
        
    }

    // сброс цвета
    public void ResetColor()
    {
        GetComponent<Renderer>().material = myMat;

    }

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы