如何用随机图像制作对象?

时间:2019-07-03 23:07:39

标签: c# unity3d mesh game-development

我很难处理材料,为了使游戏更具动态性,我想在我的对象上涂一些皮肤。 我试图将网格渲染器上的材质大小设置为3并应用3种材质,但这看起来并不好,因为我必须关闭第三种材质,或者第二种和第三种需要保持活动状态。 我的第一种材料是颜色,它必须保持不变。

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

这是我的多维数据集对象,默认使用一种材质看起来很完美: enter image description here

这是我想添加第二种材料时要看的东西: enter image description here

这是当我添加第三种材料时,第二种材料仍处于活动状态,而我只需要在第二或第三种材料中处于活动状态,第二和第三种材料则不处于活动状态

enter image description here

因此,在我的情况下,我只希望在对象上激活两种材质 在我的示例中,第一个总是需要在我的照片中命名为“ New Material 2”

那我只需要第二个或第三个箱子就可以再使用一次,但是我遇到了问题,因为所有材料都是活跃的,所以我的物体看起来不像我希望它们看起来那样。 我想让随机脚本将其附加到每个对象上,从而在网格中制作10种材质,并始终激活第一个材质,并从1到10中选择随机数,并在启动时仅激活该材质。

也统一->当我添加第二种材料并且我需要它用于皮肤时,Unity抱怨,也许有更好或适当的方法来做同样的事情..但我只找到了这种解决方案..

所以我的问题是我如何给多维数据集蒙皮并向其中添加多个蒙皮,并随机选择它们,以使默认材质或颜色始终处于活动状态。

非常感谢您,我不知道如果没有您,我会怎么做!

1 个答案:

答案 0 :(得分:1)

您可以为此创建一个简单的组件

[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属性,它将创建一个仅影响此单个Renderer的新Material实例。