Как динамически установить случайный материал в GameObject - PullRequest
0 голосов
/ 22 ноября 2018

Я абсолютный новичок в Unity, и мне было просто интересно, как установить материал из C #?

У меня есть сборная модель, и я без проблем могу изменить текстуру из редактора.То, что я хочу сделать, это установить материал случайным образом при создании экземпляра префаба.

Вот поле, которое я хочу изменить:

Unity Field

И я создаю их с помощью следующего кода:

Instantiate(eggPrefab, spawnPos, Quaternion.identity);

(где eggPrefab - публичное преобразование).

Надеюсь, этого достаточно!

Спасибо.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете сделать следующее, используя массив материалов.

    public Material[] materialsArray;
    public GameObject prefab;
    private Vector3 pos = new Vector3(0, 0, 0);
    private Quaternion rot = Quaternion.identity;

    private void Start()
    {
        Material mat = RandomMaterial(materialsArray);
        InstantiateWithMaterial(prefab, pos, rot, mat);
    }

    public Material RandomMaterial(Material[] _array_)
    {
        return _array_[Random.Range(0, _array_.Length)];
    }

    public void InstantiateWithMaterial(GameObject _prefab_, Vector3 _pos_, Quaternion _rot_, Material _mat_)
    {
        GameObject obj_ = Instantiate(_prefab_, _pos_, _rot_);
        obj_.gameObject.GetComponent<MeshRenderer>().material = _mat_;
    }

Это должно работать так, как вы хотите, просто поместите в пустой GameObject и заполните массив материалов всеми материалами, которые вы хотите.

0 голосов
/ 22 ноября 2018

Я думаю, что смешивание случайного материального поведения с поведением творения слишком усложняет вещи.Просто создайте компонент, который рандомизирует материал GameObject на Start , и он запустится, когда вы создадите экземпляр своего префаба.

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)];
  }

}

Прикрепите его к своему префабу и теперь, когда вы его породите, у них будут случайные материалы.Теперь у вас также есть возможность использовать тот же код и для других объектов.Только не забудьте назначить материалы!

0 голосов
/ 22 ноября 2018

После создания экземпляра 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;
}

Если у вас нет материала, вы можете создать его с шейдером и назначить его в 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;

Наконец, если у вас есть более одного материала, используйте свойство 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;

Редактировать:

Я пропустил случайную часть.Если вы хотите случайный выбор материала, просто используйте 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...