Unity - спрайты занимают больше памяти, чем текстуры? Вызывает черный экран после запуска на устройстве? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть серия спрайтов, которые я использую для анимации пользовательского интерфейса, который должен быть на холсте - около 500, потому что я экспортировал последовательность png из последействия и пролистал их с изображением холста с таким:

public class VideoPlayerRawImage : MonoBehaviour
{
    public Sprite[] frames;
    public int framesPerSecond = 60;
    public int index;
    public bool paused;
    Image image;

    float t;
    public bool pause;
    public bool done;

    private void Start()
    {
        image = GetComponent<Image>();
    }

    void Update()
    {
        if (!pause)
        {
            t += Time.deltaTime;

            if (frames.Length > 0 && !done)
            {
                index = (int)(t * framesPerSecond) % frames.Length;
                image.sprite = frames[index];
            }
        }

        //repeat
        if(index >= frames.Length-1)
        {
            done = true;
        }
    }
}

Ive сжатые спрайты, как это:

enter image description here

И я делал это раньше с текстурами. Проблема в том, что после добавления этих спрайтов у меня появляется черный экран после запуска приложения, до загрузки сцены и после логотипа единства. Что я могу сделать, чтобы это исправить? Мне нужно использовать спрайты, потому что мне это нужно на холсте.

Unity: enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Черный экран

. При запуске приложения Unity потребуется некоторое время для загрузки сцены, которая зависит от веса сцены.

Изменение фонацвет камеры на экране загрузки видео первого цвета кадра, выбрав цвет из видео с помощью палитры цветов в КАМЕРЕ -> ФОН.Если вы сделаете это вместо черного цвета, появится первый цвет видеокадра, поэтому он будет плавным, и пользователь не заметит.

мы сделали то же самое в этой игре, вы можете проверить это: Ссылка на игру

0 голосов
/ 19 марта 2019

Я предполагаю, что вы не можете просто использовать вместо этого компонент VideoPlayer и вместо этого загружать видео, а не файл PNG для каждого кадра по той же причине, которую я когда-то делал: Альфа-канал.

В любом случае, импортировать каждый кадр в виде файла PNG и переключать спрайт в каждом кадре очень неэффективно!

Так что, если речь не идет об альфа-канале, просто используйте VideoPlayer свидеоклип и перейдите к шаг 3.2. здесь, используя видеофайл вместо одного кадра / файла WebM.


Если проблема заключается в альфа-канале:

Однажды я нашел решение для получения GIF-подобной текстуры, но для сохранения прозрачности

требуется Adobe MediaEncoder (можно бесплатно протестировать в течение 30 дней).

1.Где-то получить единичные изображения в формате PNG

Я отрисовал мое с помощью Blender3D, но вы, конечно, можете использовать любые кадры PNG с (или без) прозрачностью.

У вас, похоже, уже есть такие.Однако файлы рамок должны иметь последовательные нумерованные имена, например, frame_001.png, frame_002.png и т. Д.


2.Кодируйте файлы PNG в WebM видеоформат

  1. Установите кодек WebM для Adobe Premiere и MediaEncoder

  2. Откройте Adobe MediaEncoder

  3. Перейдите на File -> AddSource...

    enter image description here

  4. Выберите первый кадр вашей анимации и убедитесь, что PNG file sequence включен.

    enter image description here

  5. В представлении Queue щелкните текущий целевой кодек

  6. В качестве формата выберите WebM (доступно толькопосле установки плагина в шаге 1.)

    enter image description here

  7. в разделе Image Settings вы можете настроить параметрыили просто нажмите Match Source

    enter image description here

  8. В кодеке Settings перейдите на VP8, поскольку Unity неподдержка VP9 (пока?)

    enter image description here

  9. Возможно, вы захотите внести дополнительные изменения, но неСамое важное: Включить Include Alpha Channel

    enter image description here

  10. Когда вы думаете, что все готово, нажмите Ok в нижней частиокно

    enter image description here

  11. В представлении Queue нажмите на символ воспроизведения, чтобы начать кодирование

    enter image description here

  12. после завершения и закрытия Adobe MediaEncoder вы найдете результат в той же папке, в которой находятся ваши исходные кадры, в

    enter image description here


3.Наконец, используйте WebM «GIF» с прозрачностью в Unity

  1. Импортируйте два файла результатов в ваш проект Unity.

  2. В Assetsdo щелкните правой кнопкой мыши -> Создать -> RenderTexture

    enter image description here

    Имяэто и изменить размер может быть (остальное должно быть в порядке.)

  3. Где-то в вашей сцене на диспетчере GameObject есть компонент VideoPlayer.Вам нужен только один (для каждой текстуры GIF).Здесь используйте импортированный файл WebM как VideoClip и созданный RenderTexture из шага 2. как Target Texture.

    enter image description here

    Включить Loopи (если хотите) Play On Awake (в противном случае вам придется вызывать Play вручную.)

  4. Вместо компонента Image используйте компонент RawImage и как Texture ссылка на созданное RenderTexture из шага 2.

    enter image description here


Теперь у вас есть прозрачная GIF-анимация с использованием вашегооригинальные рамки PNG в Unity

enter image description here


Только для разницы в размере файла:

  • Отдельные файлы PNG (Я использовал 24) для меня около 4,5 МБ в общей сложности
  • файл WebM имеет около 0,5 МБ.Так что это делает его более или менее в 10 раз меньше.

Представьте себе, сколько места вы могли бы сэкономить, если бы использовали это вместо 500 файлов PNG!

...