最近DOTS發(fā)布了正式的版本, 我們來分享現(xiàn)在流行基于群體戰(zhàn)斗的彈幕類游戲,實(shí)現(xiàn)的核心原理。今天給大家介紹大規(guī)模戰(zhàn)斗群體3D角色的動(dòng)畫如何來實(shí)現(xiàn)。
DOTS 對(duì)角色動(dòng)畫支持的局限性
截止到Unity DOTS發(fā)布的版本1.0.16,目前還是無(wú)法很好的支持3D角色動(dòng)畫。在DOTS 的baker過程種,不支持常見的動(dòng)畫組件,包括: Animation組件,基于狀態(tài)機(jī)的Animator, 以及人形動(dòng)畫。同時(shí)DOTS在節(jié)點(diǎn)Baker成Entity的過程種只支持MeshRenderer組件,不支持SkinnedMeshRenderer組件(SkinnedMeshRenderer組件很多轉(zhuǎn)換過來后顯示效果不正確)。所以DOTS要支持3D角色動(dòng)畫就變得非常的麻煩。目前主流的方案就兩個(gè):
總之,如果要用DOTS基于ECS來播放3D角色動(dòng)畫,目前Unity DOTS版本(1.0.16)是不直接支持的。
對(duì)啦!這里有個(gè)游戲開發(fā)交流小組里面聚集了一幫熱愛學(xué)習(xí)游戲的零基礎(chǔ)小白,也有一些正在從事游戲開發(fā)的技術(shù)大佬,歡迎你來交流學(xué)習(xí)。
《群體戰(zhàn)斗彈幕游戲》應(yīng)該使用哪種動(dòng)畫系統(tǒng)
《群體戰(zhàn)斗彈幕游戲》這類游戲應(yīng)該使用哪種動(dòng)畫系統(tǒng)會(huì)比較好呢?我們來分析一下項(xiàng)目需求,群體戰(zhàn)斗有大量的戰(zhàn)斗單元在一個(gè)屏幕,這些戰(zhàn)斗單元對(duì)單個(gè)的渲染質(zhì)量要求不高,但是數(shù)量巨大導(dǎo)致非常消耗性能。渲染質(zhì)量要求不高,這樣我們的戰(zhàn)斗單元的模型的面數(shù)可以盡量的低,這樣頂點(diǎn)數(shù)不會(huì)特別多,同時(shí)動(dòng)畫也不會(huì)很復(fù)雜,幀數(shù)也可以比較少??偨Y(jié)一下需求:?jiǎn)蝹€(gè)模型頂點(diǎn)面數(shù)少,動(dòng)畫簡(jiǎn)單不復(fù)雜,節(jié)點(diǎn)的數(shù)目很多。
基于幀動(dòng)畫的3D角色動(dòng)畫如何實(shí)現(xiàn)
基于幀動(dòng)畫的3D角色動(dòng)畫如何實(shí)現(xiàn)呢?結(jié)合彈幕游戲的3D角色動(dòng)畫簡(jiǎn)單的特點(diǎn),分成以下步驟來具體實(shí)現(xiàn):
- 基于URP來編寫一個(gè)最簡(jiǎn)單的Diffuse Shader,渲染沒有光照計(jì)算,陰影計(jì)算,直接將模型紋理貼到模型表面;
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 - 擴(kuò)展Diffuse Shader,添加anim功能,增加uniform 來接受動(dòng)畫紋理,包括動(dòng)畫紋理對(duì)象(sampler2D),動(dòng)畫的時(shí)間長(zhǎng)度(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;
} - 基于簡(jiǎn)單的Diffuse Shader+傳統(tǒng)的Animation組件做好普通的預(yù)制體節(jié)點(diǎn)給AnimBaker工具來使用
;
- 編寫一個(gè)工具,將普通3D角色動(dòng)畫的預(yù)制體節(jié)點(diǎn)中的動(dòng)畫進(jìn)行采樣,把數(shù)據(jù)保存到動(dòng)畫紋理,并創(chuàng)建角色Mesh+材質(zhì)(Difuse Anim Shader + Anim紋理+Anim時(shí)間)的預(yù)制體;
- 將生成好的預(yù)制體放到DOTS中的subscene來進(jìn)行Bake,Bake成Entity,這樣角色就可以帶動(dòng)畫了。
文章來源:http://www.zghlxwxcb.cn/news/detail-757216.html
今天的分享就到這里,需要本篇文章完整的項(xiàng)目工具與源碼的同學(xué)可以關(guān)注我文章來源地址http://www.zghlxwxcb.cn/news/detail-757216.html
到了這里,關(guān)于Unity DOTS《群體戰(zhàn)斗彈幕游戲》核心技術(shù)分析之3D角色動(dòng)畫的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!