web-dev-qa-db-fra.com

Chargement d'une image PNG en tant que texture lors de l'exécution dans Unity3d

J'utilise une série d'images PNG comme sprites pour créer des animations sur un plan pour une application de réalité augmentée dans Unity. Les images PNG sont chargées sous forme de textures et les textures sont appliquées à un plan pour créer une séquence d'animation qui suit avec une cible de réalité augmentée.

Voici le script attaché au plan et contrôle la séquence d'animation.

Fichier 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];
    }
}

Les textures sont attribuées par glisser-déposer des fichiers PNG dans l'éditeur et tout fonctionne bien si je limite le nombre de PNG. Cependant, à mesure que mon nombre de textures augmente, je perds des erreurs de mémoire sur Android.

Je voudrais charger les fichiers PNG en tant que textures au moment de l'exécution pour limiter la mémoire numérique, mais j'ai du mal à faire fonctionner le code.

J'ai essayé LoadImage.

var imageTextAsset : TextAsset = Resources.Load("test.png");
var tex = new Texture2D (4, 4);
tex.LoadImage(imageTextAsset.bytes);
renderer.material.mainTexture = tex;

J'ai également essayé de charger l'image directement en tant que texture (car cela semble fonctionner avec l'éditeur).

renderer.material.mainTexture = Resources.LoadAssetAtPath"Assets/Images/test.png",Texture);

Pas de chance non plus. Des suggestions sur la façon d'accomplir cela?

MODIFIÉ

J'ai pu faire fonctionner cela grâce au lien fourni par Xerosigma. J'ai eu un problème avec les chemins (et je soupçonne avec l'exigence de texture à la charge).

En dehors du chargement des textures PNG, j'ai également découvert qu'Unity ne gère pas la mémoire sur les textures. Pour récupérer la mémoire, les textures doivent être déchargées manuellement après utilisation.

Les textures sont toutes placées dans un dossier "Ressources". Le dossier des ressources peut être placé n'importe où dans la hiérarchie des actifs - J'ai créé plusieurs dossiers individuels pour chacune de mes séquences PNG pour les organiser, puis ajouté un dossier Ressources dans chacune pour contenir les fichiers PNG réels.

Les textures sont attribuées via l'éditeur en spécifiant un nombre de textures (c'est-à-dire 100), un nom de base ("texture_" par exemple) et un remplissage nul.

Fichier 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;
}
9
Jason George

En 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;

J'espère que ça aide. Vous devriez pouvoir le convertir en JS sans problème. Regardez simplement la documentation Unity.

http://docs.unity3d.com/Documentation/ScriptReference/Resources.html

12
Nestor Ledon

J'ai réalisé la même chose en plaçant n'importe quelle séquence d'images .png (avec un canal alpha) dans un dossier Resources/Sequence1 à l'intérieur du dossier Assets principal. La sortie est un film sans couture jouant avec transparence exactement selon les canaux alpha des images.

Ce code est appliqué à un plan auquel est affecté un nouveau matériau par défaut avec un ombrage transparent/diffus. Ce shader prend en charge les images PNG avec alpha comme transparence. Il vous suffit de donner le nom du dossier qui contient les images au chemin de trame variable.

#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;
    }
}
2
user3004240