1)如何在运行时优雅地Reset DOTS
2)用顶点着色器进行旋转的Shader放在Image上不能正常工作
3)FrameBuffer Fetch在确定支持的手机上显示全紫
4)Unity系统中,Android端判断GamePad文件在不在
这是第328篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
UWA社区主页:community.uwa4d.com
UWA QQ群:465082844
Script
Q:DOTS环境为1.0.0 preview
需求:以“局”为单位的战斗,单机小游戏。
目前我需要在StartCombat时手动拉起所有的System,在EndCombat时手动Disable掉所有的System。这些System都在Default Inject World中,功能勉强能实现,但是觉得不够优雅。
由于DOTS项目非常稀少,而且基本上所有的例子都没有考虑过这个问题(他们都似乎是点击运行游戏就进入战斗,没有考虑到以“局”为单位),因此征求一下大家的优雅做法。
A:这个问题的发出说明对ECS体系的设计思路了解欠缺,在System中保存了的NativeContainer(也就是State,跟局有关的数据)才会需要手动ResetSystem。
真正的ECS设计思路应该是System中完全不包含任何State,不能图省事把以前的 XXXManager的设计思路拿过来:XXXManager设计思路指的是一个单例中有一个Map,还有N多方法来增删改查这个Map。
因此一个纯方法集的System不仅不需要Reset,甚至可以动态Reload代码段,我们只需要摧毁所有的Entity CMP即可完成Reset。
感谢题主刘泰言@UWA问答社区提供了回答
Rendering
Q:整体思路就是想在UI中实现图片的可控旋转,但是发现Shader放在Image上时,一旦发生移动就完全乱了。已尝试开启了DisableBatching,不知道问题出在哪里?也尝试过进行缩放,仍然存在类似的问题。
float4 flip_base(float4 vertex, float2 uv)
{
float2 pos;
float2 center = float2(0,0); // 这个地方可以通过 BaseEffect 通过CPU 计算后 uv1传入,这里简化了。
// 尝试过的缩放
//vertex.xy *= _FlipProgress;
//return vertex;
float2 dt = (vertex.xy - center.xy) * 100;
float len = sqrt(dot(dt, dt));
float theta = -len * _FlipProgress * pi;
float2x2 rot =
{
cos(theta), sin(theta),
-sin(theta) ,cos(theta)
};
dt = mul(rot, dt);
pos = dt + center;
vertex.xy = pos;
return vertex;
}
v2f vert(appdata v)
{
v2f o;
o.uv = v.uv;
float4 vertex = flip_base(v.vertex, o.uv);
o.vertex = UnityObjectToClipPos(vertex);
return o;
}
示例工程如下:
https://uwa-public.oss-cn-beijing.aliyuncs.com/answer/attachm...
针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/63f88f1b063854059914deb8
Rendering
Q:FrameBuffer Fetch在确定支持的手机上显示全紫,不管是Color Fetch还是Depth Fetch。请问我这个DepthFetch实现是不是有什么漏写的东西?
针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/640bbb060638540599253529
Android
Q:Android端Google Play如何判断GamePad存在不存在大家有啥好方法吗?海外GamePad也可能存在多个位置吧,比如外部内存卡中?
A:要在Android设备上检查GamePad是否存在,可以使用Android系统提供的API来检查设备中连接的所有输入设备,并查找是否有GamePad输入设备。
这个方法只能检测连接到设备的硬件GamePad设备。对于海外GamePad,如果文件存储在设备上,则需要使用文件系统API进行检查,否则需要依赖硬件API检查连接的GamePad设备。同时,这个代码片段需要在AndroidManifest.xml文件中添加权限声明才能在外部存储设备中进行搜索。
感谢清风亦枫@UWA问答社区提供了回答
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844