这里说下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的部分了!