SpriteRenderer.SetPropertyBlock has no effect

Hi, I am using Unity 5.5.1

I have a custom shader, it’s created from Sprite/Default, and I added 2 properties, like this

    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        [PerRendererData] _ActorY ("ActorY", Float) = 0             // My own data
        [PerRendererData] _ActorZ ("ActorZ", Float) = 0             // My own data
    }

And I set these 2 properties in my script:

SpriteRenderer SR;
MaterialPropertyBlock matProBlock = null;
void Update()
{
        if (matProBlock == null)
            matProBlock = new MaterialPropertyBlock();

        SR.GetPropertyBlock(matProBlock);
        matProBlock.SetFloat("_ActorY", trans.position.y);
        matProBlock.SetFloat("_ActorZ", m_zHeight);
        SR.SetPropertyBlock(matProBlock);
}

The problem is:
_ActorY and _ActorZ are always 0 when I get them in shader.

If I just use this code, everything is fine.

void Update()
{
    SR.material.SetFloat("_ActorY", trans.position.y);
    SR.material.SetFloat("_ActorZ", m_zHeight);
}

So, does SpriteRender eat my properties?

I already know why, I didn’t call SetPropertyBlock

SR.SetPropertyBlock(matProBlock);

But I also figure out that if SetPropertyBlock is called for every sprite, then these sprites will not be batched together.
The way to use MaterialPropertyBlock and also enable batching is:
Pass _ActorY and _ActorZ through _Color, or vertex, or UV2, UV3…etc.