6

如何在运行时优雅地Reset DOTS

 1 year ago
source link: https://blog.uwa4d.com/archives/TechSharing_328.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

1.png
2.png

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/63f88f1b063854059914deb8


Rendering

Q:FrameBuffer Fetch在确定支持的手机上显示全紫,不管是Color Fetch还是Depth Fetch。请问我这个DepthFetch实现是不是有什么漏写的东西?

3.png

4.png

针对以上问题,有经验的朋友欢迎转至社区交流分享:
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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK