Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

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

#c_sharp #unity3d


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


Ответы

Ответ 1



Есть парочка способов, но сразу оговорка: работает для одиночных спрайтов. То есть SpriteMode будет Single. Для анимации спрайтов нужно минимум их атлас или маппинг (mapping), который сделать в режиме реального времени довольно сложно ибо много нюансов как то: а как разрезать спрайты? Ведь в спрайтлисте могут располагаться не только по какой-либо ровной сетке, но и хаотично, как в атласе. Если разрезать спрайтлист, то где ставить 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; } } в) (переделанный "а") И не надо забывать, что можно создавать объекты динамически, поэтому подготавливать их заранее в Unity не обязательно (здесь используется загрузка из первого варианта): 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(); // втыкаем загруженный спрайт gameObjectSpriteSpriteRenderer.sprite = mySprite; } } Ссылка на классы и методы: Sprite.Create класс WWW www texture

Комментариев нет:

Отправить комментарий