2017-05-06 1 views
0

Ich habe gerade eine PNG-Animationssequenz, die ausgelöst wird, wenn das Objekt gefunden wird, aber auf der ersten Schleife dauert es viel zu laden, ist es eine Möglichkeit, es schneller zu laden?Spiele Sprite Animationssequenz langsam auf dem ersten Schleife

Die Animation von 500 pngs in einem Sprite die Gesamtgröße aller ist etwa 180 MB geladen bestehen, und dem Code, den ich verwende ist sehr einfach:

DefaultTrackableEventHandler.cs:

public SpriteRenderer sr; 
public int i = 0; 

void Update() 
{ 
    i++; 
    i = (i > 100) ? 0 : i; 
    sr.sprite = Resources.Load<Sprite> ("fractal/03_" + i.ToString ("D5")); 
} 

btw ich bin eine komplette Noob auf Einheit Programmierung also bitte verzeiht mir, wenn ich offensichtlich etwas fehlt bin, dank

Antwort

1

Das Problem ist, dass Sie Sprite in jedem Frame geladen werden. Es wird die Leistung beeinflussen. Laden Sie einmal in die Start Funktion und speichern Sie das Ergebnis in einem Array. Sie können dieses Array dann in der Update-Funktion verwenden.

const int ANIM_SIZE = 500; 
Sprite[] animSprites; 
public SpriteRenderer sr; 
public int i = 0; 

void Start() 
{ 
    for (int i = 0; i < ANIM_SIZE; i++) 
    { 
     animSprites[i] = Resources.Load<Sprite>("fractal/03_" + i.ToString("D5")) as Sprite; 
    } 
} 

void Update() 
{ 
    i++; 
    i = (i > 100) ? 0 : i; 
    sr.sprite = animSprites[i]; 
} 

Da Sie viele Dateien laden, sollten Sie Resources.LoadAsync stattdessen verwenden. Dadurch können Sie die Daten über den Frame laden und ein mögliches Einfrieren beim Laden der Sprites verhindern.

const int ANIM_SIZE = 500; 
Sprite[] animSprites; 
public SpriteRenderer sr; 
public int i = 0; 
bool isDoneLoading = false; 

IEnumerable Start() 
{ 
    for (int i = 0; i < ANIM_SIZE; i++) 
    { 
     ResourceRequest rs = Resources.LoadAsync<Sprite>("fractal/03_" + i.ToString("D5")); 
     yield return rs; 
     animSprites[i] = rs.asset as Sprite; 
    } 

    isDoneLoading = true; 
} 

void Update() 
{ 
    if (isDoneLoading) 
    { 
     i++; 
     i = (i > 100) ? 0 : i; 
     sr.sprite = animSprites[i]; 
    } 
} 

schließlich jeder dieser Lösungen nicht oben erwähnt verwenden. Sie sind nur da, weil du darum gebeten hast. Verwenden Sie dazu das Animations-/Animator-Werkzeug des Unity. Sie können mehr darüber erfahren here.

+0

Vielen Dank für Ihre Informationen .. es gibt eine Tonne von Dingen, die ich wusste nicht, ich das Animationswerkzeug lernen, aber in der Zwischenzeit im ersten Beispiel zu tun, erhalte ich diesen Fehler: Aktiva/Sprite.cs (22, 27): Fehler CS0029: kann nicht implizit konvertiert Typ 'Sprite‚auf 'UnityEngine.Sprite‘, weißt du, was kann ich falsch machen? – Chico3001

+0

Laufzeit oder Fehler bei der Kompilierung? – Programmer

+0

Kompilierzeit Fehler – Chico3001

Verwandte Themen