Shaders - changing the vertex color via script

Hi,

I’m having trouble trying to change the vertex color from my script. I have a shader that I thought was correctly written to do what I’m trying to accomplish, but I must have an error in it somewhere. The script works, but the game objects that I’m trying to change the color of, remain the same color.

Here is my shader:

Shader "My Shaders/Normal Maps/OptimizedNormal"
{
	
	Properties
	{
	
		_Color( "ColorTint", Color ) = ( 1.0, 1.0, 1.0, 1.0 )
		_BumpMap( "NormalTexture", 2D ) = "bump" {}
		_BumpDepth( "BumpDepth", Range( 0.0, 1.0 ) ) = 1
		_SpecColor( "SpecularColor", Color ) = ( 1.0, 1.0, 1.0, 1.0 )
		_Shininess( "Shininess", float ) = 10
	}
	
	SubShader
	{
		
		Pass
		{
		
			Tags { "LightMode" = "ForwardBase" }
			
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma fragmentoption ARB_precision_hint_fastest
			
			//user defined variables
			uniform fixed4 _Color;
			uniform sampler2D _BumpMap;
			uniform fixed _BumpDepth;
			uniform half4 _BumpMap_ST;
			uniform fixed4 _SpecColor;
			uniform half _Shininess;
			
			//unity defined variables
			uniform half4 _LightColor0;
			
			//base input structs
			struct vertexInput
			{
			
				half4 vertex : POSITION;
				half3 normal : NORMAL;
				half4 texcoord : TEXCOORD0;
				half4 tangent : TANGENT;
			};
			
			struct vertexOutput
			{
			
				half4 pos : SV_POSITION;
				half4 tex : TEXCOORD0;
				fixed4 lightDirection : TEXCOORD1;
				fixed3 viewDirection : TEXCOORD2;
				fixed3 normalWorld : TEXCOORD3;
				fixed3 tangentWorld : TEXCOORD4;
				fixed3 binormalWorld : TEXCOORD5;
			};
			
			
			//vertex function
			vertexOutput vert( vertexInput v )
			{
			
				vertexOutput o;
				o.normalWorld = normalize( mul( half4( v.normal, 0.0 ), _World2Object ).xyz );
				o.tangentWorld = normalize( mul( _Object2World, v.tangent ).xyz );
				o.binormalWorld = normalize( cross( o.normalWorld, o.tangentWorld ) * v.tangent.w );
				
				half4 posWorld = mul( _Object2World, v.vertex );
				o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
				o.tex = v.texcoord;
				
				o.viewDirection = normalize( _WorldSpaceCameraPos.xyz - posWorld.xyz );
				
				half3 fragmentToLightSource = _WorldSpaceLightPos0.xyz - posWorld.xyz;
				
				o.lightDirection = fixed4( 
					normalize( lerp( _WorldSpaceLightPos0.xyz, fragmentToLightSource, _WorldSpaceLightPos0.w ) ),
					lerp( 1.0, 1.0/length( fragmentToLightSource ), _WorldSpaceLightPos0.w ) );
				
				return o;
			}
			
			//fragment function
			fixed4 frag( vertexOutput i ) : COLOR
			{
				
				//texture Maps
				fixed4 texN = tex2D( _BumpMap, i.tex.xy * _BumpMap_ST.xy + _BumpMap_ST.zw );
				
				//unPackNormal function
				fixed3 localCoords = fixed3( 2.0 * texN.ag - float2( 1.0, 1.0 ), _BumpDepth );
				
				//normal transpose matrix
				fixed3x3 local2WorldTranspose = fixed3x3(
					i.tangentWorld,
					i.binormalWorld,
					i.normalWorld
				);
				
				//calculate normal direction
				fixed3 normalDirection = normalize( mul( localCoords, local2WorldTranspose ) );
				
				//Lighting
				//dot product
				fixed nDotL = saturate( dot( normalDirection, i.lightDirection.xyz ) );
				
				fixed3 diffuseReflection = i.lightDirection.w * _LightColor0.xyz * nDotL;
				fixed3 specularReflection = diffuseReflection * _SpecColor.xyz * pow( saturate( dot( reflect( -i.lightDirection.xyz, normalDirection ), i.viewDirection ) ), _Shininess);
				
				fixed3 lightFinal = UNITY_LIGHTMODEL_AMBIENT.xyz + diffuseReflection + ( specularReflection );
				
				return fixed4( lightFinal * _Color.rgb, 1.0 );
			}
			
			ENDCG
		}
	}
	//Fallback "Diffuse"
}

I thought that declaring _Color as uniform allows me to change the default value of the verts from my C# script, but the objects remain white. This is the C# script that I wrote for changing the verts color:

 void Start ()
{               
                GameObject[] gos;
		gos = GameObject.FindGameObjectsWithTag( "Container" );
		int colorNumber = 0;
		print ("here1");
		
		foreach( GameObject go in gos )
		{
		
			var mf = go.GetComponent<MeshFilter>();
			var colors = new Color[ mf.sharedMesh.vertexCount];
			print ("here2");
			Debug.Log(colors.Length);
			
			if( colorNumber == 0 )
			{
				print ("here3");
				for(var i = 0; i < colors.Length; i++)
				{
					colors *= new Color( 1, 0, 0, 1 );*
  •  		}*
    
  •  		mf.mesh.colors = colors;*
    
  •  		colorNumber = 1;*
    
  •  	}*
    
  •  	if( colorNumber == 1 )*
    
  •  	{*
    
  •  		print ("here4");*
    
  •  		for(var i = 0; i < colors.Length; i++)*
    
  •  		{*
    

_ colors = new Color( 0, 1, 0, 1 );_
* }*

* mf.mesh.colors = colors;*
* colorNumber = 2;*
* }*

* if( colorNumber == 2 )*
* {*

* for(var i = 0; i < colors.Length; i++)*
* {*
_ colors = new Color( 0, 0, 1, 1 );_

* }*
* mf.mesh.colors = colors;*
* colorNumber = 3;*
* }*

* if( colorNumber == 3 )*
* {*

* for(var i = 0; i < colors.Length; i++)*
* {*
_ colors = new Color( 0.5f, 0.25f, 0, 1 );
* }
mf.mesh.colors = colors;
colorNumber = 4;
}*_

* if( colorNumber == 4 )*
* {*

* for(var i = 0; i < colors.Length; i++)*
* {*
_ colors = new Color( 0.3f, 0, 0.2f, 1 );
* }
mf.mesh.colors = colors;
colorNumber = 0;
}
}
}*

Both the shader and C# scripts run without error, but like I said, the color of the game object just remains as the default white that I set in the top of the shader.
Does anyone know where I’m going wrong? I have a feeling that I haven’t got something right in the shader.
Any help is much appreciated. Thanks_

You should change your shader’s property by setting the material’s property. Something like:

material.SetColor("_Color", someColor)

Assuming your shader is assigned to the material of the gameObject.