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是一樣的。


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