Загрузка 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;
    }
}