Billboard shader not transforming normals correctly

Hi everyone,

I’m doing a 2.5 game a-la Bleak Sword, and I wanted to use the logical rotation of the object for gameplay, while mantaining the sprite looking always to an arbitrary direction (Z in this case).
I am working with a billboard shader that works fine, except if I rotate the object, the normals rotate with the object instead of retaining the billboard position (you can apreciate the lighting change, which should not be happening):


IIRC, this should work just by assigning (0, 0, -1) to the normal channel in the shader, but for reasons, none of my attemps seems to untie normal direction from object rotation.
Here is the shader in question (the relevant part, at least):

 void vert(inout appdata_full v, out Input o)
        {
            UNITY_INITIALIZE_OUTPUT(Input, o);
            // apply object scale
            v.vertex.xy *= float2(length(unity_ObjectToWorld._m00_m10_m20), length(unity_ObjectToWorld._m01_m11_m21));
          
            float3 forward = float3(0, 0, 1);
            float3 up = float3(0, 1, 0);
            float3 right = float3(1, 0, 0);
      
            float4x4 rotationMatrix = float4x4(right, 0,
                up, 0,
                forward, 0,
                0, 0, 0, 1);

            v.vertex = mul(v.vertex, rotationMatrix);
            v.normal = -forward;
            // undo object to world transform surface shader will apply
            v.vertex.xyz = mul((float3x3)unity_WorldToObject, v.vertex.xyz);

        }


            void surf(Input i, inout SurfaceOutput o) {                
                fixed4 col = tex2D(_MainTex, i.uv_MainTex);

                clip(col.a-0.0001);
                col *= _Color;
                o.Albedo = col.rgb;
                o.Normal = UnpackNormal(tex2D(_NormalMap, i.uv_NormalMap));
                o.Emission = _Emission;
            }

If you’re using normal maps, you also need to rotate the v.tangent.xyz.

Thanks! That was it, now it works perfectly