简体   繁体   中英

First click of Unity UI Button does not respond

I'm trying to use Unity's UI system.

What I want is that I have a button #1 as a card image and I have button 2 as a spade image. First I will click spade image and it's indicator will turn on. After that I will click the card image to make the Spade Icon image disappear. I managed to get variables from script to another script but whatever I do the first click of the Spade Button, the indicator lights up and spadeselected bool changes in the inspector. While spadeselected is true, the first click of the Card image doesn't do a thing. After clicking twice and so on everything works fine. What could cause this problem?

My main script for card button:

public class main : MonoBehaviour
{
    private bool ace = false;
    
    spadestatement _spadestatement;
    public GameObject spadebutton;
        
    public GameObject spade_icon;

    private void Awake()
    { 
        _spadestatement = spadebutton.GetComponent<spadestatement>();
    }

    private void Start()
    {
        gameObject.GetComponent<Button>().onClick.AddListener(turnoff);
    }

    private void turnoff()
    {
        ace ^= true;
        
        if (_spadestatement.spadeselected == true)
        {   
            spade_icon.SetActive(ace);
        }
    }
}

My spadestatement script for spade button:

public class spadestatement : MonoBehaviour
{
    public bool spadeselected;
    public GameObject indicator;

    void Start()
    {
        gameObject.GetComponent<Button>().onClick.AddListener(select);
    }

    public void select()
    {
        spadeselected ^= true;
        indicator.SetActive(spadeselected);
    }
}

And here is a picture to make it more understandable: 在此处输入图像描述

When spadeselected is true, the first time you call turnoff() :

private void turnoff()
{
    ace ^= true; //first time : after the assignment, ace is true
    
    if (_spadestatement.spadeselected == true)
    {   
        spade_icon.SetActive(ace); // since ace is true, set spade_icon active
    }
}

The second time you call turnoff() , ace become false , thus spade_icon is deactive.

If you want to turn on/off the spade_icon, maybe try this one:

private void turnoff()
{
    ace ^= true; //first time : after the assignment, ace is true
    
    if (_spadestatement.spadeselected == true)
    {   
        spade_icon.SetActive(!ace); // since ace is true, set spade_icon deactive
    }
}

Or, if you don't want to bind the active/deactive behaviour of spade_icon with ace , you can:

private void turnoff()
{
    if (_spadestatement.spadeselected == true)
    {   
        spade_icon.SetActive(!spade_icon.activeSelf);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM