Unity3D ugui 界面状态控制

在UI界面制作过程中,一些复杂的界面功能,常常会有不同状态和结果的展现。比如,选项卡,物品道具的状态信息,不同的描述信息和图片等。通常的处理方法,是用代码在不同的状态下,控制不同元素的可见性。但具体到Unity里,利用GameObject的可视化编辑,可以把不同的界面状态通过编辑器的配置来完成,这样代码只需要一句话状态切换就可以完成繁琐的界面元素控制。

    public class GameObjectState : MonoBehaviour
    {
        public State[] states;

        public void SetState(string stateName)
        {
            foreach (State state in this.states)
            {
                if (state.name == stateName)
                {
                    foreach (GameObject go in state.activeTrueObjs)
                    {
                        go.SetActive(true);
                    }

                    foreach (GameObject go in state.activeFalseObjs)
                    {
                        go.SetActive(false);
                    }

                    break;
                }
            }
        }

        [Serializable]
        public class State
        {
            public string       name;
            public GameObject[] activeTrueObjs;
            public GameObject[] activeFalseObjs;
        }
    }

思路是,GameObjectState 维护了一组状态集合,每个状态就是一个可以配置的State,里面包含了这个状态下,元素的可见性控制。通过设置name来切换State,从而得到不同状态下的界面呈现。


看一个使用的例子:





可以看到,列表元素的每一项,都有购买,拥有,使用三个状态。这里使用GameObjectState,针对每一个选项进行了配置,控制了这3个状态的元素可见性。这样,在代码中切换选项的状态,只需要一句话状态切换就可以达到目的。

            if (item.index == ShopSaveData.instance.shopMountSelectId)
            {
                UIShopMountList.selectItem = item;
                item.GetComponent<GameObjectState>().SetState("Use");
                continue;
            }

            if (ShopSaveData.instance.shopMountIds.Contains(i))
            {
                item.GetComponent<GameObjectState>().SetState("Has");
            }
            else
            {
                item.GetComponent<GameObjectState>().SetState("Buy");
            }


在使用Spine骨骼动画工具的时候, 除了做动画,还可以用Spine来做UI。Spine工具有一个切换皮肤的功能,在使用的过程中,我发现利用切换皮肤的功能,就相当于维护了一个UI的状态。所以,利用切换皮肤,就完成了UI不同状态元素的显示切。其原理,和在Unity中的GameObjectState是一样的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章