在第一个循环中播放Sprite动画序列缓慢



我刚刚制作了一个png动画序列,该序列在发现对象时会触发,但是在第一个循环中,加载需要很多东西,有没有办法更快地加载它?

动画由500个png组成,该png在精灵中加载的总尺寸约为180MB,我使用的代码非常简单:

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"));
}

顺便说一句,我是一个完整的团结编程的菜鸟,所以如果我错过了明显的东西,请原谅我,谢谢

问题在于您正在为每个帧加载精灵。它将影响性能。在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的动画/动画师的工具来执行此操作。您可以在此处了解有关此的更多信息。

最新更新