Почему цвет объекта не загружается? - PullRequest
0 голосов
/ 17 января 2019

Мне удалось сохранить положение, вращение, масштаб, цвет и форму трехмерного объекта. Однако, когда я пытаюсь загрузить объект, цвет не отображается; но все остальное работает нормально. Я попытался использовать "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 голосов
/ 17 января 2019

Ах, я нашел несколько других примеров и понял, что это должно быть:

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

Но спасибо всем, кто помог!

0 голосов
/ 17 января 2019

Если материал объекта использует шейдер, у которого нет свойства "_ Color" , то он будет игнорироваться. Некоторые включенные шейдеры в Unity используют "_ TintColor" , другие просто не поддерживают раскраску.

nb: ваш метод будет генерировать новый экземпляр материала и, следовательно, новый вызов для каждого объекта. Взгляните на MaterialPropertyBlocks и используйте Установка GPU с включенной настройкой шейдера / материала.

...