一、PNG序列图片大致使用方向
二、具体开发
①精灵动画、纹理动画及UI动画可利用Image、SpriteRenderer及RawImage进行Sprite轮播
using UnityEngine;
using UnityEngine.UI;
public class ListPNGHandler : MonoBehaviour
{
public Sprite[] SpriteArray;
public float SpriteRate = 0.1f;
public int ChangeIndexNum = 0;
private int currentSprite;
private Image PNGImage;
private SpriteRenderer spriteRen;
private RawImage spritRawImage;
void Start()
{
PNGImage = GetComponent<Image>();
spriteRen = GetComponent<SpriteRenderer>();
spritRawImage = GetComponent<RawImage>();
Invoke("ChangeIndex", 0.1f);
}
void Update()
{
if (PNGImage != null)
{
PNGImage.sprite = SpriteArray[currentSprite];
}
else if(spriteRen != null)
{
spriteRen.sprite = SpriteArray[currentSprite];
}
else if(spritRawImage != null)
{
spritRawImage.texture = SpriteArray[currentSprite].texture;
}
}
void ChangeIndex()
{
currentSprite++;
if (currentSprite == SpriteArray.Length)
{
currentSprite = 0;
}
Invoke("ChangeIndex", SpriteRate);
}
public void PlayInvoke()
{
Invoke("ChangeIndex", 0.05f);
currentSprite = 0;
}
public void StopInvoke()
{
CancelInvoke("ChangeIndex");
currentSprite = 0;
}
}
②精灵动画、纹理动画及UI动画可利用Animator进行Sprite轮播
将PNG序列图片放置在Animation中,调节播放时间,最终生成序列动画,直接在Animator调用使用。
三、缺点
方法①和方法②的实现方式在Unity中的一个主要缺点就是当动画相对比较复杂时会占用大量的内存,因为每一帧都是一个完整的图片,因此对于复杂的动画或高分辨率的图像,内存消耗可能会变得非常大。以下是一些可以帮助减少内存消耗的建议:
1. 优化图片大小:可以试图减小每一帧的尺寸,只要这不会显著影响动画的质量。对图片进行压缩也是一种可能的解决方案,但要注意压缩可能会导致画质下降。
2. 减少帧数:如果可能的话,减少动画中的帧数也可以减少内存消耗。这可能需要在动画的流畅性和内存使用之间找到一个平衡点。
3. 使用Sprite Atlas:Unity的Sprite Atlas特性可以帮助减少内存使用和提高渲染性能。它可以将多个小的精灵图片打包到一个大的纹理图中,从而减少渲染调用和内存占用。
4. 在需要时才加载动画:如果游戏中有很多动画,但在任何给定时间只需要一小部分,可以考虑在需要时才加载特定的动画。这可以极大地减少内存消耗,但需要更复杂的资源管理。
5. 使用视频代替PNG序列:对于一些复杂的动画,使用视频文件可能是一种更有效的方法。Unity支持播放视频文件,而视频文件通常比相同质量的PNG序列占用更少的内存。
针对一些需要带透明的PNG序列可输出带透明的webm格式的视频文件进行使用,使用方式为:
-
创建RenderTexture,具体大小可根据视频格式大小进行设置(最好保持对齐)
-
将webm视频文件导入到Unity,并保持透明属性
注意:Codec必须要VP8,不然会出无法正常识别问题
-
设置一个RawImage,将RenderTexture渲染器赋予其中
-
设置一个VideoPlayer,VideoClip设置为webm视频,targetTexture设置为RenderTexture(将视频数据通过渲染器展示在RawImage当中)