Wie ordne ich einem Spielobjekt über ein c # -Skript mehrere Materialien zu?

Was ich bisher ausprobiert habe ist:

public GameObject go;
public Material Mat1;
public Material Mat2;
void Start()
{ 
     //this does not work
     go.GetComponent<Renderer>().materials[0] = Mat1; 
}
3
user11458208 26 Juni 2019 im 12:11

3 Antworten

Beste Antwort

Sie können die Materialien nicht direkt aktualisieren, müssen jedoch ein neues Materialarray erstellen und zuweisen.

void Start()
    {
        //create your materials
        var yourMaterials = new Material[] { Mat1, Mat2 };
        //assign it
        go.GetComponent<Renderer>().materials = yourMaterials ;
    }

Sie können auch die Dokumentation überprüfen.

Beachten Sie, dass wie bei allen von Unity zurückgegebenen Arrays eine Kopie des Materialarrays zurückgegeben wird. Wenn Sie einige Materialien darin ändern möchten, rufen Sie den Wert ab, ändern Sie einen Eintrag und setzen Sie Materialien zurück.

1
Jack Mariani 26 Juni 2019 im 09:18

Aus der Dokumentation:

Beachten Sie, dass wie bei allen von Unity zurückgegebenen Arrays eine Kopie des Materialarrays zurückgegeben wird. Wenn Sie einige Materialien darin ändern möchten, rufen Sie den Wert ab, ändern Sie einen Eintrag und setzen Sie Materialien zurück.

Renderer rend = go.GetComponent<Renderer>();
Material [] mats = rend.materials;
mats[0] = Mat1;
rend.materials = mats;
1
Everts 26 Juni 2019 im 09:19

Wenn Sie mehrere Materialien ändern möchten, müssen Sie das gesamte Array ändern. Sie erstellen also zunächst ein Array von Materialien mit der gleichen Länge wie der aktuelle Renderer:

Material[] newMaterials = renderer.sharedMaterials;
for(int i = 0; i <newMaterials.Length; i++)
{
newMaterials[i] = theMaterialYouWantToSetX;
}

Und dann weisen Sie das Array dem Renderer zu:

renderer.materials = newMaterials;
1
piotrb92 26 Juni 2019 im 09:23