Шейдер. Однозначно.
Я бы сделал это с помощью трех текстур (первая текстура, вторая текстура и черно-белая размытая маска) и одного ползунка в диапазоне от 0 до 1.
А в самом шейдере написал бы что-то типа этого:
o.Albedo = tex2D(Mask, In.uvMask).a < value ? tex2D(Tex1, In.uvTex1) : tex2D(Tex2, In.uvTex2);
где value - это тот самый ползунок в диапазоне от 0 до 1.
С помощью этого метода можно даже саму форму перехода менять во время воспроизведения.