C# Unity-材质数组返回到原始对象
因此,在Unity中,我目前正在使用一些选择/悬停功能,以便当鼠标悬停在对象上时,对象的颜色会发生变化,当鼠标不再悬停在对象上时,颜色会发生变化。所以问题是把材料放回去 我有一个对象有很多子/孙辈/子孙辈(?)。首先我通过foreach循环得到子对象。然后,我通过foreach循环,在一个名为“baseMaterials”的数组中获取这些材料。在更新功能中,我将对象材质更改为“悬停材质” 但我的问题是如何将“hoverMaterial”更改回“baseMaterials”C# Unity-材质数组返回到原始对象,c#,unity3d,C#,Unity3d,因此,在Unity中,我目前正在使用一些选择/悬停功能,以便当鼠标悬停在对象上时,对象的颜色会发生变化,当鼠标不再悬停在对象上时,颜色会发生变化。所以问题是把材料放回去 我有一个对象有很多子/孙辈/子孙辈(?)。首先我通过foreach循环得到子对象。然后,我通过foreach循环,在一个名为“baseMaterials”的数组中获取这些材料。在更新功能中,我将对象材质更改为“悬停材质” 但我的问题是如何将“hoverMaterial”更改回“baseMaterials” private voi
private void Awake()
{
// Get children objects with renderers, skip empty objects without renderers
List<GameObject> objectChildrenList = new List<GameObject>();
foreach (Transform child in transform)
{
if (child.GetComponent<Renderer>())
objectChildrenList.Add(child.gameObject);
foreach (Transform grandChild in child)
{
objectChildrenList.Add(grandChild.gameObject);
}
}
objectChildren = objectChildrenList.ToArray();
// get from children objects the color
if (objectName.transform.childCount > 0)
{
List<Material> objectColors = new List<Material>();
foreach (GameObject objects in objectChildren)
{
var objectMat = objects.GetComponent<Renderer>().materials;
foreach (Material m in objectMat)
{
objectColors.Add(m);
}
}
baseMaterials = objectColors.ToArray();
} else {
baseMaterial = objectName.GetComponent<Renderer>().material;
}
}
private void Update()
{
if (gameManager.selectedObject != this.gameObject)
{
if (mouseOver)
{
if (objectName.transform.childCount > 0)
{
foreach (Transform child in transform)
{
if (child.GetComponent<Renderer>())
child.gameObject.GetComponent<Renderer>().material = hoverMaterial;
foreach (Transform grandChild in child)
{
grandChild.gameObject.GetComponent<Renderer>().material = hoverMaterial;
}
}
} else {
objectName.GetComponent<Renderer>().material = hoverMaterial;
}
} else {
if (objectName.transform.childCount > 0) {
// Put baseMaterials back
} else {
objectName.GetComponent<Renderer>().material = baseMaterial;
}
}
}
}
private void Awake()
{
//获取具有渲染器的子对象,跳过没有渲染器的空对象
List objectChildrenList=新列表();
foreach(变换中的变换子对象)
{
if(child.GetComponent())
objectChildrenList.Add(child.gameObject);
foreach(在子对象中转换孙子对象)
{
objectChildrenList.Add(孙子.游戏对象);
}
}
objectChildrenList.ToArray();
//从子对象获取颜色
如果(objectName.transform.childCount>0)
{
List objectColors=new List();
foreach(objectChildren中的游戏对象对象)
{
var objectMat=objects.GetComponent().materials;
foreach(objectMat中的材料m)
{
objectColors.Add(m);
}
}
baseMaterials=objectColors.ToArray();
}否则{
baseMaterial=objectName.GetComponent().material;
}
}
私有void更新()
{
如果(gameManager.selectedObject!=此.gameObject)
{
如果(鼠标悬停)
{
如果(objectName.transform.childCount>0)
{
foreach(变换中的变换子对象)
{
if(child.GetComponent())
child.gameObject.GetComponent().material=hoverMaterial;
foreach(在子对象中转换孙子对象)
{
grant.gameObject.GetComponent().material=hoverMaterial;
}
}
}否则{
objectName.GetComponent().material=hoverMaterial;
}
}否则{
如果(objectName.transform.childCount>0){
//把基本材料放回去
}否则{
objectName.GetComponent().material=baseMaterial;
}
}
}
}
唯一的方法就是使用字典afaik。原因是,如果将材质保存为列表,当您停止悬停时,场景中游戏对象的数量可能会改变,并且保存的列表将不再与游戏对象的实际材质对齐。因此,您需要知道哪些材质属于哪个渲染器/游戏对象。字典会告诉你这一点
所以我会使用字典。当你开始悬停时,你会用你想要更改的渲染器迭代所有游戏对象,并将它们保存在字典中。然后你改变材料。当悬停停止时,您将遍历字典并将材质设置回原位
请注意,如果您只想更改颜色,那么使用是一个更好的主意。您可以使用,只需要知道着色器中的颜色属性的名称。它通常是\u Color
,您可以在调试模式下查看Inspector中的材质进行检查。使用MaterialPropertyBlock的优点是不会生成额外的绘图调用。这只是一种更好的方法。您可以使用子对象的哈希代码作为键将每个默认材料存储在字典中,然后从字典中设置它们。您还可以在每个子对象类中存储一个默认材质,只需调用SetToDefault()即可将材质返回其默认值。在您的Awake()
方法中,如果子对象具有渲染器,是否打算将其添加两次?