用栈来管理UI界面:IView
界面的基类IView,主要是为了给ViewManager开放一些接口,顺便放一些公共方法。还有ViewType的枚举也放在这,为的是方便属性面板上直接编辑。
使用或操作的组合枚举,标记界面类型。除了跟ViewManager相关的枚举值,还可以放一些界面显示相关的枚举,如一般游戏顶部可能会有个Title条,包含了钻石金币,头像等,那么可以开个枚举出来,标记这些部分是否要显示出来。
public enum ViewType
{
///
/// 悬浮界面
///
levitate = 1 << 0,
///
/// 不作为返回界面
///
cantBack = 1 << 1,
///
/// 显示Title
///
hideTitle = 1 << 2,
///
/// 显示金币和钻石
///
withFortune = 1 << 3,
///
/// 显示头像
///
withHead = 1 << 4,
///
/// 显示返回按钮
///
withBackBtn = 1 << 5 ,
fortune_head = withFortune | withHead ,
fortune_back=withFortune | withBackBtn,
};
Enter和Exit方法是开放给ViewManager用的两个接口,表示界面的呼起和退出。而界面真正被显示或隐藏的操作则又是在Show和Out里做的。一些界面调起和退出的动画可放到Show和Out里去。
public virtual void Enter()
{
// if(!Title.gameObject.activeSelf)
// Title.SetActive(true);
Invoke("DealWithCommonPartScreen", 0.02f);
}
public virtual void Exit()
{
}
public virtual void Show()
{
if (!isAwake)
Awake();
SetActive(true);
Invoke("ShowAnim", 0.01f);
}
public virtual void Out()
{
OutAnim();
}
还有一个BackView方法。ViewManager在Update里监听了返回键操作,调的就是栈顶的BackView函数,子类可以通过重写这个BackView决定是否可以通过返回键回退界面。
public virtual void BackView()
{
ViewManager.BackView();
}
一个DealWithCommonPartScreen方法用来处理上面提过的界面类型中对于类似Title等公共部分的处理。
protected virtual void DealWithCommonPartScreen()
{
}
还有记得在OnDestroy方法里调一下Exit,当界面被销毁的时候应该执行一下退出操作。因为像是注册别的类里的某个委托,界面被销毁了而委托没注销的话可能就会出错了。
protected virtual void OnDestroy()
{//界面被销毁的时候退出界面 为了解除一些广播的绑定
Exit();
}
主要就是这些,其他的可以看情况往里加,像是抽一些公共方法出来什么的。
public enum ViewType
{
///
/// 悬浮
///
levitate = 1 << 0,
///
/// 不作为返回界面
///
cantBack = 1 << 1,
///
/// 显示Title
///
hideTitle = 1 << 2,
///
/// 显示金币和钻石
///
withFortune = 1 << 3,
///
/// 显示头像
///
withHead = 1 << 4,
///
/// 显示返回按钮
///
withBackBtn = 1 << 5 ,
fortune_head = withFortune | withHead ,
fortune_back=withFortune | withBackBtn,
};
public class IView : MonoBehaviour {
// protected static TitleHandler Title { get { return TitleHandler.Instance; } }
public ViewType viewType = ViewType.levitate;
//protected UITweener tween;
protected bool isAwake = false;
#region Unity生命周期
protected virtual void Awake()
{
if (isAwake) return;
isAwake = true;
// Transform content=transform.Find("content");
// if (content != null)
// tween = content.GetComponent();
}
protected virtual void Start () {
}
protected virtual void Update () {
}
protected virtual void OnEnable()
{
}
protected virtual void OnDisable()
{
}
protected virtual void OnDestroy()
{//界面被销毁的时候退出界面 为了解除一些广播的绑定
Exit();
}
#endregion
#region Show/out
public virtual void Enter()
{
// if(!Title.gameObject.activeSelf)
// Title.SetActive(true);
Invoke("DealWithCommonPartScreen", 0.02f);
}
public virtual void Exit()
{
}
public virtual void Show()
{
if (!isAwake)
Awake();
SetActive(true);
Invoke("ShowAnim", 0.01f);
}
public virtual void Out()
{
OutAnim();
}
#endregion
public virtual void BackView()
{
ViewManager.BackView();
}
public virtual void SetViewType(ViewType type)
{
viewType = type;
}
public virtual void SetActive(bool active)
{
gameObject.SetActive(active);
}
protected virtual void DealWithCommonPartScreen()
{
//若是悬浮窗口,则界面公共部分保持不变
if ((viewType & ViewType.levitate)>0)
return;
//注意,大于withTitle的都将显示Title,具体显示内容再以具体内容为主
if((viewType&ViewType.hideTitle)>0)
{
// Title.Out();
}else
{
// Title.Show();
}
if((viewType&ViewType.withFortune)>0)
{
// Title.showFortune();
}else
{
// Title.hideFortune();
}
if((viewType&ViewType.withHead)>0)
{
// Title.showHead();
}else
{
// Title.hideHead();
}
if((viewType&ViewType.withBackBtn)>0)
{
// Title.showBackBtn();
}else
{
// Title.hideBackBtn();
}
}
#region 动画
protected virtual void ShowAnim()
{
//if (tween != null)
//{
// tween.onFinished.Clear();
// tween.PlayForward();
// // tween.ResetToBeginning();
//}
}
protected virtual void OutAnim()
{
// if (tween != null)
// {
////临时
//SetActive(false);
///*
// if (!gameObject.activeSelf)
// gameObject.SetActive(true);
// tween.onFinished.Clear();
// tween.onFinished.Add(new EventDelegate(delegate
// {
// SetActive(false);
// }));
// tween.PlayReverse();*/
// tween.ResetToBeginning();
// }else
// {
// SetActive(false);
// }
}
#endregion
}