Как изменить изображение кнопки при нажатии в любом месте экрана? - PullRequest
0 голосов
/ 29 сентября 2019

Я очень новичок в Unity, и у меня возникают проблемы с пониманием возможностей нажатия с помощью кнопок пользовательского интерфейса и т. Д. В моем проекте у меня есть кнопка, которая меняет свое изображение всякий раз, когда я нажимаю на нее, и способ, которым я ее сделал:создал этот скрипт:

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


[RequireComponent(typeof(Button))]

public class OnClickScript : MonoBehaviour
{
    public static int spritenumber=1;
    public Button mybutton;
    public Sprite square;
    public Sprite circle;
    public Sprite triangle;
    public int counter = 1;

    void Start()
    {
        mybutton = GetComponent<Button>();


    }

    public void changeButton()
    {
        if (PAUSESCRIPTE.isPaused == false)
        {
            counter++;
            if (counter == 1)
            {
                mybutton.image.overrideSprite = square;
                spritenumber = 1;
                soundmanagerscript.PlaySound("buttonpress");



            }
            if (counter == 2)
            {
                mybutton.image.overrideSprite = circle;
                spritenumber = 2;
                soundmanagerscript.PlaySound("buttonpress");

            }
            if (counter == 3)
            {
                mybutton.image.overrideSprite = triangle;
                spritenumber = 3;
                counter = counter - 3;
                soundmanagerscript.PlaySound("buttonpress");
            }
        }

    }
}

Я прикрепил этот скрипт к своей кнопке, выбрал спрайты, которые хочу использовать, и добавил к кнопке функцию On Click ().

После этого я решилчто я больше не хочу менять спрайт своей кнопки, нажимая на саму кнопку, а нажимая в любом месте на экране.Я пытался использовать Input.GetMouseButtonDown (0), но не получил никаких результатов, так как я использовал его неправильно.Любая помощь, о том, как добиться того, чего я хочу, очень приветствуется.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

В качестве ответа на ваш комментарий выше, я предлагаю вам иметь кнопку на заднем плане и кнопку паузы наверху.Затем замените ваш метод Update() на событие OnClick (), как вы делали это раньше.

Ваша кнопка паузы будет ловить левый щелчок, а кнопка фона - нет.Обязательно отметьте Interactable в компоненте Button.

Затем вы можете удалить компонент Image кнопки фона, если вам это не нужно.


Что означает, что вы можете создать (или изменить) класс для своей кнопки паузы

using UnityEngine.EventSystems;

public class PauseButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    public bool IsMouseOver = false;

    public void OnPointerEnter(PointerEventData eventData)
    {
        IsMouseOver = true;
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        IsMouseOver = false;
    }

    // --
    // Your OnClick method
    // --
}

Примечание: использование eventSystems.

Теперь вы можете использовать это значение bool в коде, подобном тому, как отправляет вам amengelbrecht.

Я скопирую и вставлю его код из его ответа и добавлю значение bool на основе предыдущего класса выше.

public class BackgroundButtonScript : MonoBehaviour
{
    // Public objects
    public Sprite[] sprites;
    public PauseButton pauseButton;

    //Private variables
    private Image buttonImage;
    private int spriteIndex;

    private void Start()
    {
        buttonImage = GetComponent<Image>(); // Get the image component of your button
        spriteIndex = 0; // Set the index to 0
        buttonImage.sprite = sprites[spriteIndex]; // Set the image to the first image in your sprite array
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0) && !pauseButton.IsMouseOver)
        {
            spriteIndex++; // Increment the index
            if (spriteIndex > sprites.Length - 1) // Ensure that you stay within the array size
            {
                spriteIndex = 0;
            }
            buttonImage.sprite = sprites[spriteIndex]; // Set the image
        }
    }
}

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

Будьте осторожны

Если ваша игра находится в режиме паузы и пользователь щелкает левой кнопкой мыши в любом месте, кроме кнопки паузы,В зависимости от того, как работает ваша пауза, будет вызван метод Update () BackgroundButtonScript, который может привести к if (Input.GetMouseButtonDown(0) && !pauseButton.IsMouseOver).

0 голосов
/ 29 сентября 2019

Вот как я это сделаю:

using UnityEngine.UI;
using UnityEngine;

public class ButtonScript : MonoBehaviour
{
    // Public objects
    public Sprite[] sprites;

    //Private objects/variables
    private Image buttonImage;
    private int spriteIndex;

    void Start()
    {
        buttonImage = GetComponent<Image>(); // Get the image component of your button
        spriteIndex = 0; // Set the index to 0
        buttonImage.sprite = sprites[spriteIndex]; // Set the image to the first image in your sprite array
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            spriteIndex++; // Increment the index
            if (spriteIndex > sprites.Length - 1) // Ensure that you stay within the array size
            {
                spriteIndex = 0;
            }
            buttonImage.sprite = sprites[spriteIndex]; // Set the image
        }
    }
}

Однако вам необходимо изменить настройки изображения на:

Тип изображения: простое

Использовать сетку спрайтов: true

(возможно) Сохранить аспект: true

...