NGUIで設定されたアニメーションを手軽に確認するためのEditor拡張


(NGUI free 版 で動作確認)

NGUI組み込みアニメーション機能で設定したアニメーションは、アニメーション起動用のボタンを用意してあげることで再生することができるが、いささかめんどくさいので、Editor拡張を作成してみた。

以下のコードを Editor フォルダ配下に格納。


```csharp:TweenGroupManager.cs
using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Collections.Generic;

public class TweenGroupManager : EditorWindow {

	class TweenGroup {
		public int GroupNo = 0;
		public List<UITweener> Tweeners = new List<UITweener>();
		
		public TweenGroup(int a_groupNo) {
			GroupNo = a_groupNo;
		}
	}
	
	SortedDictionary<int, TweenGroup> m_tweenGroups = new SortedDictionary<int, TweenGroup>();
	Stack<bool> m_guiEnableFlagBackups = new Stack<bool>();
	
	[MenuItem("Window/TweenGroupManager")]
	public static void ShowWindow() {
		EditorWindow win = EditorWindow.GetWindow<TweenGroupManager>();
		win.title = "TweenGroupManager";
	}

	void OnInspectorUpdate() {
		// reset collection
		foreach(TweenGroup grp in m_tweenGroups.Values) { 
			if (grp.Tweeners == null) continue;
			grp.Tweeners.Clear();
		} 
		m_tweenGroups.Clear();
		
		// Collect all UITweener by each tweenGroup
		UITweener[] newTweeners = (UITweener[])GameObject.FindObjectsOfType(typeof(UITweener));
		foreach(UITweener tw in newTweeners) {
			if (!m_tweenGroups.ContainsKey(tw.tweenGroup)) {
				m_tweenGroups.Add(tw.tweenGroup, new TweenGroup(tw.tweenGroup));
			}
			m_tweenGroups[tw.tweenGroup].Tweeners.Add (tw);
		}
	}

	void OnGUI() {
		GameObject go = NGUIEditorTools.SelectedRoot();
		
		BeginGUIEnableIfPlaying();
			foreach(TweenGroup grp in m_tweenGroups.Values) {
				// Label : #(tweenGroup)
				EditorGUILayout.LabelField(string.Format ("#{0}", grp.GroupNo));
				GUILayout.BeginHorizontal();
				 	GUILayout.BeginHorizontal(GUILayout.Width(90));
						// Button : PlayAll
						if (GUILayout.Button ("PlayAll", GUILayout.Width(50))) {
							foreach(UITweener tw in grp.Tweeners) {
								if (!NGUITools.GetActive(go)) {
									NGUITools.SetActive(go, true);
								}
								// Play tween froward
								tw.Play (true);
								tw.Reset ();
							}
						}
						// Button : PlayAll(reverse)
						if (GUILayout.Button ("<<", GUILayout.Width(30))) {
							foreach(UITweener tw in grp.Tweeners) {
								if (!NGUITools.GetActive(go)) {
									NGUITools.SetActive(go, true);
								}
								// Play tween reverse
								tw.Play (false);
								tw.Reset ();
							}
						}
					GUILayout.EndHorizontal();
					GUILayout.BeginVertical();
						if (grp.Tweeners != null) {
							foreach(UITweener tw in grp.Tweeners) {
								GUILayout.BeginHorizontal();
									// BUtton : play forward
									if (GUILayout.Button(tw.gameObject.name)) {
										tw.Play (true);
										tw.Reset ();
									}
									// Button : play reverse
									if (GUILayout.Button ("<<", GUILayout.Width (30))) {
										tw.Play (false);
										tw.Reset ();
									}
								GUILayout.EndHorizontal();
							}
						}
					GUILayout.EndVertical();
				GUILayout.EndHorizontal();
			}
		EndGUIEnableIfPlaying();
	}
	
	void BeginGUIEnableIfPlaying() {
		m_guiEnableFlagBackups.Push(GUI.enabled);
		GUI.enabled = Application.isPlaying;
	}

	void EndGUIEnableIfPlaying() {
		GUI.enabled = m_guiEnableFlagBackups.Pop ();
	}
	
	void BeginGUIEnableIfEditing() {
		m_guiEnableFlagBackups.Push (GUI.enabled);
		GUI.enabled = !Application.isPlaying;
	}
	
	void EndGUIEnableIfEditing() {
		GUI.enabled = m_guiEnableFlagBackups.Pop ();
	}
}


```


# 使い方

![スクリーンショット 2014-05-12 20.13.40.png](https://qiita-image-store.s3.amazonaws.com/0/8219/e64d3942-8a4e-3f42-e78d-38e5783f74b1.png "スクリーンショット 2014-05-12 20.13.40.png")


Unityを実行モードに切り替え、メニューから[Window]-[TweenGroupManger] を選択すると以下のようなウィンドウが開く。

* [PlayAll] をクリックするとグループ単位でTweenを再生
* その隣の[<<]をクリックすると逆再生
* 右側のTweenXXXコンポーネントがアタッチされたオブジェクトの名前が表示されたボタンをクリックすると個別のTweenを再生

![スクリーンショット 2014-05-12 20.07.28.png](https://qiita-image-store.s3.amazonaws.com/0/8219/df93917b-c82d-4678-d752-f4ec4920cd0f.png "スクリーンショット 2014-05-12 20.07.28.png")