ユニティ再生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;
}
}
}
関連
-
TP5.1 で数値が正しく表示されない問題が発生しました。
-
デバッグのアサーションに失敗する問題 解決方法
-
EF: エンティティオブジェクトは、IEntityChangeTrackerの複数のインスタンスから参照することはできません。
-
不完全な型へのエラーメンバーアクセス
-
listen tcp :8080: bind: 各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)を1つだけ使用することはできません。
-
Unity3d Drag and Drop script reports error スクリプトクラスが見つからないため、スクリプトコンポーネント "" を追加できません。
-
C++で'atoi'がこのスコープで宣言されていない問題を解決するにはどうしたらいいですか?
-
test dword ptr [eax],eax ;プローブページです。
-
C++の完全なクラスはstdのメンバではない
-
Volley NetworkDispatcher.run。処理されない例外 java.lang.NullPointerException
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
画像ダウンロードの問題
-
Android Studio が GIT をコミットするとき、このリポジトリでは別の git プロセスが実行されているようです(例:エディタを開いている)。
-
Linux: [Errno 12] メモリを割り当てられない問題を解決する。
-
Pygameでタイマーを使う
-
raise JSONDecodeError("Expecting value", s, err.value) from None
-
scp エラー: 通常のファイルではありません
-
Javaで例外が発生しました。トークンの構文エラー、構成要素の誤配置。
-
Pythonの一般的なエラーとデバッグ方法 (2)
-
ベクトル添え字の範囲外問題の解の1つ
-
STM32でのビットバンド動作