在第一个循环中缓慢播放精灵动画序列
Playing sprite animation sequence slow on first loop
我刚刚制作了一个 png 动画序列,它在找到对象时触发,但在第一个循环中加载需要很多时间,有没有办法更快地加载它?
该动画由 500 个 png 加载到一个 sprite 中组成,所有文件的总大小约为 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 的 Animation/Animator 工具来执行此操作。您可以了解更多相关信息 here。
我刚刚制作了一个 png 动画序列,它在找到对象时触发,但在第一个循环中加载需要很多时间,有没有办法更快地加载它?
该动画由 500 个 png 加载到一个 sprite 中组成,所有文件的总大小约为 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 的 Animation/Animator 工具来执行此操作。您可以了解更多相关信息 here。