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;

    }

}
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity Game Engine
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;

    }

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

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

Войти через центр авторизации
Похожие вопросы
PHYGITALISM Москва
от 70 000 до 100 000 руб.
2Reallife Москва
от 110 000 до 130 000 руб.
Playneta Санкт-Петербург
от 150 000 до 250 000 руб.