在之前中我们实现了push一个layer,但是如果不需要这个layer,我们还需要pop他。于是我们在APPUIViewBase中添加入这样几行代码。
protected void popLayer() {//将最后加入的节点推出。
APPUIViewBase apps = viewStack.Pop();
//还需要播放退场动画,播放完成之后删除。
Destroy(apps.gameObject);
}
我在本地进行了测试,结果悲剧了,当layer删除之后并没有执行到相应Mediator类中的OnRemove函数。
于是开始查找源码,在源码中我发现了这样的一些代码。
protected virtual void OnDestroy()
{
bubbleToContext(this, BubbleType.Remove, false);
}
virtual protected void bubbleToContext(MonoBehaviour view, BubbleType type, bool finalTry)
{
const int LOOP_MAX = 100;
int loopLimiter = 0;
Transform trans = view.gameObject.transform;
while (trans.parent != null && loopLimiter < LOOP_MAX)
{
loopLimiter++;
trans = trans.parent;
if (trans.gameObject.GetComponent<ContextView>() != null)
{
ContextView contextView = trans.gameObject.GetComponent<ContextView>() as ContextView;
if (contextView.context != null)
{
IContext context = contextView.context;
bool success = true;
switch (type)
{
case BubbleType.Add:
context.AddView(view);
registeredWithContext = true;
break;
case BubbleType.Remove:
context.RemoveView(view);
break;
case BubbleType.Enable:
context.EnableView(view);
break;
case BubbleType.Disable:
context.DisableView(view);
break;
default:
success = false;
break;
}
if (success)
{
return;
}
}
}
}
从代码中不难看出,整个结构需要是有父子节点关系才行。于是我们开始更改层级结构,顺便将我们以前的命名稍微修改一下。
Contexview->ContextRoot
TestContext->Context
我们在场景中新建一个根对象明明为ContextRoot,将ContextRoot放在这里,接着,把player和UI全部投入这个根节点之下。
结构
然后在进行尝试,当layer被删除之后,回调确实执行了,这样就对了。虽然我感觉这个结构太水了点,感觉可以优化,不过暂且先顺着这个框架来。
上一节
网友评论