基于UIWidgets的Unity应用开发(三)

      这里说下UIWidgets与3D的交互设置,UIWidgets官方表明是可以与3D进行交互的。但在Unity直接操作的话,例如点击一个按钮触发一次位置、旋转、缩放的变换是正常的,但是如果是连续的变化的话,画面就会变得卡顿起来

        上图我是把一个按钮添加了自动旋转的button,而且界面上添加了一个UIWidgets的按钮,可以看到在运行的状态下,scene场景的方块是会不断旋转的,但game场景的旋转会相当卡顿。导致这种现象的原因是因为UIWidgets的UI是在最前端,而且UIWidgets的更新机制是如果界面没有变化或者没有调用setstate()的话,基本不刷新界面的,但cube又是每帧都改变,所以就导致了这种一卡一卡的现象。

        知道了原因那好解决,让UI每帧都刷新就可以了。我在UIWidgets的脚本里跑了个true循环 每帧都触发一个空的SetState()事件(不懂setState的可以了解下fluter的刷新机制),然后3d就显示正常了。但感觉怪怪的,因为每帧都刷新了,那drawcall又上来了。。。

        后来在咨询了下UIWidgets的开发者后后,对方给出了正确的方法,就是在UIWidgetsPanel初始化的时候把Windows的两个委托设置为空方法就正常了

Window.onFrameRateSpeedUp = ()=> { };
Window.onFrameRateCoolDown = ()=> { };

        这点在官方的UIWidgets的官方github上就有说明,只是明明是当时不小心打开了国际服的界面显示全是英语,居然没发现,然后因为上面的那个测试的原因,以为UIWidgets做不了UI与3D交互,真是吃了英语不好的亏。。。再次感叹UIWidgets的牛逼!

        接下来是UIWidgets对3D的代码互动操作,因为 UIWidgets都是动态生成的,而且继承UIWidgetsPanel、StatefulWidget、StatelessWidget的类跟MonoBehaviour的类不太一样,不能直接声明一个public的GameObject或者Transform然后直接拖拽上去直接引用,自定义的类也不行,我自己的做法是写一个单例类对这些类啊物体啊进行引用,然后挂载在场景的空物体上,这样就可以用UIWidgets的类直接引用单例来调用。

        还有就是因为不是直接继承MonoBehaviour,协程方法用不了,但还是可以用UIWidgets现有的方法来模拟协程的

        void Refresh()
        {
            Promise.Delayed(TimeSpan.FromSeconds(0.3f)).Then(
                () =>
                {
                            //dosomethings
                            setState();
                    Refresh();
                }
                );
        }

用上面的方法就能不能触发refresh事件,一开始也是用这个来强行让界面刷新来达到让3d界面同步更新的效果,Promise是UIWidgets的一个类,应该是用于异步操作,处理队列之类的工具类。

        基本上要UIWidgets与3D交互,按上面的配置改一下就好。那接下来就是说下做APP的部分了!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值