Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity-材质数组返回到原始对象_C#_Unity3d - Fatal编程技术网

C# Unity-材质数组返回到原始对象

C# Unity-材质数组返回到原始对象,c#,unity3d,C#,Unity3d,因此,在Unity中,我目前正在使用一些选择/悬停功能,以便当鼠标悬停在对象上时,对象的颜色会发生变化,当鼠标不再悬停在对象上时,颜色会发生变化。所以问题是把材料放回去 我有一个对象有很多子/孙辈/子孙辈(?)。首先我通过foreach循环得到子对象。然后,我通过foreach循环,在一个名为“baseMaterials”的数组中获取这些材料。在更新功能中,我将对象材质更改为“悬停材质” 但我的问题是如何将“hoverMaterial”更改回“baseMaterials” private voi

因此,在Unity中,我目前正在使用一些选择/悬停功能,以便当鼠标悬停在对象上时,对象的颜色会发生变化,当鼠标不再悬停在对象上时,颜色会发生变化。所以问题是把材料放回去

我有一个对象有很多子/孙辈/子孙辈(?)。首先我通过foreach循环得到子对象。然后,我通过foreach循环,在一个名为“baseMaterials”的数组中获取这些材料。在更新功能中,我将对象材质更改为“悬停材质”

但我的问题是如何将“hoverMaterial”更改回“baseMaterials”

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()
方法中,如果
子对象具有
渲染器,是否打算将其添加两次?