why does this shader function cannot work?,why this shader function cannot work?

//vertex.x += _move;
this line works well, when I change the value of “move”, the mesh moves.
But when I use the “test” function and change the value again, it cannot work and stay still.
what’s wrong with my function?

Shader "Unlit/move"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _move ("move",float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _move;

            void test(float3 vertex){
                vertex.x += _move;
            }

            v2f vert (appdata v)
            {
                v2f o;
                test(v.vertex.xyz);
                //vertex.x += _move;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}

if I don’t use the “test” function, it works well. When I change the value of “move”,the mesh moves.
but when I was trying to use the “test” function, it cannot work!? What’s wrong with the function?

Shader "Unlit/move"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _move ("move",float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _move;

            void test(float3 vertex){
                vertex.x += _move;
            }

            v2f vert (appdata v)
            {
                v2f o;
                test(v.vertex.xyz);
                //vertex.x += _move;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}

The problem is that you are passing the vertex position in ‘by copy’ - meaning the value is copied and sent to the function, so modifying it there will only modify the copy. Instead, you want to pass the value in ‘by reference’, where the input parameter just points to the original variable and therefore will change its values. In HLSL this can be done using the ‘inout’ keyword;

void test (inout float3 vertex)
{
    vertex.x += _move;
}