Возможно ли разработать приложение, которое предложит поля для загрузки собственных спрайтов пользователю? При загрузке спрайтов, они "привязываются" к какому-либо коллайдеру на сцене. Потом это все двигается (возможно с анимацией, если нет- тоже ок). Что стоит прочитать?
Есть парочка способов, но сразу оговорочка: работает для одиночных спрайтов. То есть 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;
}
}
Ссылка на классы и методы:
Продвижение своими сайтами как стратегия роста и независимости