Chargement d'un PNG image comme texture à l'exécution dans Unity3d
Je suis en utilisant une série d'images PNG sprites pour créer des animations sur un avion pour une réalité augmentée de l'application dans l'Unité. Les images PNG sont chargés comme des textures, et les textures sont appliquées à un plan pour créer une séquence d'animation qui retrace avec une réalité augmentée cible.
Voici le script qui est attaché à l'avion et les contrôles de 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];
}
}
Textures sont affectés par glisser-déposer de fichiers PNG dans l'éditeur et tout fonctionne bien si je limite le PNG comte. Comme ma texture compte augmente, cependant, j'obtiens des erreurs de mémoire insuffisante sur Android.
Je voudrais charger les fichiers PNG en tant que textures au moment de l'exécution de limiter le nombre de mémoire, mais je vais avoir du mal à obtenir le code de travail.
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 aussi essayé de chargement de l'image directement à la texture (puisque cela semble fonctionner avec l'éditeur).
renderer.material.mainTexture = Resources.LoadAssetAtPath"Assets/Images/test.png",Texture);
Pas de chance avec les deux. Toutes les suggestions sur la façon d'accomplir ceci?
ÉDITÉ
J'ai été en mesure d'obtenir ce travail grâce au lien fourni par Xerosigma. J'ai eu un problème avec les chemins (et je soupçonne avec la Texture exigence de la charge).
À l'extérieur de chargement de la PNG textures, j'ai aussi découvert que l'Unité ne fait pas de la gestion de la mémoire sur les textures. Pour récupérer de la mémoire, les textures doivent être déchargés manuellement après l'utilisation.
Les Textures sont tous placés dans un "Ressources" du dossier. Le dossier de ressources peut être placé n'importe où dans l'Actif de la hiérarchie - j'ai créé plusieurs dossiers individuels de chacun de mes séquences PNG pour les organiser, puis ajouté un dossier de Ressources à l'intérieur de chacun de tenir le réel Png.
Les Textures sont affectés par l'entremise de l'éditeur en spécifiant une texture count (ie. 100), un nom de base ("texture_", par exemple), et zéro de remplissage.
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;
}
OriginalL'auteur Jason George | 2013-04-04
Vous devez vous connecter pour publier un commentaire.
En C#:
Espère que cela aide. Vous devriez être en mesure de le convertir en JS pas de problème. Il suffit de regarder l'Unité de la documentation.
http://docs.unity3d.com/Documentation/ScriptReference/Resources.html
Sons grand. Heureux, il a aidé.
cela nécessite que le fichier soit dans
Resources
dossier. Je suis venu de recherche de google en essayant de charger une texture à partir de n'importe où je veux.OriginalL'auteur Nestor Ledon
J'ai réalisé la même chose en plaçant toute séquence de .des images png (avec canal alpha) dans un dossier Ressources/Sequence1 à l'intérieur du dossier des Actifs. La sortie est transparente, le film jouant avec la transparence exactement selon les canaux alpha des images.
Ce code est appliqué à un plan qui est attribué par défaut du Nouveau Matériel Transparent/shader Diffus. Ce shader prend en charge les images PNG avec alpha comme la transparence. Il vous suffit de donner le nom du dossier qui contient les images à la variable framespath.
OriginalL'auteur user3004240