为什么未加载对象的颜色?

时间:2019-01-16 23:19:49

标签: c# unity3d colors save load

我设法保存3D对象的位置,旋转,比例,颜色和形状。但是,当我尝试加载对象时,颜色不会显示。但是其他一切都很好。我尝试通过同行的建议使用“ newObject.GetComponent()。material.color = colorOfObject”,但编译器不喜欢该语法。我在正确的轨道上吗?

注意:我只是在我的多维数据集选项中添加了代码,以提供较短的代码块,但是我确实有其他形状选项供用户选择。

        // Saving
        if (GUI.Button(new Rect(700, 330, 50, 30), "Save"))
        {
            // Saving the object's color and resetting it to white
            Color colorOfObject = rend.material.GetColor("_Color");
            PlayerPrefs.SetFloat("rValue", colorOfObject.r);
            PlayerPrefs.SetFloat("gValue", colorOfObject.g);
            PlayerPrefs.SetFloat("bValue", colorOfObject.b);
            rend.material.SetColor("_Color", Color.white);
        }

        // Loading
        if (GUI.Button(new Rect(770, 330, 50, 30), "Load"))
        {
            GameObject newObject;

            if (PlayerPrefs.GetString("Shape") == "cube")
        {
            newObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
            newObject.AddComponent<cubeControls>();

            newObject.transform.position = new Vector3(PlayerPrefs.GetFloat("xCoord"), PlayerPrefs.GetFloat("yCoord"), PlayerPrefs.GetFloat("zCoord"));
            newObject.transform.rotation = Quaternion.Euler(PlayerPrefs.GetFloat("xRot"), PlayerPrefs.GetFloat("yRot"), PlayerPrefs.GetFloat("zRot"));
            newObject.transform.localScale = new Vector3(PlayerPrefs.GetFloat("xScale"), PlayerPrefs.GetFloat("yScale"), PlayerPrefs.GetFloat("zScale"));

            Color defaultColor = Color.white;
            Color colorOfObject = new Color(PlayerPrefs.GetFloat("rValue", defaultColor.r), PlayerPrefs.GetFloat("gValue", defaultColor.g), PlayerPrefs.GetFloat("bValue", defaultColor.b));
            //rend.material.SetColor("_Color", colorOfObject);
            newObject.GetComponent().material.color = colorOfObject;
            Destroy(gameObject);
        }

2 个答案:

答案 0 :(得分:0)

如果对象的材质正在使用不具有“ _ Color” 属性的着色器,则它将被忽略。 Unity中包含的某些着色器使用“ _ TintColor” ,其他着色器不支持任何着色。

nb:您的方法将生成一个新的材质实例,从而为每个对象生成一个新的绘制调用。查看 MaterialPropertyBlocks 并使用启用了 GPU instancing 的着色器/材质设置。

答案 1 :(得分:0)

啊,我发现了其他一些例子,我意识到应该是这样:

newObject.GetComponent<Renderer>().material.color = colorOfObject;

但是感谢所有帮助过的人!