AI插件推荐
1)AI插件推荐
2)VideoPlayer在Android上播放视频黑屏
3)Renderer.GetPropertyBlock问题
4)RectMask2D问题
这是第257篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
AI
Q:我们新项目有些AI,想用一些插件来实现,不知大佬们有没有什么AI插件推荐?据我所知有Behavior Designer ,Playmaker ,Bolt 这些,求科普几款功能和性能都不错的,谢谢。
A1:推荐 NodeCanvas。
功能亮点:
● 三个可完全切换的图形模块供你选择。
● 具有所有预期专业功能的时尚且直观的可视化节点编辑器。
(全部撤销/重做、放大/缩小、迷你地图、多选、复制、复制/粘贴、JSON 导入/导出、群组和注释等)
● 图形、GameObject和全局黑板变量,以创建可重复使用和以智能体为中心的参数行为。
● 具有实例或静态属性和字段的数据绑定变量。
● 使用UNET的网络同步变量(Network Sync Variable)。
(由于现已弃用UNET,所以会将其替换为新的网络解决方案)
● 预制件可覆盖的变量。
● 自动转换不同的变量数据类型。
● 支持所有变量类型开箱即用。
● 跨所有数量的智能体的可重复使用行为图。
● 所有三种图形模块之间的无缝子图形嵌套。
(行为子树、子状态机、子对话树)
● 完整的子图变量参数化和贴图。
● 模块化动作和条件任务设计。
● 条件反应行为树评估。
● 有条件和基于栈的FSM过渡。
● 丰富多彩和内容翔实的运行时可视化调试。
● 节点/任务浏览器,用以搜索、收藏和阅读内置文档。
● 首选类型配置器,以根据项目需求定制与类型相关的菜单。
● 图形迷你地图,以轻松浏览图形。
● 图形控制台,单击鼠标即可自动定位故障节点。
● 图形浏览器,用以搜索和查找图中的节点、任务和参数。
● 图形重构器,以批量重构缺失的节点、任务和反射引用。
● 实时运行时编辑,以更快速地完成设计目标。
● 经过优化的反射任务,以自动集成现有的代码 API。
● 内置事件系统,以在图形中沟通和传输数据。
● 清晰且记录完善的 API,以扩展 NodeCanvas 框架并创建自己的动作、条件、节点,甚至全新的图形模块。
● 对象和属性绘制器,以一切可能的方式自定义检查器。
● 与大量第三方资源集成。
● 与FlowCanvas flowScripts无缝集成。
● 用户友好,轻量级,无需设置。
● 性能稳定,初始化后零分配,异步图加载。
● 支持所有平台开箱即用。
● 包含全部C#源代码。详细链接如下:
https://assetstore.unity.com/packages/tools/visual-scripting/nodecanvas-14914Behaviac也不错,可惜TX不怎么维护了:
https://github.com/Tencent/behaviac/
感谢郑骁@UWA问答社区提供了回答
A2:搬运一位大佬的推荐:Baracuda。
https://github.com/Unity-Technologies/barracuda-release
感谢芭妮妮@UWA问答社区提供了回答
A3:搬运一个关于游戏AI框架选择的帖子:《What A.I technique is most suited to my game, FSM, BT, GOAP》
附一个AI相关Blog:AI分享站
http://www.aisharing.com/sitemap
感谢羽飞@UWA问答社区提供了回答
A4:腾讯开源的项目:behaviac
https://www.behaviac.com/language/zh/%e9%a6%96%e9%a1%b5/behaviac是游戏AI的开发框架组件,也是游戏原型的快速设计工具。支持全平台,适用于客户端和服务器,助力游戏快速迭代开发 。
编辑器可以在PC上运行,操作方便直观可靠,支持实时和离线调试;编辑器可以导出xml,bson等多种格式,更可以导出C++、C#源码,提供最高效率。
运行时支持全平台,有C++和C#两个版本,原生支持Unity。
感谢萧小俊@UWA问答社区提供了回答
Video
Q:这个问题只在A工程里出现,把同样的视频、代码拷贝到一个新工程里,然后把视频文件放到Addressables Group并设置不压缩,构建到手机上是可以正常播放的。但是在A工程里,把视频放到Addressables Group里设置不压缩,还是无法播放,并报错:
AndroidVideoMedia::OpenExtractor could not translate archive:/CAB-abafc77eff58910e7bc5f69ce62a4ed7/CAB-abafc77eff58910e7bc5f69ce62a4ed7.resource to local file. Make sure file exists, is on disk (not in memory) and not compressed.
请问大家有没有遇到类似问题?
A:虽然在Addressables Group里设置了不压缩,但在手机上还是播不了视频。所以想到是不是有什么地方压缩了Bundle,最后在build.gradle里找到,需要把 ‘.bundle’ 添加到gradle的noCompress里,如下:
aaptOptions { noCompress ‘.unity3d’, ‘.ress’, ‘.resource’, ‘.obb’, ‘.meta’, ‘.wem’, ‘.bnk’, ‘.txt’, ‘.xml’,’.bundle’ //ADD_NoCompress_TAG }
感谢题主wenzhao@UWA问答社区提供了回答
Rendering
Q:从代码打印日志来看,GetPropertyBlock一开始获取的是什么?似乎没什么用:
public MeshRenderer mr; [Button] void DOTest() { MaterialPropertyBlock block = new MaterialPropertyBlock(); mr.GetPropertyBlock(block); Debug.Log(block.isEmpty); //打印true Color baseColor = block.GetColor("_Color"); Debug.Log(baseColor.ToString()); //原始是白色 打印(0,0,0,0) 也就是没有获取到 block.SetColor("_Color", Color.red); //设置颜色 mr.SetPropertyBlock(block); mr.GetPropertyBlock(block); //再次获取 Debug.Log(block.isEmpty); //打印false baseColor = block.GetColor("_Color"); Debug.Log(baseColor.ToString()); //打印(1,0,0,1) }
原先我以为通过Renderer.GetPropertyBlock(block);会把这个Renderer的材质属性都存到这个Block里面,然后我再修改里面的值,可是事实并不是这样,例如我只想修改Alpha,但是无法获取原始颜色:
MaterialPropertyBlock block = new MaterialPropertyBlock(); meshRenderer.GetPropertyBlock(block); Color baseColor = block.GetColor("_Color"); block.SetColor("_Color", new Color(baseColor.r, baseColor.g, baseColor.b, alpha)); meshRenderer.SetPropertyBlock(block);
A1:首先你没有往Property里面添加属性,所以它肯定是Empty,也就是你的属性表单里面是个空列表;然后通过Setcolor,这样其实应该是往属性表单里面添加了一个属性字段,这样列表就不为空了。至于为何打印出白色,应该是默认值吧,即你访问一个不存在的属性时为了避免返回null,所以给了你一个默认值(这里猜想的)。
想获取原始颜色,直接从材质上拿:
var mat = renderer.material;//renderer.sharedMaterial; Color c = mat.GetColor("_Color"); Debug.Log(c.ToString());
感谢李星@UWA问答社区提供了回答
A2:Renderer.HasPropertyBlock()可以用来判断一个Renderer是否已经有PropertyBlock了,通常没有调用SetPropertyBlock之前,GetPropertyBlock得到的都是“空”的结果。有一个情况比较特殊,在动画里面用来控制材质球后(比如控制材质球的颜色),使用GetPropertyBlock去获取MaterialPropertyBlock,这样得到的结果是非“空”的,理论上应该是动画控制材质球使用的就是SetPropertyBlock来实现颜色变化的。
感谢Xuan@UWA问答社区提供了回答
UGUI
Q:我在带有RectMask2d的Scrollview节点下动态创建一些图标,发现打开页面时图标无法正常显示,滑动一下才显示出来,检查图标对象不可见时已经创建出来,同时对应的Inspector窗口缺少了Default UI Shader组件,请问有大佬知道是什么原因吗?
Debug发现图标对象能正常加入到RectMask2d的裁剪Hashset中,查看Frame Debug中图标不显示时与显示时少了一个Batch。
A:可以试试动态创建完成后调用Canvas.ForceUpdateCanvases,这个接口是让所有的UI元素及时刷新。
https://docs.unity3d.com/ScriptReference/Canvas.ForceUpdateCanvases.html
感谢Xuan@UWA问答社区提供了回答
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)