Unityでは基本的にアニメーションGIFをサポートしていない。
表示だけでもアセット等を追加する必要がある。
公式だとテクスチャを使ってほしいらしい。
1から作るのも時間がかかりそうなのでライブラリを探して使ってみる。
ちょっと探してみたがこれしか見つからなかった。
あまりニーズがないのかもしれない。
デモを見た感じの使い方ですが Main Camera に Recorder.cs と制御用のスクリプトをアタッチする。
制御用のスクリプトの基盤はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using UnityEngine; using Moments; public class CTRL : MonoBehaviour { Recorder rec; void Start(){ rec = GetComponent<Recorder>(); rec.Record(); //準備 rec.OnPreProcessingDone = OnProcessingDone; //保存開始時 rec.OnFileSaveProgress = OnFileSaveProgress;//保存中 rec.OnFileSaved = OnFileSaved; //保存終了時 } void OnProcessingDone(){ Debug.Log("OnProcessingDone"); } void OnFileSaveProgress( int id, float percent ){ Debug.Log("OnFileSaveProgress:"+id+":"+percent); } void OnFileSaved( int id, string filepath ){ Debug.Log("OnFileSaved:"+id+":"+filepath); rec.Record(); } void Update(){ if ( Input.GetKeyDown(KeyCode.Space) ){ rec.Save(); } } } |
これだけでカメラに映る光景を保存することができる。
私は複数のTextureを入力してアニメーションGIFにするようなものが欲しかったのでちょっと改造する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using Moments; using Moments.Encoder; using ThreadPriority = System.Threading.ThreadPriority; public class MakeGif : MonoBehaviour { int m_Repeat = 0; int m_Quality = 15; float m_TimePerFrame = 1f / 2f;// 1フレームの時間(s) public ThreadPriority WorkerPriority = ThreadPriority.BelowNormal; public Action<int, float> OnFileSaveProgress; public Action<int, string> OnFileSaved; List<GifFrame> frames; void Start () { frames = new List<GifFrame>(); AddFrame( Resources.Load("0",typeof(Texture2D)) as Texture2D ); AddFrame( Resources.Load("1",typeof(Texture2D)) as Texture2D ); AddFrame( Resources.Load("2",typeof(Texture2D)) as Texture2D ); AddFrame( Resources.Load("3",typeof(Texture2D)) as Texture2D ); AddFrame( Resources.Load("4",typeof(Texture2D)) as Texture2D ); Save("test"); } public void AddFrame(Texture2D target){ frames.Add( new GifFrame(){ Width = target.width, Height = target.height, Data = target.GetPixels32() } ); } public void Save(string filename){ string filepath = filename+".gif"; GifEncoder encoder = new GifEncoder(m_Repeat, m_Quality); encoder.SetDelay(Mathf.RoundToInt(m_TimePerFrame * 1000f)); Worker worker = new Worker(WorkerPriority){ m_Encoder = encoder, m_Frames = frames, m_FilePath = filepath, m_OnFileSaved = OnFileSaved, m_OnFileSaveProgress = OnFileSaveProgress }; worker.Start(); } } |
画像をリソースに置いて Read / Write を有効に設定。
これだけでテクスチャをアニメーションGIFにすることができた。便利!