Загрузка PNG-изображения в качестве текстуры во время выполнения в Unity3d
Я использую серию изображений PNG в качестве спрайтов для создания анимации на плоскости для приложения дополненной реальности в Unity. Изображения PNG загружаются как текстуры, а текстуры применяются к плоскости для создания последовательности анимации, которая отслеживается с целью дополненной реальности.
вот сценарий, который прикреплен к плоскости и управляет последовательностью анимации.
Файл PNGSequence.js
#pragma strict
var tecture : Texture[];
var changeInterval : float = 0.06;
var isRunning = false;
var isLooping = false;
function Start () {
var isRunning = true;
}
function Update () {
if( isRunning == true) {
Animation ();
}
}
function Animation () {
var index : int = Time.time/changeInterval;
index = index % tecture.Length;
renderer.material.mainTexture = tecture[index];
if ( index == tecture.Length-1){
if( isLooping == false){
isRunning = false;
}
renderer.material.mainTexture = tecture[0];
}
}
текстуры назначаются перетаскиванием PNG-файлов в редакторе, и все работает нормально, если я ограничиваю количество PNG. Однако по мере увеличения количества текстур я выхожу из ошибок памяти на Android.
Я хотел бы загрузить PNG-файлы в качестве текстур во время выполнения, чтобы ограничить объем памяти, но у меня возникли проблемы с работой кода.
Я пробовал LoadImage.
var imageTextAsset : TextAsset = Resources.Load("test.png");
var tex = new Texture2D (4, 4);
tex.LoadImage(imageTextAsset.bytes);
renderer.material.mainTexture = tex;
Я также попытался загрузить изображение непосредственно как текстуру (так как это, похоже, работает с редактор.)
renderer.material.mainTexture = Resources.LoadAssetAtPath"Assets/Images/test.png",Texture);
не повезло с любой. Есть предложения, как это сделать?
редактировать
я смог получить эту работу благодаря ссылке, предоставленной Xerosigma. У меня была проблема с путями (и я подозреваю, что с требованием текстуры при загрузке).
вне загрузки текстур PNG я также обнаружил, что Unity не выполняет управление памятью на текстурах. Для восстановления памяти текстуры необходимо вручную выгрузить после использования.
текстуры все размещены в папке" ресурсы". Папка resources может быть размещена в любом месте иерархии активов - я создал несколько отдельных папок для каждой из моих последовательностей PNG, чтобы организовать их, а затем добавил папку Resources внутри каждой для хранения фактических png.
текстуры назначаются через редактор, указав количество текстур (т. е. 100), базовое имя (например, "texture_") и нулевое заполнение.
PNGSequenceRunTime.js#pragma strict
var imageCount : int = 0;
var imageNameBase : String = "";
var imageNameZeroPadding : int = 0;
var changeInterval : float = 0.06;
var isRunning = false;
var isLooping = false;
private var texture : Texture = null;
function PlayRocket () {
isRunning = true;
}
function Start () {
var isRunning = false;
var fileName : String = imageNameBase + ZeroPad(0,imageNameZeroPadding);
texture = Resources.Load(fileName);
}
function Update () {
if( isRunning == true) {
PNGAnimation ();
}
}
function PNGAnimation () {
var index : int = Time.time/changeInterval;
index = index % imageCount;
var fileName : String = imageNameBase + ZeroPad(index,imageNameZeroPadding);
Resources.UnloadAsset(texture);
texture = Resources.Load(fileName);
renderer.material.mainTexture = texture;
if ( index == imageCount-1){
Debug.Log("End of Animation");
Debug.LogWarning("End of Animation");
if( isLooping == false){
isRunning = false;
}
fileName = imageNameBase + ZeroPad(0,imageNameZeroPadding);
Resources.UnloadAsset(texture);
texture = Resources.Load(fileName);
renderer.material.mainTexture = texture;
}
}
function ZeroPad(number : int, size : int) {
var numberString : String = number.ToString();
while (numberString.Length < size) numberString = "0" + numberString;
return numberString;
}
2 ответов
В C#:
// Load all textures into an array
Object[] textures = Resources.LoadAll("Textures", typeof(Texture2D));
// Load a single texture
Texture2D texture = Resources.Load("Texture") as Texture2D;
renderer.material.mainTexture = texture;
надеюсь, что это помогает. Вы должны быть в состоянии преобразовать его в JS нет проблем. Просто посмотрите документацию Unity.
http://docs.unity3d.com/Documentation/ScriptReference/Resources.html
Я достиг того же самого, разместив любую последовательность.png-изображения (с альфа-каналом) в папке Resources/Sequence1 внутри основной папки Assets. Выход представляет собой бесшовный фильм, играющий с прозрачностью точно в соответствии с альфа-каналами изображений.
этот код применяется к плоскости, которой назначен новый материал по умолчанию с прозрачным / рассеянным шейдером. Этот шейдер поддерживает PNG-изображения с Альфа-прозрачностью. Вы просто должны дать имя папка, содержащая изображения переменной framespath.
#pragma strict
var framespath: String = "";
var vidframes: Object[];
var count: int;
function Start () {
vidframes = Resources.LoadAll(framespath, Texture);
Debug.Log(vidframes.Length);
count = 0;
renderer.material.mainTexture = vidframes[count];
}
function Update () {
count++;
renderer.material.mainTexture = vidframes[count];
if (count == vidframes.Length-1)
{
count = 0;
}
}