Мои действия:
1. Замоделил пазл.
2. Создал для него развертку.
3. Импортировал в юнити.
4. положил на объект два материала (grid - общий для всех, pieceMat - тоже общий, но согласно развертке задаваемой программно, назовем просто картинкой)
5. написал такой скрипт (идея в том чтобы взять все UV и трансформировать их по координатам и скэйлу)
Синтаксис:
Используется csharp
public class UVTile : MonoBehaviour {
public bool remap = false;
public int cols, rows; //количество и строк в текстуре
public Vector2 uvTilePos;//позиция текстурного тайла
float textureSizeX, textureSizeY; //размеры текстуры
Texture texture;// сама текстура
Mesh originMesh;//оригинальный меш
Mesh tmp_mesh;//инстанс оригинального меша
bool prepared = false;
void Start ()
{
if (!prepared)
prepare();
}
void Update ()
{
if (remap)
{
remap = false;
Remap();
}
}
public void prepare()
{
texture = GetComponent<MeshRenderer>().materials[0].GetTexture("_MainTex");
originMesh = GetComponent<MeshFilter>().mesh;
prepared = true;
}
public void Remap()
{
tmp_mesh = Mesh.Instantiate(originMesh); //создали новый меш из оригинального
List<Vector2> UVs = new List<Vector2>();
tmp_mesh.GetUVs(0, UVs); //забрали UV координаты
//посчитали ширину и высоту тайла в текстурных координатах (0,1)
float tileWidthInTextureCoordinates = (float)texture.width / cols / texture.width;
float tileHeightInTextureCoordinates = (float)texture.height / rows / texture.height;
List<Vector2> newUVs = new List<Vector2>();
//задали новые координаты с учетом столбов, строк и позиции тайла
foreach (Vector2 uv in UVs)
newUVs.Add(new Vector2(uv.x * tileWidthInTextureCoordinates + uvTilePos.x * tileWidthInTextureCoordinates, uv.y * tileHeightInTextureCoordinates + uvTilePos.y * tileHeightInTextureCoordinates));
tmp_mesh.SetUVs((0, newUVs);
GetComponent<MeshFilter>().sharedMesh = tmp_mesh;//profit
}
}
public bool remap = false;
public int cols, rows; //количество и строк в текстуре
public Vector2 uvTilePos;//позиция текстурного тайла
float textureSizeX, textureSizeY; //размеры текстуры
Texture texture;// сама текстура
Mesh originMesh;//оригинальный меш
Mesh tmp_mesh;//инстанс оригинального меша
bool prepared = false;
void Start ()
{
if (!prepared)
prepare();
}
void Update ()
{
if (remap)
{
remap = false;
Remap();
}
}
public void prepare()
{
texture = GetComponent<MeshRenderer>().materials[0].GetTexture("_MainTex");
originMesh = GetComponent<MeshFilter>().mesh;
prepared = true;
}
public void Remap()
{
tmp_mesh = Mesh.Instantiate(originMesh); //создали новый меш из оригинального
List<Vector2> UVs = new List<Vector2>();
tmp_mesh.GetUVs(0, UVs); //забрали UV координаты
//посчитали ширину и высоту тайла в текстурных координатах (0,1)
float tileWidthInTextureCoordinates = (float)texture.width / cols / texture.width;
float tileHeightInTextureCoordinates = (float)texture.height / rows / texture.height;
List<Vector2> newUVs = new List<Vector2>();
//задали новые координаты с учетом столбов, строк и позиции тайла
foreach (Vector2 uv in UVs)
newUVs.Add(new Vector2(uv.x * tileWidthInTextureCoordinates + uvTilePos.x * tileWidthInTextureCoordinates, uv.y * tileHeightInTextureCoordinates + uvTilePos.y * tileHeightInTextureCoordinates));
tmp_mesh.SetUVs((0, newUVs);
GetComponent<MeshFilter>().sharedMesh = tmp_mesh;//profit
}
}
и применил к объекту.
Результат (на некоторых тайлах видно по краям красный цвет которого там быть не должно, снизу такие пазлы тоже красные):
Вот у меня собственно два вопроса: 1. почему общий материал (grid) натягивается на весь объект игнорируя равертку? 2. Почему текстура-картинка (pieceMat) на некоторых пазлах
расползается?
PS Если создаю 3*3 то все идеально, если больше - верхняя текстурка расползается на некоторых пазлах.