如何使用随机图像制作 object?

How to make the object with random images?

我很难处理 materials,为了让我的游戏更有活力,我想在我的 objects 上应用一些皮肤.. 我试图将网格渲染器上 materials 的大小设置为 3 并应用 3 materials,但它看起来不太好,因为我必须关闭第三个 material 或第二个和第三需要保持活跃.. 我的第一个 material 是颜色,它必须保持不变。

我的意思用照片很容易说..

这是我的立方体 object,默认情况下有一个 material 看起来很完美:

这是我添加第二个时想要查看的内容 material:

这是我添加第三个的时候material第二个仍然活跃我只需要活跃第二个或第三个不活跃第二个和第三个

所以问题是在我的情况下,我只想在我的 object 上激活两个 material 在我的示例中,第一个始终需要在我的照片中命名为活动 "New Material 2"

然后我只需要第二个或第三个在我的案子上再激活一个,我有问题,因为所有 material 都处于活动状态,然后我的 object 看起来不像我想要的那样看.. 我想让随机脚本将它附加到每个 object 在网格中制作 10 materials 并始终激活第一个并选择从 1 到 10 的随机数并在开始时只激活那个。

同样在 unity -> 当我添加第二个时 Unity 抱怨 material 我需要它来做皮肤也许有更好或正确的方法来做同样的事情..但我只找到了这个解决方案..

所以我的问题是如何为我的立方体蒙皮并向其添加多个蒙皮并随机选择它们,其中默认 material 或颜色将始终处于活动状态。

非常感谢社区,我不知道没有你我该怎么办!

您可以为此制作一个简单的组件:

[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; 以便使用全局 Material 而不是实例化的。这意味着如果您稍后更改 renderer.sharedMaterial|s 属性,它将影响场景中使用共享 Material 的每个渲染器。否则,如果您更改 Renderer.material|s 属性,它会创建一个新的 Material 实例,它只会影响这个 Renderer.