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 (13.71 Kio) Consulté 1791 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 (14.79 Kio) Consulté 1791 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 () {
}
}