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();
}
1 Answer
1
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();
}
// ...
That is the intention of Kinematic, you are basically saying don't apply physic forces to this rigidbody when isKinematic is checked If you attach a rigidbody and you want the object to 'behave' you cannot make adjustments to the objects transform, you should make all movements using the rigidbody, addForce, MovePosition etc and do this inside FixedUpdate not Update
– outasyncIf you decided to try applying force method, you should not make your rigidbody kinematic. With force method, your rigidbody wont intersect with the terrain and wont cause jittering. It will just slide on it.
– toromano