2017-05-06 49 views
0

我剛剛做了一個png動畫序列,當找到該對象時會觸發,但是在第一個循環中需要大量的加載,有沒有更快加載的方法?在第一個循環播放精靈動畫序列的速度很慢

動畫包括在一個精靈的所有的總大小約爲180MB,而我使用的代碼加載500個PNG格式很簡單:

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我是一個統一編程的完整noob,所以請原諒我,如果我失去了一些明顯的東西,謝謝

回答

1

問題是,你正在加載精靈的每一幀。它會影響性能。在Start函數中執行一次並將結果存儲在一個數組中。然後,您可以在Update函數中使用該數組。

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

由於要裝載許多文件,你應該使用Resources.LoadAsync代替。這將允許您加載數據幀,並防止加載精靈時任何可能的凍結。

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

最後,不要使用任何上述這些解決方案。他們只是在那裏,因爲這就是你要求的。使用Unity的Animation/Animator工具來執行此操作。你可以瞭解更多關於這個here

+0

感謝您的信息..有很多事情我不知道,我會學習動畫工具,但同時我做你的第一個例子,我得到這個錯誤:Assets/Sprite.cs(22, 27):錯誤CS0029:不能隱式地將'Sprite'類型轉換爲'UnityEngine.Sprite',你知道我能做什麼錯嗎? – Chico3001

+0

運行時或編譯時錯誤? – Programmer

+0

編譯時錯誤 – Chico3001