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

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

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

Message par Kaloverian » 21 Nov 2020 03:30

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
Dernière édition par Kaloverian le 21 Nov 2020 21:56, édité 2 fois.

Avatar de l’utilisateur
Max
Messages : 8765
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 21 Nov 2020 11:14

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/
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

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

Message par Kaloverian » 21 Nov 2020 21:53

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é 1666 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é 1666 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 () {

	}
}


Avatar de l’utilisateur
Max
Messages : 8765
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 22 Nov 2020 10:37

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).
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

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

Message par Kaloverian » 22 Nov 2020 23:40

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 () {

	}
}



Répondre

Revenir vers « (C#) CSharp »