Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画

news2025/1/19 7:55:21

最近DOTS发布了正式的版本, 我们来分享现在流行基于群体战斗的弹幕类游戏,实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。

DOTS 对角色动画支持的局限性

截止到Unity DOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS 的baker过程种,不支持常见的动画组件,包括: Animation组件,基于状态机的Animator, 以及人形动画。同时DOTS在节点Baker成Entity的过程种只支持MeshRenderer组件,不支持SkinnedMeshRenderer组件(SkinnedMeshRenderer组件很多转换过来后显示效果不正确)。所以DOTS要支持3D角色动画就变得非常的麻烦。目前主流的方案就两个:

总之,如果要用DOTS基于ECS来播放3D角色动画,目前Unity DOTS版本(1.0.16)是不直接支持的。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

《群体战斗弹幕游戏》应该使用哪种动画系统

《群体战斗弹幕游戏》这类游戏应该使用哪种动画系统会比较好呢?我们来分析一下项目需求,群体战斗有大量的战斗单元在一个屏幕,这些战斗单元对单个的渲染质量要求不高,但是数量巨大导致非常消耗性能。渲染质量要求不高,这样我们的战斗单元的模型的面数可以尽量的低,这样顶点数不会特别多,同时动画也不会很复杂,帧数也可以比较少。总结一下需求:单个模型顶点面数少,动画简单不复杂,节点的数目很多。

基于帧动画的3D角色动画如何实现

基于帧动画的3D角色动画如何实现呢?结合弹幕游戏的3D角色动画简单的特点,分成以下步骤来具体实现:

  1. 基于URP来编写一个最简单的Diffuse Shader,渲染没有光照计算,阴影计算,直接将模型纹理贴到模型表面;
    HLSLPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    // Includes
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
    #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    struct appdata
    {
    float2 uv : TEXCOORD0;
    float4 pos : POSITION;
    UNITY_VERTEX_INPUT_INSTANCE_ID
    };
    struct v2f
    {
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;
    UNITY_VERTEX_INPUT_INSTANCE_ID
    };
    CBUFFER_START(UnityPerMaterial)
    sampler2D _MainTex;
    float4 _MainTex_ST;
    // float _AnimLen;
    // sampler2D _AnimMap;
    // float4 _AnimMap_TexelSize;//x == 1/width
    CBUFFER_END
    float4 ObjectToClipPos(float3 pos)
    {
    return mul(UNITY_MATRIX_VP, mul(UNITY_MATRIX_M, float4 (pos,1)));
    }
    v2f vert(appdata v, uint vid : SV_VertexID)
    {
    UNITY_SETUP_INSTANCE_ID(v);
    v2f o;
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    o.vertex = ObjectToClipPos(v.pos);
    return o;
    }
    float4 frag(v2f i) : SV_Target
    {
    float4 col = tex2D(_MainTex, i.uv);
    return col;
    }
    ENDHLSL
  2. 扩展Diffuse Shader,添加anim功能,增加uniform 来接受动画纹理,包括动画纹理对象(sampler2D),动画的时间长度(float);
    v2f vert(appdata v, uint vid : SV_VertexID)
    {
    UNITY_SETUP_INSTANCE_ID(v);
    float f = _Time.y / _AnimLen;
    fmod(f, 1.0);
    float animMap_x = (vid + 0.5) * _AnimMap_TexelSize.x;
    float animMap_y = f;
    float4 pos = tex2Dlod(_AnimMap, float4(animMap_x, animMap_y, 0, 0));
    v2f o;
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    o.vertex = ObjectToClipPos(pos);
    return o;
    }
  3. 基于简单的Diffuse Shader+传统的Animation组件做好普通的预制体节点给AnimBaker工具来使用

;

  1. 编写一个工具,将普通3D角色动画的预制体节点中的动画进行采样,把数据保存到动画纹理,并创建角色Mesh+材质(Difuse Anim Shader + Anim纹理+Anim时间)的预制体;

  1. 将生成好的预制体放到DOTS中的subscene来进行Bake,Bake成Entity,这样角色就可以带动画了。

今天的分享就到这里,需要本篇文章完整的项目工具与源码的同学可以关注我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1280525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】tensorflow学习的个人纪录(2)

actor.learn(s, a, td_error)def learn(self, s, a, td):s s[np.newaxis, :]feed_dict {self.s: s, self.a: a, self.td_error: td}_, exp_v self.sess.run([self.train_op, self.exp_v], feed_dict)return exp_v输入变量的数值: 步进: []---->[…

算法设计与实现--动态规划篇

什么是动态规划算法 动态规划算法是一种求解复杂问题的方法,通过将原问题分解为相对简单的子问题来求解。其基本思想是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子…

割裂式“多渠道”不是真正的全渠道!浅析全渠道零售和DTC在理念上的不谋而合|徐礼昭

图文:徐礼昭 全渠道零售概念解析 全渠道零售概念由来已久,单纯从业务经营角度,一个品牌在线上线下多个渠道铺货卖货,只能说是多渠道零售,而不是全渠道零售。商派市场负责人徐礼昭认为,品牌企业应该从消费者…

前后端分离部署https

引用:https://blog.csdn.net/weixin_35676679/article/details/127841598 前后端部署,,一般用的是nginx和java,,, 下载SSL证书: java配置https 将证书配置到springboot中 server:port: 544…

为什么要构建指标中台?数据指标的问题

1、综合内部实践和外部交流,指标使用问题主要集中在以下六大方面: 指标口径不一致:常规数据质量问题统计中,约有 31% 涉及指标口径问题; 指标入口不统一:缺少一个企业级的统一消费入口,不知道从…

Ubuntu22.04无需命令行将软件更新源切换到国内

1、右上角打开设置 2、在设置中拉到最下面点击About,然后点击Software Updates 3、点击下拉框 4、选择other 5、找到China,选择一个网址,然后点击Choose Server 6、输入密码并回车 7、点击Close 8、点击Reload 9、等待完成即可 10、等结束之后…

【数电笔记】16-卡诺图绘制(逻辑函数的卡诺图化简)

目录 说明: 最小项卡诺图的组成 1. 相邻最小项 2. 卡诺图的组成 2.1 二变量卡诺图 2.2 三表变量卡诺图 2.3 四变量卡诺图 3. 卡诺图中的相邻项(几何相邻) 说明: 笔记配套视频来源:B站;本系列笔记并…

【STM32】STM32学习笔记-软件安装(03)

00. 目录 文章目录 00. 目录01. MDK安装02. Keil5注册03. 支持包安装04. ST-LINK驱动安装05. USB转串口驱动06. 附录 01. MDK安装 MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。在全球 MDK 被超过 10 万的嵌入式开发工程师使用。目前最新版本为: …

Python生产者消费者模型

额滴名片儿 🎈 博主:一只程序猿子 🎈 博客主页:一只程序猿子 博客主页 🎈 个人介绍:爱好(bushi)编程! 🎈 创作不易:如喜欢麻烦您点个👍或者点个⭐&#xff01…

Python面向对象⑤:多态【侯小啾python领航班系列(二十三)】

Python面向对象⑤:多态【侯小啾python领航班系列(二十三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

Pytest测试攻略:探寻pytest.main()隐藏的利器

更多资料获取 📚 个人网站:ipengtao.com 在Pytest测试框架中,pytest.main()是一个重要的功能,用于启动测试执行。它允许以不同方式运行测试,传递参数和配置选项。本文将深入探讨pytest.main()的核心功能,提…

大数据技术学习笔记(七)—— Zookeeper

目录 1 Zookeeper 概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 数据结构1.5 应用场景 2 Zookeeper 安装3 客户端命令行操作4 Zookeeper 的 Java 客户端操作4.1 IDEA 环境搭建4.2 初始化 ZooKeeper 客户端4.3 创建子节点4.4 获取子节点4.5 判断Znode是否…

根据豆瓣对《流浪地球》的短评数据进行文本分析和挖掘

1背景 2019年2月5日电影《流浪地球》正式在中国内地上映。该电影在举行首映的时候,口德好得出奇,所有去看片的业界大咖都发出了画样赞叹,文化学者能锦说:“中国科幻电影元年开启了。"导演徐峰则说,“里程碑式的电影&#xf…

Debian12配置ssh服务器

Debian12配置ssh服务器 安装ssh-server sudo apt install openssh-server启动ssh sudo systemctl start ssh启用ssh sudo systemctl enable ssh查看ssh状态 sudo systemctl status ssh可以看到有enabled和running字样 说明ssh启用成功 连接到服务器 # username是你的用…

洛谷 P5715 三位数排序 C++代码

目录 前言 思路点拨 AC代码1 AC代码2 AC代码3 结尾 前言 今天我们来做洛谷上的一道题目。 网址:【深基3.例8】三位数排序 - 洛谷 思路点拨 ​ 这题思路很简单,就是普通的排序题目。 但是我们要学习小题大做这个道理,于是我将介绍三…

第十五届蓝桥杯模拟赛(第二期)

大家好,我是晴天学长,本次分享,制作不易,本次题解只用于学习用途,如果有考试需要的小伙伴请考完试再来看题解进行学习,需要的小伙伴可以点赞关注评论一波哦!后续会继续更新第三期的。&#x1f4…

Nacos 客户端版本从1.x 升级到 2.x 的排坑记

问题描述 应用引入 Nacos Config 配置管理功能,应用启动时读取 Nacos 配置中心的配置作为启动参数,其中包括数据源信息 url 。 当 Nacos 正在进行 GC 操作、无法响应客户端请求时,应用端刚启动时发送的登录认证请求 http://IP:PORT/nacos/v…

本地仓库设置阿里云镜像

一、maven 修改maven配置文件conf/settings&#xff0c;在mirrors节点下添加以下内容 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public&l…

JVM垃圾回收机制GC

一句话介绍GC&#xff1a; 自动释放不再使用的内存 一、判断对象是否能回收 思路一&#xff1a;引用计数 给这个对象里安排一个计数器&#xff0c; 每次有引用指向它&#xff0c; 就把计数器1&#xff0c; 每次引用被销毁&#xff0c;计数器-1&#xff0c;当计数器为0的时候…

电源自动切换初识

【前提&#xff1a;这里以一般的单片机产品为例&#xff0c;使用3.3V的供电系统&#xff0c;常见的USB供电、外接电源设配器供电和电池供电】 一、经典二极管切换电路 这是最简单的电源切换电路&#xff1a;二极管并联&#xff0c;理论上支持无数个电源切换&#xff0c;缺点是…