Shader Vert Offsets in local space

I have a shader that applies offset to each vertex based on a sin wave, this is the vert function:

	void vert ( inout appdata_full v ) 
	{		
		float twoPi = 2 * 3.141592653;

		float4 change = float4( 0, 0, 0, 0 );
		
		float redSin = sin(_Time.x * _Speed) * _Amplifier;
		change.x += redSin * _RedStrength;	
  		
		change = mul ( _World2Object, change );

		v.vertex += change;
	}

If object has no rotations, everything works great. But if object is rotated, it moves as if it is not rotated. So, regardless of rotations all of the objects with this shader move uniformly. I made it so that each material is instanced, not shared, but that didn’t help. What am I missing?

Also, I looked at this: Modifying vertex position in a surface shader - Questions & Answers - Unity Discussions and getting the local vertex positions in vertex shader - Questions & Answers - Unity Discussions and Get local position in surface shader - Unity Answers, but none of these helped :(.

Also, if I don’t multiply change by _World2Object, shader behaves differently depending on the distance from the camera… If object is rotated, axis of movement switches at different distances. Weird!!!..

Please HALP! How do I apply vert changes in local space?

EDIT: This is a surface shader.

The point of a vertex subshader is to transform the vertices from local to screen space. You still need to do that conversion manually, after you’ve done your sin wave transformation. Check out these official examples.