Как изменить материал объекта unity

Пытаюсь изменить материал объекта через код if (MoveToPoint(point[stage])) { stage = stage == 1 ? 0 : 1; if (on_x) transform.localScale = new Vector3(-transform.

Пытаюсь изменить материал объекта через код

 if (MoveToPoint(point[stage]))
    {
        stage = stage == 1 ? 0 : 1;
        if (on_x)
            transform.localScale = new Vector3(-transform.localScale.x, 1, 0.032f);
        else
        {
            gameObject.GetComponent<MeshRenderer>().materials[0] = materials[stage];                                   
        }

    }

При этом материал объекта не изменяется, хотя условия выполняются. Пробовал отключать Animator и NavMeshAgent перед сменой материала ( в else), не помогло. В чём проблема? (Ниже представлен массив материалов и стандартный материал объекта)введите сюда описание изображениявведите сюда описание изображения

введите сюда описание изображения

задан 30 окт 2017 в 18:50

ZOOM SMASH's user avatar

ZOOM SMASHZOOM SMASH

1,3722 золотых знака16 серебряных знаков35 бронзовых знаков

Необходимо обращаться к свойству material компонента MeshRenderer

if (MoveToPoint(point[stage]))
{
    stage = stage == 1 ? 0 : 1;
    if (on_x)
        transform.localScale = new Vector3(-transform.localScale.x, 1, 0.032f);
    else
        gameObject.GetComponent<MeshRenderer>().material = materials[stage];                                   
}

Хорошо бы попробовать прямой вызов без условий где-то в Start()

gameObject.GetComponent<MeshRenderer>().material = materials[0];

ответ дан 30 окт 2017 в 19:32

Mikhail Efremov's user avatar

9

Materials возвращает копию массива, а не ссылку. Надо менять массив целиком. Получаешь массив, нужный индекс заменяешь на свой. И обратно присваиваешь. Профит.

ответ дан 31 окт 2017 в 1:37

Xumera_hZ's user avatar

Xumera_hZXumera_hZ

1,6122 золотых знака8 серебряных знаков13 бронзовых знаков

2

In this article, we will see how to change material and its properties at runtime in a unity application.

Let’s prepare a simple scene in unity for this article. I have just added a Sphere GameObject in the empty scene.

We can apply multiple materials on a GameObject in unity. You can see these materials in the Mesh Renderer component of the GameObject.

Change Material and its properties at runtime

To change the material at runtime, add below script to the Sphere GameObject.

using UnityEngine;

public class MaterialDemo : MonoBehaviour {

    Material SphereMaterial;

// Use this for initialization

void Start () {

        SphereMaterial = Resources.Load<Material>(«SphereMaterial»);

        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        // Get the current material applied on the GameObject

        Material oldMaterial = meshRenderer.material;

        Debug.Log(«Applied Material: « + oldMaterial.name);

        // Set the new material on the GameObject

        meshRenderer.material = SphereMaterial;

}

}

Change Material and its properties at runtime

We can also change the materials array from the MeshRenderer component. Actually, the GetComponent<MeshRenderer>().material property returns the first element of the materials array only.

Material[] materials = meshRenderer.materials;

// Get the current material applied on the GameObject

Material oldMaterial = materials[0];

// Set the new material on the GameObject

Material[] newMaterials = new Material[] { SphereMaterial};

meshRenderer.materials = newMaterials;

Change Material Properties at Runtime

Material properties is directly related to the shader attached to the material. You can see the shader attached to the material in the Inspector Window.

Change Material and its properties at runtime

If we create a new material then unity already attaches Standard shader to it. However, the shader attached to the material can be changed from the Inspector window and also at runtime.

The properties of the material can be changed by editing shader properties.  You can see the detailed list of Shader property in the Inspector.

Change Material and its properties at runtime

After clicking on EditShader in Inpector window, You can see the shader property name and its type (int, float, color etc.).

Change Material and its properties at runtime

Change Material and its properties at runtime

Change Texture of a Material

Change Main Texture

using UnityEngine;

public class MaterialDemo : MonoBehaviour {

    public Texture2D SampleTexture;

    private void Start()

    {

        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        GetComponent<MeshRenderer>().material.mainTexture = SampleTexture;

    }

}

Change Material and its properties at runtime

Material.mainTexture is the main diffuse texture. This can also be changed by “_MainTex” property name for the texture from unity’s builtin standard shader. Many shaders uses more than one texture. In that case, make sure to use right texture property name to change it at the runtime.

using UnityEngine;

public class MaterialDemo : MonoBehaviour {

    public Texture2D SampleTexture;

// Use this for initialization

void Start () {

        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        meshRenderer.material.SetTexture(«_MainTex», SampleTexture);

    }

}

You can use GetTexture property to get current main texture of the material.

meshRenderer.material.GetTexture(«_MainTex»)

Change Normal Map

Normal map can also be changed by SetTexture property of the material. “_BumpMap” is property name of the texture in the unity standard shader.

using UnityEngine;

public class MaterialDemo : MonoBehaviour {

    public Texture2D NormalMapTexture;

// Use this for initialization

void Start () {

        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        meshRenderer.material.SetTexture(«_BumpMap», NormalMapTexture);

    }

}

While setting the material texture using the Standard Shader, sometime you may need to use EnableKeyword to enable features of the shader before calling SetTexture property.

meshRenderer.material.EnableKeyword(«_NORMALMAP»);

Change Metallic Texture

// if not enabled

m_Renderer.material.EnableKeyword («_METALLICGLOSSMAP»);

// set texture

meshRenderer.material.SetTexture(«_MetallicGlossMap», SampleTexture);

Change Color of the Material

Change Main material’s color

Use Material.color property to get and set the main material color.

MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

// change color to blue

meshRenderer.material.color = Color.blue;

The same can be also changed by SetColor property. “_Color” is the property name of the color in the Standard shader.

// get color

meshRenderer.material.GetColor(«_Color»);

// set color

meshRenderer.material.SetColor(«_Color», Color.blue);

Change material color at real-time

Attach below code to the GameObject.

using UnityEngine;

public class MaterialDemo : MonoBehaviour {

    public Color newColor;

    private void Update()

    {

        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        meshRenderer.material.color = newColor;

    }

}

Result:

Enable Shader Property

Change Emission Values

As I mentioned earlier, some of the property should be enabled first; then only it can be changed. For example, to change the emission color, first we need to enable Emission property then it’s color can be changed.

using UnityEngine;

public class MaterialDemo : MonoBehaviour {

    private void Start()

    {

        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        meshRenderer.material.EnableKeyword(«_EMISSION»);

        meshRenderer.material.SetColor(«_EmissionColor», Color.blue);

    }

}

Change Float Value

Many shader property can be changed using Material.SetFloat property. Example – Metaalic Range, UV Set.

Change Metallic Range

meshRenderer.material.SetFloat(«_Metallic», 0.9f);

Change Shader at runtime

Use below code to change shader at the runtime. Make sure the shader name is correct otherwise it will throw null reference exception.

Shader specularShader = Shader.Find(«Standard (Specular setup)»);

MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

meshRenderer.material.shader = specularShader;

HDRP Materials

HDRP shaders has different properties name than standard unity shader. Below is the shader properties of “HDRP/Lit” shader.

So, while changing shader properties at runtime use always correct property name. For example, to change the color, use “_BaseColor” property.

MeshRenderer mr = TestGameObject.GetComponent<MeshRenderer>();

mr.material.SetColor(«_BaseColor», Color.green);

Also, while creating material make sure to pass correct shader name.

That’s it for this tutorial. I hope you get an idea about how to change material and its properties at runtime in unity application. Please post your comments for queries and feedback. Thanks for reading.

Share Button

The following two tabs change content below.

  • Bio
  • Latest Posts

Gyanendu Shekhar is a technology enthusiast. He loves to learn new technologies. His area of interest includes Microsoft technologies, Augmented reality, Virtual reality, unity3d and android development.

Как сменить материал объекта?

Как сменить материал объекта?

Зравствуйте! Может кто подскажет как можно сменить материал объекта программно?

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29

Re: Как сменить материал объекта?

Сообщение Neodrop 08 сен 2011, 12:18

Пройти базовые уроки и не морочить никому голову.

Добавить neodrop в Skype

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

Аватара пользователя
Neodrop
Админ
 
Сообщения: 8463
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Как сменить материал объекта?

Сообщение VitaliyCh 08 сен 2011, 12:34

Neodrop писал(а):Пройти базовые уроки и не морочить никому голову.

В каком уроке можно посмотреть тему по сабжу?

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29

Re: Как сменить материал объекта?

Сообщение VitaliyCh 08 сен 2011, 12:42

Neodrop писал(а):Пройти базовые уроки и не морочить никому голову.

В комментарии к разделу указано: Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.
Хотя в справке я не нашел как это сделать.

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29

Re: Как сменить материал объекта?

Сообщение Order 08 сен 2011, 12:44

Самое простое, сделай на объекте скрипт с публичной переменной материал, помести в инспекторе в эту переменную текущий материал. Сделай еще несколько таких же переменных, и помести туда желаемые материалы..
Далее в скрипте логикой меняй материал текущий на переменные материалы.

Добавить rusorder в Skype

,

_juc4you@mail.ru

;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.

Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Как сменить материал объекта?

Сообщение VitaliyCh 08 сен 2011, 13:04

Order писал(а):Самое простое, сделай на объекте скрипт с публичной переменной материал, помести в инспекторе в эту переменную текущий материал. Сделай еще несколько таких же переменных, и помести туда желаемые материалы..
Далее в скрипте логикой меняй материал текущий на переменные материалы.

В том и вопрос, как собственно поменять материал. Сделал по вашей рекомендации завел несколько паблик переменных, назначил на них разные материалы попробовал поменять таким образом:
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial;

никакого эффекта :(

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29

Re: Как сменить материал объекта?

Сообщение IDoNotExist 08 сен 2011, 13:23

VitaliyCh писал(а):В том и вопрос, как собственно поменять материал. Сделал по вашей рекомендации завел несколько паблик переменных, назначил на них разные материалы попробовал поменять таким образом:
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial;

никакого эффекта :(

Поздравляю, насмешили народ, вот почему вам в самом начале посоветовали пройти базовые уроки. Еще не плохо бы csharp подучить.

Вообще адекватно это делается както так:

Используется csharp

using UnityEngine;
using System.Collections;

public class ChangeMaterial : MonoBehaviour {

   
    public Material[] materialArray;

    public int pointer = 0;

    void Update(){
        if(pointer >= materialArray.Length()){
               Debug.Log(«Error!!! Watch for fucking pointer!!!»);
               pointer = 0;
        }else{

             gameObject.renderer.material = materialArray[pointer];

       }

    }

}

Надеюсь не надо объяснять что такое materialArray и как использовать pointer;

Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Как сменить материал объекта?

Сообщение Order 08 сен 2011, 13:36

material1 = material2;
думаю должно работать.

Еще лучше делать через массив как показали. если много материалов.

Добавить rusorder в Skype

,

_juc4you@mail.ru

;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.

Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Как сменить материал объекта?

Сообщение VitaliyCh 08 сен 2011, 13:53

IDoNotExist писал(а):

VitaliyCh писал(а):В том и вопрос, как собственно поменять материал. Сделал по вашей рекомендации завел несколько паблик переменных, назначил на них разные материалы попробовал поменять таким образом:
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial;

никакого эффекта :(

Поздравляю, насмешили народ, вот почему вам в самом начале посоветовали пройти базовые уроки. Еще не плохо бы csharp подучить.

Вообще адекватно это делается както так:

Используется csharp

using UnityEngine;
using System.Collections;

public class ChangeMaterial : MonoBehaviour {

   
    public Material[] materialArray;

    public int pointer = 0;

    void Update(){
        if(pointer >= materialArray.Length()){
               Debug.Log(«Error!!! Watch for fucking pointer!!!»);
               pointer = 0;
        }else{

             gameObject.renderer.material = materialArray[pointer];

       }

    }

}

Надеюсь не надо объяснять что такое materialArray и как использовать pointer;

Не понимаю, что смешного вы нашли в моем вопросе.
gameObject.renderer.material = materialArray[pointer]; — в этой строке вы меняете метериал
GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial; — я делал то же самое, только беру материал не из массива и из паблик переменной другого скрипта и данная конструкция не работала.
А вот: GameObject.renderer.sharedMaterial = newMaterial; сменила материал. Соответственно интересно чем отличается переменная sharedMaterial от material?

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29


Re: Как сменить материал объекта?

Сообщение VitaliyCh 08 сен 2011, 14:37

Guyver писал(а):http://www.google.ru/search?hl=ru&source=hp&q=Unity3d+reference+material&aq=f&aqi=g-L2&aql=&oq=

http://www.google.ru/search?q=Unity3d+r … =&aql=&oq=

это я ответ даю самым маленьким …. гугл итить его в душу …

ответы даны в 1х ссылках поиска

ответы как вы заметили из мануала юнити …

я знаю сикрет! .. у меня прем акаунт в гугле, и он мне даёт то, что нужно .. а не всякую ахинею как многим начинающим кодерам.

Большое спасибо, хелп я и без гугла смотрел.

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29

Re: Как сменить материал объекта?

Сообщение DbIMok 08 сен 2011, 15:29

VitaliyCh писал(а):GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial; — я делал то же самое

это не то же самое, это черте что :) gameObject это объект, на котором висит скрипт. GameObject, это класс. отличается регистр одной буквочки, а разница большая.

Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6321
Зарегистрирован: 31 июл 2009, 14:05

Re: Как сменить материал объекта?

Сообщение Neodrop 08 сен 2011, 16:32

Не, ну меня просто умиляет. Читать справку и делать уроки мы не хотим, а отвечающим ещё и похамить можно. Потрясающе. Только на русских форумах такое сплошь и рядом. :D (popcorn)

Добавить neodrop в Skype

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

Аватара пользователя
Neodrop
Админ
 
Сообщения: 8463
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Как сменить материал объекта?

Сообщение VitaliyCh 08 сен 2011, 16:50

DbIMok писал(а):

VitaliyCh писал(а):GameObject.renderer.material = GameObject.GetComponent<Script>().newMaterial; — я делал то же самое

это не то же самое, это черте что :) gameObject это объект, на котором висит скрипт. GameObject, это класс. отличается регистр одной буквочки, а разница большая.

Ну GameObject и Script в данном примере я написал как указатели на тип, там естественно стоят переменные данного типа. Вместо GameObject реально стоит настоящее имя объекта, а вместо «Script» настоящее имя скрипта.

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29

Re: Как сменить материал объекта?

Сообщение VitaliyCh 08 сен 2011, 16:55

Neodrop писал(а):Не, ну меня просто умиляет. Читать справку и делать уроки мы не хотим, а отвечающим ещё и похамить можно. Потрясающе. Только на русских форумах такое сплошь и рядом. :D (popcorn)

Уважаемый neodrop, в какой из моих фраз вы нашли хамство? Вроде раздел форума называется «почемучка» для самых маленьких и т.д, а Вы мне первый посоветовали «не морочить людям голову», я так понимаю что форум создан для общения.

VitaliyCh
UNец
 
Сообщения: 44
Зарегистрирован: 02 май 2011, 20:29


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 36



Понравилась статья? Поделить с друзьями:
  • Как изменить масштабирование экрана windows 10 nvidia
  • Как изменить масштабирование экрана amd
  • Как изменить масштабирование страницы
  • Как изменить масштабирование на мониторе
  • Как изменить масштабирование монитора