头图

1)PuerTS和HybridCLR哪个更适合开发微信小游戏
2)使用了Play Asset Delivery提交版本被Google报错
3)怎样设置normalize来改变摄像机位置
4)如何禁用增强型输入法中除某些输入操作之外的输入操作


这是第397篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:793972859

Script

Q:PuerTS和HybridCLR哪个更适合开发微信小游戏?哪个更快?大家有做过相关的调研吗?

A1:之前测过,HybridCLR的解释器是在WASM上的,而JS用的是微信的。这俩算力估计差了50多倍。但现在市面好像没有好的Unity和TS的框架。

JS算力高,但和WASM交互比HybridCLR低几倍。

感谢子非鱼@UWA问答社区提供了回答

A2:可以参考以下文章,但综合来看应该还是HybridCLR更好一些:
https://zhuanlan.zhihu.com/p/646932579

感谢旋@UWA问答社区提供了回答

Platform

Q:Google Play选择了Target API Level 34之后,如果项目使用了Play Asset Delivery功能提交版本,会被Google报错(关于Foreground Services Permissions)。

前述截图中,点击Go to declaration后,展示一个空列表,并没有说明我要求了哪些Permission。

尝试解决,在AndroidManifest中加入如下内容(想办法去除权限),仍然不能解决问题:

<!-- Foreground Services permissions -->

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" tools:node="remove" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" tools:node="remove" />

A:反编译了一下2.2.1版本的PAD的aar:

似乎是加上这两个就可以了:

在startForeground的地方调用的还是2个参数的版本。

感谢littlesome@UWA问答社区提供了回答

Rendering

Q:请问在Shader里面,调试了下xxx这个值,在改变摄像机位置的时候,这个xxx的值为什么始终不变?

float3 xxx = normalize(_WorldSpaceCameraPos.xyz);

但在Shader里面看参数\_WorldSpaceCameraPos这个值是变了的。

尝试调试yyy值,在改变光的旋转的时候,是有变化的:

float3 yyy = normalize(_MainLightPosition.xyz);

是不是Shader里面normalize对位置不起作用?

我知道一个是具体位置,一个是方向,所以我对位置进行normalize处理,但发现并不生效。

以下这样我也测试过,但也不生效:

float3 xxx = normalize(_WorldSpaceCameraPos.xyz - half3(0,0,0));

请问这个要怎么设置呢?

A1:normalize是对方向敏感,对位置不敏感,你需要了解下矢量这一图形上的概念。

_MainLightPosition.xyz变量是位置,但如果是平行光,他其实是代表方向。你把相机的世界坐标位置如下设置z=100与z=-100,这样变化才能看到xxx改变。

简单解释就是CameraPos,同时也是相对于0点的方向,你如果远离0点的位置改动一点,方向等于没变,所以才让你要大改位置z变-z,这个变动要很大才明显,就和月亮每秒相对我们移动1000米,结果角度每秒几乎不变同理。

感谢偶尔不帅@UWA问答社区提供了回答

A2:你应该用_worldSpaceCameraPos.xyz - 顶点插值出来的世界坐标位置来算viewdirection。

感谢小波@UWA问答社区提供了回答

A3:你这不是图形问题,是算数问题。你把坐标打印出来,再把normalize后的坐标打印出来。你原来坐标数值很大,normalize之后缩放到长度一了。小幅度移动当然变化不大了。

你能用坐标减去half3(0,0,0),说明你没弄明白向量加减法。

感谢jump晃悠@UWA问答社区提供了回答

A4:其实是值太大而变化小,肉眼没办法区分变化:

感谢龙少@UWA问答社区提供了回答

Script

Q:我想创建一个通知状态,该状态禁用除特定输入操作之外的所有输入操作,但它会禁用所有输入操作。就是我想在某个阶段中只接受WASD的移动操作,禁用攻击、跳跃的操作。

例如,我有一个向右行走的角色。

当向右行走的动画中加入该NotifyState时,除了WASD移动输入操作外,我希望禁用所有输入操作,如“攻击、跳跃”等。

在其他情况下,只能激活其他输入操作(例如,只能激活跳跃输入操作)。

我想选择一个特定的输入操作来激活它,请问这要怎么实现呢?

A:有两种解决方案:

  1. 用Remove/Add Mapping Context节点直接移除/添加映射上下文,可以写个函数来控制不同Mapping Context的切换,例如用个Enum作为变量,如下图:

  1. 给某个具体的input事件加个条件判断,不符合条件就空着:

复现:
案例中为第一人称视角,鼠标的移动会控制相机的朝向(IA_Look),当测试物体旋转功能时,希望关闭该输入事件,转而使用鼠标移动来控制物体的旋转(IA_CheckLook)。

这里使用了方案一,用了不同的IMC:

之后通过键盘的E切换两种IMC:

效果:
https://www.youku.com/video/XNjQxMjE4NTYyOA==

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

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859


侑虎科技
65 声望21 粉丝

UWA官网:[链接]