美文网首页
从零开始的RPG制作8.2-(UI框架进一步整理)

从零开始的RPG制作8.2-(UI框架进一步整理)

作者: 小蜻蜓队长 | 来源:发表于2019-05-09 20:49 被阅读0次

    在之前中我们实现了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被删除之后,回调确实执行了,这样就对了。虽然我感觉这个结构太水了点,感觉可以优化,不过暂且先顺着这个框架来。
    上一节

    相关文章

      网友评论

          本文标题:从零开始的RPG制作8.2-(UI框架进一步整理)

          本文链接:https://www.haomeiwen.com/subject/adogoqtx.html