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