Возможно ли разработать приложение, которое предложит поля для загрузки собственных спрайтов пользователю? При загрузке спрайтов, они "привязываются" к какому-либо коллайдеру на сцене. Потом это все двигается (возможно с анимацией, если нет- тоже ок). Что стоит прочитать?
Есть парочка способов, но сразу оговорочка: работает для одиночных спрайтов. То есть 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;
}
}
Ссылка на классы и методы:
Виртуальный выделенный сервер (VDS) становится отличным выбором
Будет ли работать данная технология при передачи данных из/в приложение C# windows и Ubuntu находящейся внутри Virtual Box
Есть тяжелый UI внутри окна, пока он рендерится зависает все окно, как можно рендерить UI асинхронно, при этом не блокируя весь UI окнаМои мысли...
Здравствуйте, друзья! Пожалуйста, кому не лень, подскажите как изменить видимость блока по уникальному идентификаторуЯ пытался решить разными...