我刚刚制作了一个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的动画/动画师的工具来执行此操作。您可以在此处了解有关此的更多信息。