如何在运行时优雅地Reset DOTS

如何在运行时优雅地Reset DOTS

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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6406ebd3063854059921cccc


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/attachment/public/113133/1677233402885.unitypackage

针对以上问题,有经验的朋友欢迎转至社区交流分享:
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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/640b153a063854059924e21a

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844