Я сделал нечто подобное с пользовательским шейдером.Я думаю, что это будет делать то, что вы хотите.Мой динамически отображает флаги в зависимости от ранга и типа юнита для прототипа игры для iPad.То, как вы будете это делать, немного зависит от того, как у вас настроены вещи в вашем проекте, но вот то, что у меня выглядит - первое изображение - это каркас, показывающий сетку, а второе - с включенными шейдерами и показывает, что они добавляют цвета иэмблема в зависимости от ранга и единицы.Я только что включил шейдер для верхнего флага, так как в него добавлена эмблема отряда, похожая на то, как вы хотите, чтобы ваша татуировка была:
Обратите внимание, что вы можете прикрепить несколько шейдеров к определенной сетке.
А эмблема - это просто изображение с прозрачностью, которое добавляется в шейдер и упоминается как текстура внутри шейдера.:
Вы можете видеть, что у нас также есть изображение с некоторой текстурой тени, которая используется в качестве фона для баннера.
Это мой первый шейдер, который был написан некоторое время назад, поэтому я уверен, что он неоптимален во всех отношениях, но, надеюсь, этого будет достаточно, чтобы начать работу (и он все еще работает в Unity 2018.3.x, хотя япришлось взломать некоторые изменения, чтобы заставить его скомпилироваться):
Shader "Custom/TroopFlagEmblemShader" {
Properties {
_BackColor ("Background Color", Color) = (0.78, 0.2, 0.2) // scarlet
_MainTex ("Background (RGBA)", 2D) = "" {}
_EmblemTex("Emblem (RGBA)", 2D) = "" {}
_Rank ( "Rank (1-9)", Float ) = 3.0
}
SubShader {
Pass {
CGPROGRAM
#pragma exclude_renderers xbox360 ps3 flash
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex: POSITION;
float4 texcoord: TEXCOORD0;
};
struct v2f {
float4 pos: SV_POSITION;
float2 uv: TEXCOORD0;
};
uniform sampler2D _MainTex;
uniform sampler2D _EmblemTex;
uniform float3 _BackColor;
uniform float _Rank;
v2f vert( appdata v )
{
v2f o;
o.pos = UnityObjectToClipPos( v.vertex );
o.uv = v.texcoord.xy;
return o;
}
float4 frag( v2f IN ) : COLOR
{
float4 outColor;
float4 backTextureColor = tex2D( _MainTex, IN.uv.xy );
float4 emblemTextureColor = tex2D( _EmblemTex, IN.uv.xy );
// not drawing the square at all above rank 5
if ( _Rank >= 6.0 )
discard;
if ( _Rank < 5 ) // 4 and below
{
outColor = float4( (emblemTextureColor.rgb * emblemTextureColor.a) +
(((1.0 - emblemTextureColor.a) * backTextureColor.rgb) * _BackColor.rgb) , 1 );
// float4(_BackColor.rgb, 1 ));
}
else if ( _Rank >= 5.0 ) // but excluded from 6 above
{
// 5 is just solid backcolor combined with background texture
outColor = float4( backTextureColor.rgb * _BackColor.rgb, 1 );
}
return outColor;
}
ENDCG
}}
}
Шейдеры немного сводят с ума, чтобы научиться делать, но довольно забавно, когда вы заставите их работать - как большинство программ:)
В моем случае текстура наложения былаон того же размера / формы, что и флаг, что делает его немного легче.Я думаю, вам нужно добавить некоторые параметры в шейдер, которые указывают, где вы хотите, чтобы наложение было нарисовано относительно меша, и ничего не делаете для вершин / фрагментов за пределами границ татуировки, как первая мысль.