如何在GameObject上动态设置随机材质

ls_*_*dev 4 c# unity-game-engine

我是团结的新手,我只是想知道如何设置C#的材料?

我有一个预制模型,我可以从编辑器更改纹理没问题.我想要做的是在生成预制件实例时随机设置材料.

这是我要改变的字段:

统一场

我正在使用以下代码创建它们:

Instantiate(eggPrefab, spawnPos, Quaternion.identity);
Run Code Online (Sandbox Code Playgroud)

(其中eggPrefab是一个公共变换).

我希望这是足够的信息!

谢谢.

Pro*_*mer 5

在实例化GameObject之后,从中获取MeshRenderer然后更改它的材质:

public GameObject eggPrefab;
public Vector3 spawnPos;
public Material mat;

void Start()
{
    GameObject obj = Instantiate(eggPrefab, spawnPos, Quaternion.identity);
    obj.GetComponent<MeshRenderer>().material = mat;
}
Run Code Online (Sandbox Code Playgroud)

如果您没有该材质,则可以使用着色器创建一个并将其指定给MeshRenderer:

GameObject obj = Instantiate(eggPrefab, spawnPos, Quaternion.identity);

//Find the Standard Shader
Material mat = new Material(Shader.Find("Standard"));
//Set Texture on the material
//mat.SetTexture("_MainTex", yourTexture);

obj.GetComponent<MeshRenderer>().material = mat;
Run Code Online (Sandbox Code Playgroud)

最后,如果您有多个材质,则使用materials属性而不是material属性并将材质数组分配给它:

GameObject obj = Instantiate(eggPrefab, spawnPos, Quaternion.identity);

//Find the Standard Shader
Material mat = new Material(Shader.Find("Standard"));
//Set Texture on the material
//mat.SetTexture("_MainTex", yourTexture);

//Create array of mats (Create one for example)
Material[] mats = new Material[1];
mats[0] = mat;

obj.GetComponent<MeshRenderer>().materials = mats;
Run Code Online (Sandbox Code Playgroud)

编辑:

我错过了随机部分.如果要随机选择材质,只需使用Random.Range从材质数组中选择一个项目.

public GameObject eggPrefab;
public Vector3 spawnPos;
public Material[] mats;

void Start()
{
    GameObject obj = Instantiate(eggPrefab, spawnPos, Quaternion.identity);
    int matIndex = UnityEngine.Random.Range(0, mats.Length);
    obj.GetComponent<MeshRenderer>().material = mats[matIndex];
}
Run Code Online (Sandbox Code Playgroud)


CaT*_*aTs 1

我认为将随机材料行为与创造行为混合起来会使事情变得过于复杂。只需创建一个在“开始”时随机化游戏对象材质的组件,它就会在您实例化预制件时运行。

public class MaterialRandomiser : MonoBehaviour {

  [SerializeField]
  private Material[] _materials;
  [SerializeField]
  private Renderer _renderer;

  public void Start () {
    ChangeMaterial();
  }

  public void Reset () {
    _renderer = GetComponent<Renderer>();
  }

  public void ChangeMaterial () {
    _renderer.material = SelectRandomMaterial();
  }

  private Material SelectRandomMaterial () {
    return _materials[Random.Range(0, _materials.Length)];
  }

}
Run Code Online (Sandbox Code Playgroud)

将其附加到您的预制件上,现在当您生成它们时,它们将具有随机材质。您现在还可以选择在非预制对象上使用相同的代码。只是不要忘记分配材料!