Редактировать Sprite кодом

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

Редактировать Sprite кодом

Сообщение Anti-Ded 13 янв 2021, 20:20

Обыскался уже, так и не нашёл, но на всякий случай пишу в почемучку.
Задача сделать мини-пазл-игру с переставлением частей картинок для получения полной картинки.
Изображение

Изначально надо привести базовую картинку к понятному разрешению с обрезанием лишнего при необходимости - тоже не знаю как.
Есть изначальная картинка и надо её нарезать на кусочки. Идеи было две и обе не знаю как выполнить.
1) кучка спрайтов берёт на себя картинку и отрезает лишнее, но тут есть подозрение, что пострадает базовая, но я всё равно не знаю как реализовать.
2) каждый спрайт показывает не целиком картинку, а только её фрагмент заданный по координатам.

И сразу ещё вопрос: как в качестве спрайта поставить картинку, полученную с интернета? Она в формате jpeg, но скачана то будет не в формате спрайта. Вот тут прошу ссылку.
Anti-Ded
UNец
 
Сообщения: 44
Зарегистрирован: 28 янв 2018, 23:24

Re: Редактировать Sprite кодом

Сообщение samana 13 янв 2021, 21:03

Самая первая ссылка из гугл - https://forum.unity.com/threads/generat ... -c.343735/
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Редактировать Sprite кодом

Сообщение alew 13 янв 2021, 23:14

Спрайт/картинка - это уже не интересно. Вот если видеоролик разрезать на части и из него составить пазл.
P.S. то что вы просите делается в 10 строчек. Учите мат часть и темы : загрузка текстур из сети/работа с текстурой
alew
UNIт
 
Сообщения: 76
Зарегистрирован: 23 ноя 2018, 19:59

Re: Редактировать Sprite кодом

Сообщение Anti-Ded 14 янв 2021, 01:05

samana писал(а):Самая первая ссылка из гугл - https://forum.unity.com/threads/generat ... -c.343735/

Спасибо, это ответ на второй вопрос. Уже разобрался, но по Вашей ссылке интересней решение.
alew писал(а):Спрайт/картинка - это уже не интересно. Вот если видеоролик разрезать на части и из него составить пазл.
P.S. то что вы просите делается в 10 строчек. Учите мат часть и темы : загрузка текстур из сети/работа с текстурой

Вопрос про загрузку картинок из инета уже решил, а вот функции какие использовать для нарезки изображений, всё никак не найду. Прошу показать хотя бы 6 из этих 10 строчек)
Anti-Ded
UNец
 
Сообщения: 44
Зарегистрирован: 28 янв 2018, 23:24

Re: Редактировать Sprite кодом

Сообщение samana 14 янв 2021, 01:42

Anti-Ded писал(а): а вот функции какие использовать для нарезки изображений, всё никак не найду.

Для работы с изображениями в Unity есть класс Texture2D
https://docs.unity3d.com/ScriptReference/Texture2D.html
У этого класса много свойств и методов. В том числе методы GetPixels и SetPixels. Вы можете манипулировать любой областью пикселей на изображении, или даже одним пикселем. Например из картинки 100х100 взяли область 20х20 и скопировали эти пиксели в новую картинку 20х20 (вот и пазл получился).
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Редактировать Sprite кодом

Сообщение Anti-Ded 14 янв 2021, 14:04

samana писал(а):
Anti-Ded писал(а): а вот функции какие использовать для нарезки изображений, всё никак не найду.

Для работы с изображениями в Unity есть класс Texture2D
https://docs.unity3d.com/ScriptReference/Texture2D.html
У этого класса много свойств и методов. В том числе методы GetPixels и SetPixels. Вы можете манипулировать любой областью пикселей на изображении, или даже одним пикселем. Например из картинки 100х100 взяли область 20х20 и скопировали эти пиксели в новую картинку 20х20 (вот и пазл получился).


Огромное спасибо)
Anti-Ded
UNец
 
Сообщения: 44
Зарегистрирован: 28 янв 2018, 23:24

Re: Редактировать Sprite кодом

Сообщение Anti-Ded 15 янв 2021, 21:08

Вот вроде разобрался, но не фурычит что-то.

Вот такой код получился (10 строк, как и обещали :) )
Изображение

Но на выходе имею только серые (да, именно серые) картинки
Изображение

Подскажите, пожалуйста, что не так.
Anti-Ded
UNец
 
Сообщения: 44
Зарегистрирован: 28 янв 2018, 23:24

Re: Редактировать Sprite кодом

Сообщение samana 15 янв 2021, 21:55

После манипуляций с текстурой, нужно применить все изменения в ней. Для этого есть метод Apply().
https://docs.unity3d.com/ScriptReferenc ... Apply.html

Не нужно показывать код в виде картинки, ведь это очень неудобно. Просто скопируйте код в сообщение, и поместите его в теги (кнопка CS в редакторе).
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Редактировать Sprite кодом

Сообщение Anti-Ded 15 янв 2021, 22:24

samana писал(а):После манипуляций с текстурой, нужно применить все изменения в ней. Для этого есть метод Apply().
https://docs.unity3d.com/ScriptReferenc ... Apply.html

Огромное спасибо)

Не нужно показывать код в виде картинки, ведь это очень неудобно. Просто скопируйте код в сообщение, и поместите его в теги (кнопка CS в редакторе).

Хорошо, спасибо.
Anti-Ded
UNец
 
Сообщения: 44
Зарегистрирован: 28 янв 2018, 23:24

Re: Редактировать Sprite кодом

Сообщение samana 16 янв 2021, 00:30

Немного о нюансах.
Методы getPixels и setPixels берут область пикселей начиная с нижнего левого угла картинки. То-есть система координат у текстуры это
x:0 y:0 - это левый нижний угол текстуры
x:ширинаТекстуры y:высотаТекстуры - это правый верхний угол текстуры

Например следующий код разделяет текстуру на 6 частей (три в ширину, две в высоту), начиная с нижнего левого угла текстуры.

Синтаксис:
Используется csharp
using System.Collections.Generic;
using UnityEngine;

public class PuzzleTest : MonoBehaviour
{
    public Texture2D mainTexture;  // перетащите сюда главную текстуру
    public int horizontalCount = 3; // кол-во частей в ширину
    public int verticalCount = 2; // кол-во частей в высоту

    public List<Texture2D> texturesList;
    void Start()
    {
        splitTexture();
    }

    private void splitTexture()
    {
        texturesList = new List<Texture2D>();

        int w = mainTexture.width / horizontalCount;
        int h = mainTexture.height / verticalCount;

        for (int y = 0; y < verticalCount; y++)
        {
            for (int x = 0; x < horizontalCount; x++)
            {
                Texture2D texture = new Texture2D(w, h);
                texture.SetPixels(mainTexture.GetPixels(x * w, y * h, w, h));
                texture.Apply();
                texturesList.Add(texture);
            }
        }
    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Редактировать Sprite кодом

Сообщение Saltant 16 янв 2021, 01:03

Название метода с большой буквы, тыж не на java :)
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Редактировать Sprite кодом

Сообщение samana 16 янв 2021, 01:32

Я так и не смог привыкнуть к заглавным буквам ни в свойствах ни в методах, как-то визуально не комфортно мне с ними. :-??
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Редактировать Sprite кодом

Сообщение Saltant 16 янв 2021, 02:44

samana писал(а):Я так и не смог привыкнуть к заглавным буквам ни в свойствах ни в методах, как-то визуально не комфортно мне с ними. :-??

У тебя нотисы в студии отключены шоле? Обычно он будет ругаться на это дело.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Редактировать Sprite кодом

Сообщение samana 16 янв 2021, 09:38

Похоже что отключены, потому что никто не ругается. Я и не настраивал там ничего, но нужно будет глянуть и включить. Кто знает, может студия все таки приучит меня к принятым стандартам.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Редактировать Sprite кодом

Сообщение Anti-Ded 16 янв 2021, 12:47

Синтаксис:
Используется csharp
public Color[] Colors;
public Texture2D CurrentPic;

FinalImage.sprite = Sprite.Create(NewTexture, new Rect(0, 0, NewTexture.width, NewTexture.height), new Vector2(0, 0), 100);
        FinalImage.gameObject.SetActive(true);
        FinalImage.color = new Color(1, 1, 1, 0);

        Colors = NewTexture.GetPixels();

        int width = 1024 / PicSize;

for (int i = 0; i < PicSize; i++)
            for (int j = 0; j < PicSize; j++)
            {
                Texture2D Tex = new Texture2D(width, width);
                Colors = NewTexture.GetPixels(i* width, j* width, width, width);

                Tex.SetPixels(Colors);
                Tex.Apply();
                CurrentMatrix.Add(Tex);
            }


У меня вот так получилось. Всё работает. Правда создание спрайтов для мозаики пришлось переворачивать и чётко следить за направлением взгляда спрайтов.

Samana, огромное тебе спасибо)
Anti-Ded
UNец
 
Сообщения: 44
Зарегистрирован: 28 янв 2018, 23:24

След.

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

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

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