Как сделать так, чтобы «tiling» и «offset» применялись только к одному мешу в Unity?
Выделил на скрине эти "tiling" и "offset". Если их изменить, то текстура будет для всех мешей с такими установленными цифрами, а мне нужно, чтобы для каждого объекта текстура была с первоначальными размерами... Вот. Надеюсь, смог объяснить
то текстура будет для всех мешей с такими установленными цифрами
Будет на всех объектах с данным материалом. Если вам нужно чтобы было индивидуально - клонируйте материал для каждого, но это дополнительный DrawCall, поэтому если у вас их тысячи - вы проиграете.
Но клонировать материал лучше ведь, чем во второй раз импортировать текстуру в проект?
И вообще, есть ли ещё способы, кроме как клонирования материала, сбросить эти значения для разных объектов? <- Прост, почему я это спрашиваю, а потому что я помню у меня был случай, когда я случайно сделал так, что когда накладывал текстуру на меш, то она применялась без тех значений, что были назначены на предыдущем объекте... Вооот.
Вариант первый - сдублировать материал в редакторе или рантайме и поменять значение, но это ударит по производительности.
Вариант второй - использовать MaterialPropertyBlock и Renderer.SetPropertyBlock, это самый производительный вариант, но надо писать скрипт и иметь ссылку на нужный рендерер.
Нужное вам свойство называется _MainTex_ST, это Vector4, менять его можно с помощью Material.SetVector либо MaterialPropertyBlock.SetVector.
Хотелось бы использовать второй вариант, но у меня мало навыков в программировании, да и вообще знаний в Unity. Может есть какая-то статья развёрнутая и на русском, объясняющая это дело?
И скажите, верно ли моё предположение, что второй способ как бы будет брать нужную часть уже растянутого материала? Т. е. например, я взял и растянул материал (текстуру) на меше в 3 раза, а затем мне понадобился такой же меш, только он в 3 раза меньше, чем первый и в коде делается так, что на второй меш будет накладываться этот самый растянутый материал, но поделённый в 3 раза? Вообще, даже если указанный вами второй вариант не такой, то всё равно, этот метод, что я описал, он был бы эффективным?
Just_Graf, Всё зависит от контекста, может быть вам вообще надо свой шейдер писать, без подробностей сложно что-то посоветовать. В общем случае лучше использовать MaterialPropertyBlock, это наименее трудозатратно. Само использование достаточно простое, вот вам пример скрипта, кидаете его на кубик и всё.
using UnityEngine;
public class MaterialPropertyBlockExample : MonoBehaviour
{
private void Awake()
{
var propertyBlock = new MaterialPropertyBlock();
propertyBlock.SetColor("_Color", Color.red);
var meshRenderer = gameObject.GetComponent<MeshRenderer>();
meshRenderer.SetPropertyBlock(propertyBlock);
}
}
Даниил Басманов, Извините, но я не понял, зачем этот скрипт? Да, я его кинул и на куб и на нужный мне меш, после запуска меши становятся красными и всё. Мне нужно(если это возможно), чтобы один материал можно было использовать для нескольких мешей разных размеров, т. е. чтобы на одном меше материал копировался в 2 раза(под копированием имею в виду, изменение "tiling"), а на другом меше, чтобы он копировался, ну... скажем, в 3 раза или какое угодно раз.
Just_Graf, Ну так замените строчку с propertyBlock.SetColor("_Color", Color.red); на нужную вам и всё, вы спросили как пользоваться MaterialPropertyBlock, я вам показал.