have to keep png files for animation?

I created animation within Unity using series of png files.
It is about 10 seconds long, but things in it move faster so there are many png files making up that 10 seconds. there are about 10 animations created this way.
the resources folder that contain png files is now about 100mb.
Is there a way to reduce its size other than reducing quality of png files?

also, do i have to keep png files around or is there a way to compress that to a single file in Unity?

Actually, unity compresses your files when build project, and final weight depends on your project setting (it may recompress your PNGs to any other format for you).

To compress all frames in one file you may use atlases (one image with many frames, frames switches by changing UV coordinates). My solution to use such animations is below:

using UnityEngine;
using System.Collections;

// spritesheet textures animations controller
public class AnimatedTextureController : _MonoBehaviour {
	public float animationCycleTime;
	public int texTilesX, texTilesY;
	public bool autoPlay;
	public bool billboardingOn = false;
	protected Renderer animatedRenderer;
	protected Transform cameraTransform;
	protected bool stopSignal;
	protected bool isPlaying;
	protected bool playOnce;

	public virtual void Play(bool in_playOnce = false) {
		//Debug.Log ("PLAY: isPlaying="+isPlaying+"  stopSignal="+stopSignal);
		playOnce = in_playOnce;
		if(!isPlaying) {
			stopSignal = false;
	public virtual void PlayOnce() {
	public virtual void Stop() {
		//Debug.Log ("STOP: isPlaying="+isPlaying+"  stopSignal="+stopSignal);
			stopSignal = true;
	public virtual bool IsPlaying() {
		return isPlaying;
	// ----------
	protected virtual void Awake () {
		ApplyScale(new Vector2(1.0f / texTilesX, 1.0f / texTilesY));

		isPlaying = false;
		stopSignal = false;
	protected virtual void Start() {
			Play ();
	protected virtual void InitController() {
		cameraTransform = Camera.main.transform;
		animatedRenderer = renderer;
		animatedRenderer.enabled = false;

	private IEnumerator AnimateTexture() {
		AnimationEnable ();
		isPlaying = true;
		for(int i = texTilesY-1; i>-1 && !stopSignal; i--) {
			for(int j = 0; j < texTilesX && !stopSignal; j++) {
				ApplyOffset(new Vector2(1.0f / texTilesX * j, 1.0f / texTilesY * i));
				yield return new WaitForSeconds(animationCycleTime / (texTilesX * texTilesY)); 
				if(i == 0 && j == texTilesX-1 && !playOnce) //reset cycle, if !playOnce
					i = texTilesY; 
		isPlaying = false;
		stopSignal = false;
	protected virtual void AnimationEnable() {
		animatedRenderer.enabled = true;
	protected virtual void AnimationDisable() {
		animatedRenderer.enabled = false;
	protected virtual void ApplyOffset(Vector2 offset) {
		animatedRenderer.material.mainTextureOffset = offset;
	protected virtual void ApplyScale(Vector2 scale) {
		animatedRenderer.material.mainTextureScale = scale;
	protected virtual void Update() {
			transform.rotation = cameraTransform.rotation;

	protected virtual void OnFinish() {