How do you add a material and change the size in Mesh Renderer in C# scripting?
I have written this code to generate a procedural cube Sphere.
However I am having some trouble adding materials to the Mesh Renderer via c# scripting.
Can someone please explain to me how to add a material and add/change it's element size in the mesh renderer via scripting?
Here is my script and it fails to produce the material I want.
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] [ExecuteInEditMode()] public class CubeSphere : MonoBehaviour {
public float radius = 1f;
public Material Planet = Resources.Load("Planet", typeof(Material)) as Material;
public int gridSize;
private Mesh mesh;
private Vector3[] vertices;
private Vector3[] normals;
private Color32[] cubeUV;
private void Awake () {
Generate();
}
private void Generate() {
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
GetComponent<MeshRenderer>().material = Planet;
mesh.name = "Procedural Sphere";
CreateVertices();
CreateTriangles();
CreateColliders();
}
Answer by Statement · Oct 11, 2015 at 11:21 AM
Use MeshRenderer.materials or MeshRenderer.sharedMaterials.
You'll be working with arrays, so adding, removing or reordering materials would be done on a material array which then is set using any of the two properties mentioned above. Here's one example loading materials into a list, which then is converted to an array.
MaterialExtensions.cs (Extension method for easy resource loading)
using UnityEngine;
using System.Collections.Generic;
public static class MaterialExtensions
{
public static void AddResource(this ICollection<Material> materials, string resource)
{
Material material = Resources.Load(resource, typeof(Material)) as Material;
if (material)
materials.Add(material);
else
Debug.LogWarning("Material Resource '" + resource + "' could not be loaded.");
}
}
CubeSphere.cs
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
[ExecuteInEditMode()]
public class CubeSphere : MonoBehaviour
{
public float radius = 1f;
public int gridSize;
private Mesh mesh;
private Vector3[] vertices;
private Vector3[] normals;
private Color32[] cubeUV;
private void Awake()
{
Generate();
}
private void Generate()
{
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
List<Material> materialList = new List<Material>();
materialList.AddResource("Planet");
materialList.AddResource("Moon");
materialList.AddResource("Sun");
GetComponent<MeshRenderer>().materials = materialList.ToArray();
mesh.name = "Procedural Sphere";
CreateVertices();
CreateTriangles();
CreateColliders();
}
// ...
Your answer
Follow this Question
Related Questions
Broken materials when trying to export a unity package. 1 Answer
Issue with materials on runtime-loaded mesh. 0 Answers
How do I change the MATERIAL of this mesh when i press T 2 Answers
Assigning a sharedMaterial to multiple renderers that change together 0 Answers
Particle System - Project objects not visible in the 'Select Mesh' window under 'Renderer' 0 Answers