2016-08-17 94 views
0

我被困在这一个。我有两个按钮,每个按钮都与各自的弹出窗口关联,我想在点击按钮时显示该按钮,然后在再次单击按钮时隐藏,等等。我知道我需要使用'!'反转布尔值但我不确定如何在下面的代码中实现它。我的PaletteState函数应该写入的正确方法是什么?谢谢!Make Button打开和关闭游戏对象

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

public class ShowHidePalettes : MonoBehaviour 
{ 
    public Button changeColorButton ; 
    public GameObject colorPalette ; 
    public Button brushSizeButton ; 
    public GameObject brushSizePalette ; 

    void Awake() 
    { 
     changeColorButton.onClick.AddListener (() => PaletteState (colorPalette, true)) ; 
     brushSizeButton.onClick.AddListener (() => PaletteState (brushSizePalette, true)) ; 
    } 

    void Start() 
    { 
     PaletteState (colorPalette, false) ; 
     PaletteState (brushSizePalette, false) ; 
    } 

    public void PaletteState (GameObject _palette, bool _visible) 
    { 
     _visible = !_visible ; 

     if (_visible == true) 
     { 
      _palette.SetActive (true) ; 
     } else 
     { 
      _palette.SetActive (false) ; 
     } 
    } 
} 

回答

2

需要,因为每个Button控制两种不同的UI /弹出每个Button 2个boolean变量。当用'!'点击按钮时,您翻转相应的boolean变量。然后可以将布尔变量传递给SetActive函数。

此外,您需要一种方法来确定哪个Button被按下。你可以使用两个不同的函数,但使用一个并传递Button实例更好。

由于您订阅了一个,因此您还应该在OnDisable函数中删除侦听器RemoveListener

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

public class ShowHidePalettes : MonoBehaviour 
{ 
    public Button changeColorButton; 
    public GameObject colorPalette; 
    bool showColorPalette = false; 

    public Button brushSizeButton; 
    public GameObject brushSizePalette; 
    bool showSizeButton = false; 

    void Start() 
    { 
     colorPalette.SetActive(false); 
     brushSizePalette.SetActive(false); 
    } 

    void buttonCallBack(Button buttonClicked) 
    { 
     //Change Color Palette Button clicked 
     if (buttonClicked == changeColorButton) 
     { 
      showColorPalette = !showColorPalette;//Flip 
      colorPalette.SetActive(showColorPalette); 
     } 

     //Change Brush Size Button Button clicked 
     if (buttonClicked == brushSizeButton) 
     { 
      showSizeButton = !showSizeButton;//Flip 
      brushSizePalette.SetActive(showSizeButton); 
     } 
    } 

    void OnEnable() 
    { 
     changeColorButton.onClick.AddListener(() => buttonCallBack(changeColorButton)); 
     brushSizeButton.onClick.AddListener(() => buttonCallBack(brushSizeButton)); 
    } 


    void OnDisable() 
    { 
     changeColorButton.onClick.RemoveListener(() => buttonCallBack(changeColorButton)); 
     brushSizeButton.onClick.RemoveListener(() => buttonCallBack(brushSizeButton)); 
    } 
} 
0

你的代码应该是这样的:

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

public class ShowHidePalettes : MonoBehaviour 
{ 

public Button changeColorButton; 
public GameObject colorPalette; 
public Button brushSizeButton; 
public GameObject brushSizePalette; 

private bool colorPalleteVisibility = false; 
private bool brushSizePalleteVisibility = false; 

public void PaletteState(PaleteType type) 
{ 
    if (type == PaleteType.ColorPalette) 
    { 
     colorPalleteVisibility = !colorPalleteVisibility; 
     colorPalette.SetActive(colorPalleteVisibility); 
    } 
    else if (type == PaleteType.BrushSizePalette) 
    { 
     brushSizePalleteVisibility = !brushSizePalleteVisibility; 
     colorPalette.SetActive(brushSizePalleteVisibility); 
    } 
} 
} 
public enum PaleteType 
{ 
ColorPalette, BrushSizePalette 
} 
1

试试这个:

  • PaletteState方法取出布尔_visible参数。
  • 然后自行交替使用GameObject状态。
 
    public void PaletteState (GameObject _palette) 
    { 
     _palette.SetActive (!palette.activeSelf) ; 
    }