Самый эффективный способ скриптовать кнопки включения и выключения функциональности

c# button unity3d

390 просмотра

1 ответ

Я написал немного кода, который изменяет визуальное состояние кнопки (какая бы кнопка не была нажата, она выделяется синим цветом и возвращает все остальные кнопки обратно в их цвет по умолчанию). Кажется, работает нормально, но кажется громоздким. Есть ли более эффективный / лаконичный способ переписать мой код? Большое спасибо!

using UnityEngine ;
using System.Collections ;
using UnityEngine.UI ;

public class ToolButtons : MonoBehaviour
{
    public Color activeColor ;
    public Color inactiveColor ;
    public GameObject iconBG ;
    public Button ink, brush, crayon, pencil, spray, eraser, chnageColor, brushSize, undo, redo, clear, newAnimal ;
    public GameObject inkIconBG, brushIconBG, crayonIconBG, pencilIconBG, sprayIconBG, eraserIconBG, changeColorIconBG, brushSizeIconBG ;

    void Start ()
    {
        inactiveColor = iconBG.GetComponent <Image> ().color ;
    }

    // Use this for initialization
    void buttonCallBack (Button buttonClicked)
    {
        //Change Color Palette Button clicked
        if (buttonClicked == ink)
        {
            inkIconBG.GetComponent <Image> ().color = activeColor ;
        } else if (buttonClicked != ink)
        {
            inkIconBG.GetComponent <Image> ().color = inactiveColor ;
        }

        if (buttonClicked == brush)
        {
            brushIconBG.GetComponent <Image> ().color = activeColor ;
        } else if (buttonClicked != brush)
        {
            brushIconBG.GetComponent <Image> ().color = inactiveColor ;
        }

        if (buttonClicked == crayon)
        {
            crayonIconBG.GetComponent <Image> ().color = activeColor ;
        } else if (buttonClicked != crayon)
        {
            crayonIconBG.GetComponent <Image> ().color = inactiveColor ;
        }

        if (buttonClicked == pencil)
        {
            pencilIconBG.GetComponent <Image> ().color = activeColor ;
        } else if (buttonClicked != pencil)
        {
            pencilIconBG.GetComponent <Image> ().color = inactiveColor ;
        }

        if (buttonClicked == spray)
        {
            sprayIconBG.GetComponent <Image> ().color = activeColor ;
        } else if (buttonClicked != spray)
        {
            sprayIconBG.GetComponent <Image> ().color = inactiveColor ;
        }

        if (buttonClicked == eraser)
        {
            eraserIconBG.GetComponent <Image> ().color = activeColor ;
        } else if (buttonClicked != eraser)
        {
            eraserIconBG.GetComponent <Image> ().color = inactiveColor ;
        }
    }

    void OnEnable ()
    {
        ink.onClick.AddListener (() => buttonCallBack (ink)) ;
        brush.onClick.AddListener (() => buttonCallBack (brush)) ;
        crayon.onClick.AddListener (() => buttonCallBack (crayon)) ;
        pencil.onClick.AddListener (() => buttonCallBack (pencil)) ;
        spray.onClick.AddListener (() => buttonCallBack (spray)) ;
        eraser.onClick.AddListener (() => buttonCallBack (eraser)) ;
    }


    void OnDisable ()
    {

    }
}
Автор: greyBow Источник Размещён: 08.11.2019 11:12

Ответы (1)


1 плюс

Решение

Делать это с массивом было бы лучше, но проблема в том, что вы потеряете имена ваших кнопок и объектов GameObject, что затруднит дальнейшее изменение кода.

Вы можете использовать Dictionaryдля этого. Сделать Button- GameObjectпара вручную добавлять каждый , Buttonчтобы соответствовать каждый значок / GameObject. Затем вы можете просмотреть его при Buttonнажатии, сравнить Buttonс нажатием клавиши с ключом в Dictionary, затем назначить activeColorили inactiveColorна основе результата сравнения.

Примечание . Если вы добавите больше кнопок и значков, вы также должны добавить их в pairButtonIcon()функцию.

Любой, кто интересуется, почему я не использовал foreachцикл поверх Dictionary, потому что он выделяет память в Unity.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.UI;

public class ToolButtons : MonoBehaviour
{
    public Color activeColor;
    public Color inactiveColor;
    public GameObject iconBG;
    public Button ink, brush, crayon, pencil, spray, eraser, chnageColor, brushSize, undo, redo, clear, newAnimal;
    public GameObject inkIconBG, brushIconBG, crayonIconBG, pencilIconBG, sprayIconBG, eraserIconBG, changeColorIconBG, brushSizeIconBG;

    Dictionary<Button, GameObject> buttonIconPair = new Dictionary<Button, GameObject>();

    void pairButtonIcon()
    {
        buttonIconPair.Add(ink, inkIconBG);
        buttonIconPair.Add(brush, brushIconBG);
        buttonIconPair.Add(crayon, crayonIconBG);
        buttonIconPair.Add(pencil, pencilIconBG);
        buttonIconPair.Add(spray, sprayIconBG);
        buttonIconPair.Add(eraser, eraserIconBG);
        buttonIconPair.Add(chnageColor, changeColorIconBG);
        buttonIconPair.Add(brushSize, brushSizeIconBG);
    }

    void Start()
    {
        pairButtonIcon();
        inactiveColor = iconBG.GetComponent<Image>().color;
    }

    // Use this for initialization
    void buttonCallBack(Button buttonClicked)
    {

        //My Code
        for (int i = 0; i < buttonIconPair.Count; i++)
        {
            var item = buttonIconPair.ElementAt(i);
            var itemKey = item.Key;
            var itemValue = item.Value;

            if (buttonClicked == itemKey)
            {
                itemValue.GetComponent<Image>().color = activeColor;
            }
            else
            {
                itemValue.GetComponent<Image>().color = inactiveColor;
            }
        }
    }

    void OnEnable()
    {
        ink.onClick.AddListener(() => buttonCallBack(ink));
        brush.onClick.AddListener(() => buttonCallBack(brush));
        crayon.onClick.AddListener(() => buttonCallBack(crayon));
        pencil.onClick.AddListener(() => buttonCallBack(pencil));
        spray.onClick.AddListener(() => buttonCallBack(spray));
        eraser.onClick.AddListener(() => buttonCallBack(eraser));
    }


    void OnDisable()
    {

    }
}

РЕДАКТИРОВАТЬ : Вы также можете использовать несколько, Listsзатем сохранить Buttonи GameObject / Icon на каждом из них.

public class ToolButtons : MonoBehaviour
{
    public Color activeColor;
    public Color inactiveColor;
    public GameObject iconBG;
    public Button ink, brush, crayon, pencil, spray, eraser, chnageColor, brushSize, undo, redo, clear, newAnimal;
    public GameObject inkIconBG, brushIconBG, crayonIconBG, pencilIconBG, sprayIconBG, eraserIconBG, changeColorIconBG, brushSizeIconBG;

    List<Button> button = new List<Button>();
    List<GameObject> iconGameObjects = new List<GameObject>();

    void pairButtonIcon()
    {
        button.Add(ink);
        iconGameObjects.Add(inkIconBG);

        button.Add(brush);
        iconGameObjects.Add(brushIconBG);

        button.Add(crayon);
        iconGameObjects.Add(crayonIconBG);

        button.Add(pencil);
        iconGameObjects.Add(pencilIconBG);

        button.Add(spray);
        iconGameObjects.Add(sprayIconBG);

        button.Add(eraser);
        iconGameObjects.Add(eraserIconBG);

        button.Add(chnageColor);
        iconGameObjects.Add(changeColorIconBG);

        button.Add(brushSize);
        iconGameObjects.Add(brushSizeIconBG);
    }

    void Start()
    {
        pairButtonIcon();
        inactiveColor = iconBG.GetComponent<Image>().color;
    }

    // Use this for initialization
    void buttonCallBack(Button buttonClicked)
    {

        //My Code
        for (int i = 0; i < button.Count; i++)
        {
            if (buttonClicked == button[i])
            {
                iconGameObjects[i].GetComponent<Image>().color = activeColor;
            }
            else
            {
                iconGameObjects[i].GetComponent<Image>().color = inactiveColor;
            }
        }
    }

    void OnEnable()
    {
        ink.onClick.AddListener(() => buttonCallBack(ink));
        brush.onClick.AddListener(() => buttonCallBack(brush));
        crayon.onClick.AddListener(() => buttonCallBack(crayon));
        pencil.onClick.AddListener(() => buttonCallBack(pencil));
        spray.onClick.AddListener(() => buttonCallBack(spray));
        eraser.onClick.AddListener(() => buttonCallBack(eraser));
    }


    void OnDisable()
    {

    }
}
Автор: Programmer Размещён: 20.08.2016 03:02
Вопросы из категории :
32x32