我很难处理材料,为了使游戏更具动态性,我想在我的对象上涂一些皮肤。 我试图将网格渲染器上的材质大小设置为3并应用3种材质,但这看起来并不好,因为我必须关闭第三种材质,或者第二种和第三种需要保持活动状态。 我的第一种材料是颜色,它必须保持不变。
我的意思很容易用照片说..
这是当我添加第三种材料时,第二种材料仍处于活动状态,而我只需要在第二或第三种材料中处于活动状态,第二和第三种材料则不处于活动状态
因此,在我的情况下,我只希望在对象上激活两种材质 在我的示例中,第一个总是需要在我的照片中命名为“ New Material 2”
那我只需要第二个或第三个箱子就可以再使用一次,但是我遇到了问题,因为所有材料都是活跃的,所以我的物体看起来不像我希望它们看起来那样。 我想让随机脚本将其附加到每个对象上,从而在网格中制作10种材质,并始终激活第一个材质,并从1到10中选择随机数,并在启动时仅激活该材质。
也统一->当我添加第二种材料并且我需要它用于皮肤时,Unity抱怨,也许有更好或适当的方法来做同样的事情..但我只找到了这种解决方案..
所以我的问题是我如何给多维数据集蒙皮并向其中添加多个蒙皮,并随机选择它们,以使默认材质或颜色始终处于活动状态。
非常感谢您,我不知道如果没有您,我会怎么做!
答案 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实例。