1. ホーム

ユニティ再生gif

2022-02-19 01:58:56

Unity自体はgifの再生をサポートしていないので、C#system.Drawing.dllを使ってギャラリーにgifを統合し、1枚ずつ再生することで動的画像のような効果を実現しています

まず、現在使用している unity->Data->Mono->lib->mono->2.0->System.Drawing.dll のファイルを開き、新しいプロジェクトの Assets ディレクトリにコピーします。

この System.Drawing.dll は、MonoBehaviour を継承する unity3D フォルダになければならず、他の場所では使用できません。


適当な.gifの動画を見つけて、StreamingAssetsファイルの下にドロップします。

プロジェクトの設定です。


レンダリングです。


スクリプトです。

using UnityEngine;
Collections;
Drawings;
Generic;
UI; using UnityEngine;
Imaging;
Imaging; using System;
IO; using System;
public class aaaaa : MonoBehaviour {
	public UnityEngine.UI.Image Im;
	public GameObject[] Ims;
	[SerializeField]//Serialize field
	private float fps=30f;
	private List<Texture2D> tex2DList = new List<Texture2D> ();
	private float time;
	Bitmap mybitmp;
	void Start () {
		Image image = System.Drawing.Image.FromFile (Application.streamingAssetsPath + "/loading.gif");
		tex2DList = MyGif (image);
	}
	
	// Update is called once per frame
	void Update () {
		if (tex2DList.Count > 0)
		{
			time += Time.deltaTime;
			int index = (int)(time * fps) % tex2DList.Count;
			if (Im ! = null)
			{
				Im.sprite = Sprite.Create(tex2DList[index], new Rect(0, 0, tex2DList[index].width, tex2DList[index].height), new Vector2(0.5f, 0.5f));
			}
			if (Ims.Length ! = 0)
			{
				for (int i = 0; i < Ims.Length; i++)
					Ims[i].GetComponent<Renderer>().material.mainTexture = tex2DList[index];

			}
		}
	}
	private List<Texture2D> MyGif(System.Drawing.Image image){
	
		List<Texture2D> tex = new List<Texture2D> ();
		if(image!=null){

			Debug.Log ("Number of images: "+image.FrameDimensionsList.Length);
			FrameDimension frame = new FrameDimension (image.FrameDimensionsList[0]);
			int frameCount = image.GetFrameCount (frame);//Get the number of frames of the dimension
			for(int i=0;i<framCount;++i){

				image.SelectActiveFrame (frame,i);
				Bitmap framBitmap = new Bitmap (image.Width,image.Height);
				Graphics graphic = System.Drawing.Graphics.
					Graphics.DrawImage (image,Point.Empty);
				}
				Texture2D frameTexture2D = new Texture2D (frameBitmap.Width,frameBitmap.Height,TextureFormat.ARGB32,true);
				frameTexture2D.LoadImage (Bitmap2Byte(frameBitmap));
				tex.Add (frameTexture2D);
			}
		}
		return tex;
	}
	private byte[] Bitmap2Byte(Bitmap bitmap)
	{
		using (MemoryStream stream = new MemoryStream())
		{
			// save the bitmap to the stream in png format
			bitmap.Save(stream, ImageFormat.Png);
			// Create an array of bytes, the length of the stream
			byte[] data = new byte[stream.Length];
			// Reset the pointer
			stream.Seek(0, SeekOrigin.Begin);
			// Read the byte block from the stream into data
			Stream.Read(data, 0, Convert.ToInt32(stream.Length));
			return data;
		}
	}
}