Page 1 sur 1

comment manipuler dans un script un objet à plusieurs matériaux?

Publié : 21 Nov 2020 03:30
par Kaloverian
bonjour,

J'ai l'habitude de réaliser des scripts manipulant des objets dotés d'un seul matériau:

Code : Tout sélectionner


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

public class myScript: MonoBehaviour {

public GameObject myObject_with_unique_material;
public Mesh meshObject;
public Material noir;

void Start () {

myObject_with_unique_material.AddComponent<MeshRenderer>().material = noir;;

}

}
Maintenant,une fois que myScript2 est réalisé,je dois mettre dans son champ vide(grâce à "public") un objet comportant déjà 2 marériaux

Code : Tout sélectionner

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

public class myScript2: MonoBehaviour {

public GameObject myObject_with_two_materials;
public Mesh meshObject;
public Material blanc,noir;

void Start () {

myObject_with_two_materials.AddComponent<MeshRenderer>().material[0] = blanc;  //1
myObject_with_two_materials.AddComponent<MeshRenderer>().material[1] = noir;      //2

}

}

Mes questions simples:
1)De quelle manière dans myScript2 je déclare un tableau de matériaux comportant 2 éléments de façon à ce que les lignes 1 et 2 du script fonctionnent?

2)même question si je décide de rentrer et choisir le nombre de matériaux(sérialisation)


merci de votre aide

Re: comment manipuler dans un script un objet à plusieurs matériaux?

Publié : 21 Nov 2020 11:14
par Max
Bonjour,

je ne comprends pas trop. Tu as un GameObject, et tu lui ajoutes à deux reprises un composant 'MeshRenderer'.
C'est quoi l'objectif ? Tu ne confonds pas plutôt AddComponent avec GetComponent ?
Pour ce qui est des materials, regarde du coté de Renderer.materials.
Tu as pas mal d'exemples d'utilisation sur le net, comme par exemple ici: https://forum.unity.com/threads/setting ... pt.519526/

Re: comment manipuler dans un script un objet à plusieurs matériaux?

Publié : 21 Nov 2020 21:53
par Kaloverian
Bon...j'illustre mon problème

le 1er code modifié donne un Mesh Renderer comme ceci:
Unity-objet généré avec 1 seul matériau.PNG
Unity-objet généré avec 1 seul matériau.PNG (13.71 Kio) Consulté 1667 fois

Code : Tout sélectionner

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

public class script1: MonoBehaviour {

	public GameObject carre_noir;
	public int nombre_maxi;
	public float echelle_carre;
	List<GameObject> CarreNoirList;

	public Mesh mesh;
	public Material ,noir;

	int i,j;
	int k=0;
	
	// Use this for initialization
	void Start () {
	
		CarreNoirList = new List<GameObject>();
		CarreNoirList.Add(carre_noir);
		CarreNoirList[0] = carre_noir;

		for(i=-nombre_maxi;i<=nombre_maxi;i++)
		{for(j=-nombre_maxi;j<=nombre_maxi;j++)
			{ k++; 
				print("k= "+k);
				CarreNoirList.Add(carre_noir);
				CarreNoirList[k] =new GameObject("carre_noir"+k);

				Vector3 newPos = new Vector3(echelle_carre*2*i, 0, echelle_carre*2*(i+j));
				CarreNoirfList[k].transform.position = newPos;
				CarreNoirList[k].transform.localScale = new Vector3(echelle_carre,0.1f,echelle_carre);		
				CarreNoirList[k].AddComponent<MeshRenderer>().material =noir
				CarreNoirList[k].AddComponent<MeshFilter>().mesh = mesh;

			}
		}
	}

	// Update is called once per frame
	void Update () {

	}
}
le 2ème code modifié que je n'arrive pas à implémenter devrait donner un Mesh Renderer comme ceci:
2 materials-Unity.PNG
2 materials-Unity.PNG (14.79 Kio) Consulté 1667 fois

Code : Tout sélectionner

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

public class script2: MonoBehaviour {

	public GameObject damier; //damier contient des carrés noirs et blancs(2 matériaux)
	public int nombre_maxi;
	public float echelle_carre;
	List<GameObject> DamierList;

	public Mesh mesh;
	//public Material ,noir;
	int i,j;
	int k=0;
	
	// Use this for initialization
	void Start () {
	
		DamierList = new List<GameObject>();
		DamierList.Add(carre_noir);
		DamierList[0] = carre_noir;

		for(i=-nombre_maxi;i<=nombre_maxi;i++)
		{for(j=-nombre_maxi;j<=nombre_maxi;j++)
			{ k++; 
				print("k= "+k);
				DamierList.Add(damier);
				DamierList[k] =new GameObject("damier"+k);
				Vector3 newPos = new Vector3(echelle_carre*2*i, 0, echelle_carre*2*(i+j));
				DamierList[k].transform.position = newPos;
				DamierList[k].transform.localScale = new Vector3(echelle_carre,0.1f,echelle_carre);		
				//DamierList[k].AddComponent<MeshRenderer>().material =QUE DOIS-JE ECRIRE ?
				
				//DamierList[k].AddComponent<MeshRenderer>().material=noir;
				//DamierList[k].AddComponent<MeshRenderer>().material =blanc;
				//ça ne fonctionne pas !!!
				
				//DamierList[k].AddComponent<MeshRenderer>().material =damier.GetComponent<MeshRenderer>().material;
				//ça ne fonctionne pas non plus !!!
				DamierList[k].AddComponent<MeshFilter>().mesh = mesh;

			}
		}
	}

	// Update is called once per frame
	void Update () {

	}
}


Re: comment manipuler dans un script un objet à plusieurs matériaux?

Publié : 22 Nov 2020 10:37
par Max
Bonjour,

sur un component MeshRenderer, la variable materials fait référence à un tableau de materials.
Donc si tu souhaites avoir plusieurs materials référencés sur ton MeshRenderer, il faut déjà définir ce tableau par toi même, et en suite passer la référence à ton MeshRenderer.
Ce qui donnerait quelque chose comme:

Code : Tout sélectionner

Material[] mesMaterials = new Material[2]; // pour un tableau de deux materials comme tu le souhaites
...
monMeshRenderer.materials = mesMaterials;
avec bien sur le tableau mesMaterials initialisé avec deux materials valides (sinon ton gameobject restera violet).

Re: comment manipuler dans un script un objet à plusieurs matériaux?

Publié : 22 Nov 2020 23:40
par Kaloverian
script 2 corrigé:

Code : Tout sélectionner

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

public class script2: MonoBehaviour {

	public GameObject damier; //damier contient des carrés noirs et blancs(2 matériaux)
	public int nombre_maxi;
	public float echelle_carre;
	List<GameObject> DamierList;

	public Mesh mesh;
	public Material blanc,noir;
	Material[] mesMaterials = new Material[2]; // pour un tableau de deux materials comme tu le souhaites
...     
	int i,j;
	int k=0;
	
	// Use this for initialization
	void Start () {
	
		DamierList = new List<GameObject>();
		DamierList.Add(carre_noir);
		DamierList[0] = carre_noir;

		for(i=-nombre_maxi;i<=nombre_maxi;i++)
		{for(j=-nombre_maxi;j<=nombre_maxi;j++)
			{ k++; 
				print("k= "+k);
				DamierList.Add(damier);
				DamierList[k] =new GameObject("damier"+k);
				
			       mesMaterials[0]=blanc;
		               mesMaterials[1]=noir;
		               
				Vector3 newPos = new Vector3(echelle_carre*2*i, 0, echelle_carre*2*(i+j));
				DamierList[k].transform.position = newPos;
				DamierList[k].transform.localScale = new Vector3(echelle_carre,0.1f,echelle_carre);		
				DamierList[k].AddComponent<MeshRenderer>().materials =mesMaterials;
				
				
				DamierList[k].AddComponent<MeshFilter>().mesh = mesh;

			}
		}
	}

	// Update is called once per frame
	void Update () {

	}
}