Unity. Загрузка спрайтов пользователем

834
26 декабря 2016, 22:22

Возможно ли разработать приложение, которое предложит поля для загрузки собственных спрайтов пользователю? При загрузке спрайтов, они "привязываются" к какому-либо коллайдеру на сцене. Потом это все двигается (возможно с анимацией, если нет- тоже ок). Что стоит прочитать?

Answer 1

Есть парочка способов, но сразу оговорочка: работает для одиночных спрайтов. То есть SpriteMode будет Single. Для анимации спрайтов нужно минимум их атлас или маппинг, который сделать в режиме реального времени довольно сложно ибо много нюансов как то: а как разрезать спрайты? Ведь в спрайтлисте могут располагаться не только по какой-либо ровной сетке, но и хаотично, как в атласе. Если разрезать спрайтлист, то где ставить pivot point у каждого спрайта? Как назначить конкретные спрайты из листа в SpriteRenderer? Каков должен быть масштаб? В общем — это кошмар и ужас. Поэтому лично я рассматривать сий вариант здесь не буду.

Для одиночных спрайтов:

  • Для устройства, на которое нацелено приложение/игра необходимо узнать/изучить методы/способы открытия диалогового окна, в котором можно выбрать картинку и считать оттуда путь до файла. Это обширная тема, поэтому она здесь не вместится.

    (!!!) В данном ответе я буду рассматривать банально Windows.

  • Зная путь файла можно сделать:

    а) Использовать класс WWW для загрузки контента. Также, допустим, у вас заранее есть на сцене объекты под спрайты и просто в них нужно воткнуть спрайт.

    public SpriteRenderer spriteRenderer;
    string directory = "file://d:/unityProjects/test/spriteTestLoad.jpg";
    void Start () {
         StartCoroutine(LoadImages());        
    }
    private IEnumerator LoadImages() {
            WWW www = new WWW(directory);
            // Ожидаем загрузку ресурса
            yield return www;
            var tex = www.texture;
            // Создаем спрайт из текстуры
            var mySprite  = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f);
            // В подготовленный spriteRenderer вставляем спрайт
            spriteRenderer.sprite = mySprite;        
    }
    

    Обратите внимание, что имя директории начинается с file://. Во всяком случае при загрузке файла в Windows с помощью WWW надо указывать именно так. Если загружать с интернета, то просто с http, например: http://images.earthcam.com/ec_metros/ourcams/fridays.jpg

    Здесь путь к файлу задан жестко, но вы держите в голове, что его надо будет просто заполнять из диалогового окна из пункта №1.

    б) Используя System.IO;. Пока также допуская, что надо спрайт воткнуть уже в имеющееся место.

    using UnityEngine;
    using System.Collections;
    using System.IO;
    public class LoadSpriteFromOut : MonoBehaviour {
            public SpriteRenderer spriteRenderer;
            string directory = "d:/unityProjects/test/spriteTestLoad.jpg";
            void Start () {
                 LoadSprite();       
            }
            private void LoadSprite() {         
                byte[] data = File.ReadAllBytes(directory);
                Texture2D texture = new Texture2D(64, 64, TextureFormat.ARGB32, false);
                texture.LoadImage(data);
                texture.name = Path.GetFileNameWithoutExtension(directory);
                var mySprite = Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height), new Vector2(0.5f, 0.5f), 100.0f);
                spriteRenderer.sprite = mySprite;
            }
    }
    

    в) (переделанный "а") И не надо забывать, что можно создавать объекты динамически, поэтому подготавливать их заранее в Юнити не обязательно (здесь используется загрузка из первого варианта):

    using UnityEngine;
    using System.Collections;
    using System.IO;
    public class LoadSpriteFromOut : MonoBehaviour {
        string directory = "file://d:/unityProjects/test/spriteTestLoad.jpg";
        void Start () {
            StartCoroutine(LoadImages());        
        }
        private IEnumerator LoadImages() {
            WWW www = new WWW(directory);
            yield return www;
            var texture = www.texture;
            var mySprite = Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height), new Vector2(0.5f, 0.5f), 100.0f);
            // Создаем объект       
            GameObject gameObjectSprite = new GameObject("myNewGameObjectSprite");
            // Прикрепляем компонент SpriteRenderer для спрайтов
            SpriteRenderer gameObjectSpriteSpriteRenderer = gameObjectSprite.AddComponent<SpriteRenderer>();
            // втыкаем загруженный спрайт
            gameObjectSpriteSpriteRenderer.sprite = mySprite;
        }
    }
    

Ссылка на классы и методы:

  • Sprite.Create
  • класс WWW
  • www texture
READ ALSO
количество загруженных документов c#

количество загруженных документов c#

В dataGridView загружаются документы Word

332
C# Файлы, отображаемые в память

C# Файлы, отображаемые в память

Будет ли работать данная технология при передачи данных из/в приложение C# windows и Ubuntu находящейся внутри Virtual Box

488
Рендер UI элементов асинхронно

Рендер UI элементов асинхронно

Есть тяжелый UI внутри окна, пока он рендерится зависает все окно, как можно рендерить UI асинхронно, при этом не блокируя весь UI окнаМои мысли...

350
Изменить видимость DIV по ID из функции PHP

Изменить видимость DIV по ID из функции PHP

Здравствуйте, друзья! Пожалуйста, кому не лень, подскажите как изменить видимость блока по уникальному идентификаторуЯ пытался решить разными...

486