Change Material at runtime not work U5

Hi,

I trying to change material at runtime but this don’t work

DebugLog give me the right name of material (mat[PlayerManager.GetHelmet()]) but material won’t change.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using DynamicShadowProjector;

public class AvatarPlayerManager : MonoBehaviour {

	private List<GameObject> elsHelmetPlayer = new List<GameObject>();

	private GameObject el01;
	private GameObject el03;
	private GameObject el04;
	private GameObject el05;
	private GameObject el06;
	private GameObject el07;
	
	public GameObject mainCam;
	public GameObject shadowProjector;

	public Material[] mat;

	private GameObject playerGO;

	MeshRenderer meshrenderer;
	SkinnedMeshRenderer skinmeshrenderer;
	
	//----------------------
	//
	// SET PLAYER AND TEXTURE
	//
	//----------------------
	public void Awake () {
		// Load choosing avatar
		switch (PlayerManager.GetAvatar())
		{
		case 1:
			playerGO = Instantiate(Resources.Load("Fragola")) as GameObject; 
			break;
		case 2:
			playerGO = Instantiate(Resources.Load("Mirabulle")) as GameObject; 
			break;
		case 3:
			playerGO = Instantiate(Resources.Load("SnowBob")) as GameObject; 
			break;
		}
		// Set health gauge 
		playerGO.GetComponent<Health>().InitHealthForHealthGauge();
		// Setup camerafollow to avatar
		playerGO.transform.parent = this.gameObject.transform;
		// Set shadow projector to avatar
		shadowProjector.GetComponent<DrawTargetObject>().target = playerGO.transform;
		mainCam.GetComponent<CameraFollow>().target = playerGO.transform;
		// Set camera follow to avatar
		mainCam.GetComponent<CameraFollow>().InitCameraFollow();
		
		el01 = GameObject.Find("Hat");
		el03 = GameObject.Find("Pales");
		el04 = GameObject.Find("Pale_01");
		el05 = GameObject.Find("Pale_02");
		el06 = GameObject.Find("Manette_01");
		el07 = GameObject.Find("Manette_02");

		elsHelmetPlayer.Add(el03);
		elsHelmetPlayer.Add(el04);
		elsHelmetPlayer.Add(el05);
		elsHelmetPlayer.Add(el06);
		elsHelmetPlayer.Add(el07);

		InitHelmet();
	}
	// Use this for initialization
	void InitHelmet () {
		// Setup helmet choosed by user
		foreach (GameObject go in elsHelmetPlayer) { 
			if(UtilsManager.GetDebug()){Debug.Log(mat[PlayerManager.GetHelmet()]);}

			meshrenderer = go.GetComponent<MeshRenderer>() as MeshRenderer;
			meshrenderer.material = mat[PlayerManager.GetHelmet()] as Material;
		}
		skinmeshrenderer = el01.GetComponent<SkinnedMeshRenderer>() as SkinnedMeshRenderer;
		skinmeshrenderer.material = mat[PlayerManager.GetHelmet()] as Material;

		if(UtilsManager.GetDebug()){Debug.Log(meshrenderer.material.name);}
		if(UtilsManager.GetDebug()){Debug.Log(skinmeshrenderer.material.name);}
	}
}

I think you need to get materials array, swap it and put it back as the array (each material on the object is store in an array (shared material) which apparently is read only). Here you will find info how to do it : link text

Also are you sure you need to change material? do you need to change shader also or just a texture? If the second is enough for you use renderer.material.mainTexture or even better renderer.material.SetTexture.