Как сделать объект со случайными изображениями? - PullRequest
2 голосов
/ 04 июля 2019

Мне трудно работать с материалами, чтобы сделать свою игру более динамичной, я хочу наложить несколько скинов на мои объекты. Я попытался сделать размер материалов на сетке 3 и применить 3 материала, но это не выглядит хорошо, потому что я должен отключить третий материал, или второй и третий должны оставаться активными. Мой первый материал - цвет, и он должен остаться прежним.

Что я имею в виду, легко сказать с фото ..

Это мой кубический объект с одним материалом по умолчанию выглядит отлично: enter image description here

Вот что я хочу посмотреть, когда добавлю второй материал: enter image description here

Это когда я добавляю третий материал, второй все еще активен, и мне нужно только быть активным, второй или третий не активен, второй и третий

enter image description here

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

тогда мне нужен еще один активный в моем случае, только второй или третий, у меня проблема, потому что все материалы активны, и тогда мои объекты не выглядят так, как я хочу, чтобы они выглядели .. Я подумал сделать случайный скрипт, прикрепить его к каждому отдельному объекту, сделать 10 материалов в сетке и всегда активировать первый, выбрать случайное число от 1 до 10 и активировать только этот при запуске.

Также в единстве -> Единство жалуется, когда я добавляю второй материал, и он мне нужен для кожи. Может быть, есть лучший или правильный способ сделать то же самое ... Но я нашел только это решение ...

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

Большое спасибо сообществу, я не знаю, что бы я делал без тебя!

1 Ответ

1 голос
/ 04 июля 2019

Вы можете сделать для этого простой компонент:

[RequireComponent(typeof(Renderer))]
public class RandomMaterial : MonoBehaviour
{
    // Now in this list add all materials that shall be
    // options for the random selection
    [SerializeField] private Material[] materials;

    // Either already reference this in the Inspector
    // or get it later on runtime
    [SerializeField] private Renderer renderer;

    private void Awake()
    {
        if (!renderer) renderer = GetComponent<Renderer>();

        // A little check
        if(materials.Length == 0)
        {
            Debug.LogWarning("No Materials referenced! -> Ignored", this);
            return;
        }

        // get random index for material
        // first parameter is inclusive - second is exlusive
        // => index will be between 0 and materials.Length -1
        var index = Random.Range(0, materials.Length);
        var selectedMaterial = materials[index];

        // create a new array for 2 Materials
        // you can't simply assign renderer.materials[1]
        // because you don't know if there already are two spots
        // available in that array
        // also makes sure there no other materials left but only those
        // two you will add in the next lines
        var rendererMaterials = new Material[2];
        // keep the first (main) material
        rendererMaterials[0] = renderer.material;
        // set selected material as second material
        rendererMaterials[1] = selectedMaterial;
        // assign the new materials to the object
        renderer.materials = rendererMaterials;
    }
}

В зависимости от ваших потребностей вы также можете рассмотреть возможность использования renderer.sharedMaterials и соответственно rendererMaterials[0] = renderer.sharedMaterial; для использованияглобальные материалы вместо экземпляров.Это означает, что если вы позже измените свойства renderer.sharedMaterial|s, это повлияет на каждого исследователя сцены, использующего этот общий материал.В противном случае, если вы измените свойства Renderer.material|s, он создаст новый экземпляр Material, который влияет только на этот единственный Renderer.

...