本文介绍: 在DOTS 的baker过程种,不支持常见动画组件,包括: Animation组件,基于状态机的Animator, 以及人形动画我们分析一下项目需求,群体战斗有大量的战斗单元一个屏幕,这些战斗单元对单个的渲染质量要求不高,但是数量巨大导致非常消耗性能渲染质量要求不高,这样我们战斗单元模型的面数可以尽量的低,这样顶点数不会特别多,同时动画也不会很复杂,帧数也可以比较少。最近DOTS发布了正式的版本, 我们来分享现在流行基于群体战斗的弹幕类游戏实现核心原理基于帧动画的3D角色动画如何实现

最近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.renderpipelines.universal/ShaderLibrary/DOTS.hlsl”
    #include “Packages/com.unity.renderpipelines.core/ShaderLibrary/Color.hlsl”
    #include “Packages/com.unity.renderpipelines.universal/ShaderLibrary/Core.hlsl”
    #include “Packages/com.unity.renderpipelines.universal/ShaderLibrary/Lighting.hlsl”
    #include_with_pragmas “Packages/com.unity.renderpipelines.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,这样角色就可以带动画了。

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

原文地址:https://blog.csdn.net/voidinit/article/details/134714421

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_35726.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注