static public void CreateSpriteAnimation() { string tPath = "Assets/"; string tName = "A New SpriteAnimation"; if (Selection.objects != null && Selection.objects.Length == 1 && Selection.activeObject != null) { if (Selection.activeObject.GetType() != typeof(GameObject)) { tPath = AssetDatabase.GetAssetPath(Selection.activeObject.GetInstanceID()); string tCheckPath = tPath.Replace("/", "\\"); if (System.IO.File.Exists(tCheckPath) == true) { // ファイルなのでフォルダ名を取得する // 最後のフォルダ区切り位置を取得する int s = tPath.LastIndexOf('/'); tPath = tPath.Substring(0, s); } tPath = tPath + "/"; } } tPath = tPath + tName + ".asset"; UISpriteAnimation tSpriteAnimation = AssetDatabase.LoadAssetAtPath(tPath, typeof(UISpriteAnimation)) as UISpriteAnimation; if (tSpriteAnimation != null) { // 既にアセットが存在する Selection.activeObject = tSpriteAnimation; return; } tSpriteAnimation = ScriptableObject.CreateInstance <UISpriteAnimation>(); tSpriteAnimation.name = tName; AssetDatabase.CreateAsset(tSpriteAnimation, tPath); AssetDatabase.Refresh(); Selection.activeObject = tSpriteAnimation; }
// スンスペクター描画 public override void OnInspectorGUI() { // とりあえずデフォルト // DrawDefaultInspector() ; //----------------------------------------------------- // ターゲットのインスタンス UISpriteAnimation tTarget = target as UISpriteAnimation; //----------------------------------------------------- EditorGUILayout.Separator(); // 少し区切りスペース Texture tTexture = EditorGUILayout.ObjectField("Atlas Sprite", tTarget.texture, typeof(Texture), false) as Texture; if (m_TemporaryTexture == null) { if (tTexture != tTarget.texture) { m_TemporaryTexture = tTexture; } } else { bool tChange = false; if (tTarget.texture != null) { string tMessage = GetMessage("ChangeOK?"); GUILayout.Label(tMessage); GUILayout.BeginHorizontal(); // 横並び開始 { GUI.backgroundColor = Color.red; if (GUILayout.Button("OK", GUILayout.Width(100f)) == true) { tChange = true; } GUI.backgroundColor = Color.white; if (GUILayout.Button("Cancel", GUILayout.Width(100f)) == true) { m_TemporaryTexture = null; } } GUILayout.EndHorizontal(); // 横並び終了 } else { tChange = true; } if (tChange == true) { // 本当に変更する Undo.RecordObject(tTarget, "UISpriteAnimation : Change"); // アンドウバッファに登録 tTarget.texture = m_TemporaryTexture; List <Sprite> tList = new List <Sprite>(); if (tTarget.texture != null) { string tPath = AssetDatabase.GetAssetPath(tTarget.texture.GetInstanceID()); // テクスチャからパスを取得してマルチタイプスプライトとしてロードする UnityEngine.Object[] tSpriteAll = AssetDatabase.LoadAllAssetsAtPath(tPath); if (tSpriteAll != null) { int i, l = tSpriteAll.Length; for (i = 0; i < l; i++) { if (tSpriteAll[i] is UnityEngine.Sprite) { tList.Add(tSpriteAll[i] as UnityEngine.Sprite); } } } } if (tList.Count > 0) { // 存在するので更新する tTarget.SetSprite(tList.ToArray()); } else { // 存在しないのでクリアする tTarget.ClearSprite(); } EditorUtility.SetDirty(tTarget); m_TemporaryTexture = null; } } //----------------------------------------------------- if (tTarget.exist == true) { EditorGUILayout.Separator(); // 少し区切りスペース DrawFrame(tTarget); } }
protected void DrawFrame(UISpriteAnimation tTarget) { EditorGUILayout.Separator(); // 少し区切りスペース float tTimeScale = EditorGUILayout.FloatField("Time Scale", tTarget.timeScale); if (tTimeScale > 0 && tTimeScale != tTarget.timeScale) { Undo.RecordObject(tTarget, "UISpriteAnimation : Time Scale Change"); // アンドウバッファに登録 tTarget.timeScale = tTimeScale; EditorUtility.SetDirty(tTarget); // アセットデータベースに変更を通知 } int i, l; l = tTarget.frame.Count + 1; string[] tFrameNumber = new string[l]; for (i = 0; i < l; i++) { tFrameNumber[i] = i.ToString(); } if (m_InsertFrameIndex < 0) { m_InsertFrameIndex = l - 1; // 最終フレーム指定 } else if (m_InsertFrameIndex >= tFrameNumber.Length) { m_InsertFrameIndex = tFrameNumber.Length - 1; } l = tTarget.GetSpriteCount(); string[] tSpriteName = new string[l]; for (i = 0; i < l; i++) { if (tTarget.GetSprite(i) != null) { tSpriteName[i] = tTarget.GetSprite(i).name; } else { tSpriteName[i] = "<Missing>"; } } if (m_InsertSpriteIndex < 0) { m_InsertSpriteIndex = l - 1; // 最終フレーム指定 } else if (m_InsertSpriteIndex >= tSpriteName.Length) { m_InsertSpriteIndex = tSpriteName.Length - 1; } //---------------------------------------------------- GUILayout.BeginHorizontal(); // 横並び開始 { bool tInsert = false; // 挿入ボタン GUI.backgroundColor = Color.cyan; if (GUILayout.Button("Insert", GUILayout.Width(60f)) == true) { tInsert = true; } GUI.backgroundColor = Color.white; // フレーム番号 m_InsertFrameIndex = EditorGUILayout.Popup("", m_InsertFrameIndex, tFrameNumber, GUILayout.Width(50f)); // スプライト番号 m_InsertSpriteIndex = EditorGUILayout.Popup("", m_InsertSpriteIndex, tSpriteName, GUILayout.Width(120f)); // 表示時間 m_InsertDuration = EditorGUILayout.FloatField("", m_InsertDuration, GUILayout.Width(50f)); if (tInsert == true && tSpriteName[m_InsertSpriteIndex] != "<Missing>" && m_InsertDuration > 0) { // Frame を追加する Undo.RecordObject(tTarget, "UISpriteAnimation : Insert"); // アンドウバッファに登録 tTarget.Insert(m_InsertFrameIndex, m_InsertSpriteIndex, m_InsertDuration); EditorUtility.SetDirty(tTarget); m_InsertFrameIndex++; m_InsertSpriteIndex++; m_RemoveFrameIndex = null; } } GUILayout.EndHorizontal(); // 横並び終了 // 以下1つ以上フレームが登録されている場合のみ表示する l = tTarget.frame.Count; if (l > 0) { // 削除用フラグ if (m_RemoveFrameIndex == null) { m_RemoveFrameIndex = new bool[l]; for (i = 0; i < l; i++) { m_RemoveFrameIndex[i] = false; } } //------------------------------------------------ // 削除確認 if (m_RemoveFrameIndex != null) { if (m_ExecuteRemove == false) { // 削除ではない bool tRemove = false; for (i = 0; i < l; i++) { if (m_RemoveFrameIndex[i] == true) { tRemove = true; break; } } if (tRemove == true) { GUI.backgroundColor = Color.red; if (GUILayout.Button("Execute Remove", GUILayout.Height(36f)) == true) { m_ExecuteRemove = true; } GUI.backgroundColor = Color.white; } else { GUILayout.Label("", GUILayout.Height(38f)); } } else { // 削除の最終確認 string tMessage = GetMessage("RemoveOK?"); GUILayout.Label(tMessage); GUILayout.BeginHorizontal(); // 横並び開始 { GUI.backgroundColor = Color.red; if (GUILayout.Button("OK", GUILayout.Width(100f)) == true) { // 本当に削除する Undo.RecordObject(tTarget, "UISpriteAnimation : Remove"); // アンドウバッファに登録 List <int> tRemoveFrameIndex = new List <int>(); for (i = 0; i < l; i++) { if (m_RemoveFrameIndex[i] == true) { tRemoveFrameIndex.Add(i); } } if (tRemoveFrameIndex.Count > 0) { tTarget.Remove(tRemoveFrameIndex.ToArray()); } EditorUtility.SetDirty(tTarget); m_RemoveFrameIndex = null; m_ExecuteRemove = false; } GUI.backgroundColor = Color.white; if (GUILayout.Button("Cancel", GUILayout.Width(100f)) == true) { m_ExecuteRemove = false; } } GUILayout.EndHorizontal(); // 横並び終了 if (m_RemoveFrameIndex == null) { // フレームの数が変動しているので以下のリストを表示してはならない return; } } } //--------------------------- EditorGUILayout.Separator(); // 少し区切りスペース GUILayout.BeginHorizontal(); // 横並び { GUILayout.Label("Frame"); m_Thumbnail = EditorGUILayout.Toggle(m_Thumbnail, GUILayout.Width(16f)); GUILayout.Label("Thumbnail"); } GUILayout.EndHorizontal(); // 横並び終了 EditorGUILayout.Separator(); // 少し区切りスペース // 登録されているフレーム情報を表示する m_Scroll = GUILayout.BeginScrollView(m_Scroll); { for (i = 0; i < l; i++) { GUILayout.BeginHorizontal(); { // サムネイルアイコン // フレーム番号(右寄せ) GUILayout.Label(i.ToString(), GUILayout.Width(30f)); // スプライト選択 int tSpriteIndex = EditorGUILayout.Popup("", tTarget.frame[i].spriteIndex, tSpriteName, GUILayout.Width(120f)); // フィールド名有りタイプ if (tSpriteIndex != tTarget.frame[i].spriteIndex) { if (tSpriteName[tSpriteIndex] != "<Missing>") { Undo.RecordObject(tTarget, "UISpriteAnimation : Change"); // アンドウバッファに登録 tTarget.frame[i].spriteIndex = tSpriteIndex; EditorUtility.SetDirty(tTarget); } } // 表示時間 float tDuration = EditorGUILayout.FloatField("", tTarget.frame[i].duration, GUILayout.Width(50f)); if (tDuration != tTarget.frame[i].duration && tDuration > 0) { Undo.RecordObject(tTarget, "UISpriteAnimation : Change"); // アンドウバッファに登録 tTarget.frame[i].duration = tDuration; EditorUtility.SetDirty(tTarget); } // 削除用ボタン if (m_RemoveFrameIndex[i] == false) { GUI.backgroundColor = Color.white; } else { GUI.backgroundColor = Color.red; } if (GUILayout.Button("Remove", GUILayout.Width(60f))) { m_RemoveFrameIndex[i] = !m_RemoveFrameIndex[i]; } GUI.backgroundColor = Color.white; } GUILayout.EndHorizontal(); // サムネイル if (m_Thumbnail == true) { GUILayout.BeginHorizontal(); { GUILayout.Label("", GUILayout.Width(30f)); Sprite tSprite = EditorGUILayout.ObjectField("", tTarget.GetSprite(i), typeof(Sprite), false, GUILayout.Width(60f), GUILayout.Height(60f)) as Sprite; if (tSprite != tTarget.GetSprite(i)) { } } GUILayout.EndHorizontal(); } } } GUILayout.EndScrollView(); } }
// スンスペクター描画 public override void OnInspectorGUI() { // とりあえずデフォルト // DrawDefaultInspector() ; //-------------------------------------------- // ターゲットのインスタンス UIFlipper tTarget = target as UIFlipper; EditorGUILayout.Separator(); // 少し区切りスペース // 識別子 GUI.backgroundColor = Color.cyan; string tIdentity = EditorGUILayout.TextField("Identity", tTarget.identity); GUI.backgroundColor = Color.white; if (tIdentity != tTarget.identity) { Undo.RecordObject(tTarget, "UIFlipper : Identity Change"); // アンドウバッファに登録 tTarget.identity = tIdentity; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } // ディレイ float tDelay = EditorGUILayout.FloatField("Delay", tTarget.delay); if (tDelay != tTarget.delay) { Undo.RecordObject(tTarget, "UIFlipper : Delay Change"); // アンドウバッファに登録 tTarget.delay = tDelay; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } //------------------------------------------------ EditorGUILayout.Separator(); // 少し区切りスペース if (tTarget.GetComponent <Image>() == null) { EditorGUILayout.HelpBox(GetMessage("ImageNone"), MessageType.Warning, true); } // ワイドモードを有効にする // bool tWideMode = EditorGUIUtility.wideMode ; // EditorGUIUtility.wideMode = true ; //-------------------------------------------------------------------- // 一番肝心なスプライトアニメーションファイル UISpriteAnimation tSpriteAnimation = EditorGUILayout.ObjectField("Sprite Animation", tTarget.spriteAnimation, typeof(UISpriteAnimation), false) as UISpriteAnimation; if (tSpriteAnimation != tTarget.spriteAnimation) { Undo.RecordObject(tTarget, "UIFlipper : Sprite Animation Change "); // アンドウバッファに登録 tTarget.spriteAnimation = tSpriteAnimation; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } if (tTarget.enabled == true && tTarget.spriteAnimation != null) { EditorGUILayout.Separator(); // 少し区切りスペース GUILayout.BeginHorizontal(); // 横並び { // チェック GUILayout.Label("Checker (Editor Only)", GUILayout.Width(150f)); bool tIsChecker = EditorGUILayout.Toggle(tTarget.isChecker); if (tIsChecker != tTarget.isChecker) { if (tIsChecker == true) { UIFlipper[] tFlipperList = tTarget.gameObject.GetComponents <UIFlipper>(); if (tFlipperList != null && tFlipperList.Length > 0) { for (int i = 0; i < tFlipperList.Length; i++) { if (tFlipperList[i] != tTarget) { if (tFlipperList[i].isChecker == true) { tFlipperList[i].isChecker = false; } } } } } Undo.RecordObject(tTarget, "UIFlipper : Checker Change"); // アンドウバッファに登録 tTarget.isChecker = tIsChecker; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 if (tTarget.isChecker == true) { GUILayout.BeginHorizontal(); // 横並び { int tCheckFactor = EditorGUILayout.IntSlider(tTarget.checkFactor, 0, tTarget.spriteAnimation.length - 1); if (tCheckFactor != tTarget.checkFactor) { Undo.RecordObject(tTarget, "UIFlipper : Check Factor Change "); // アンドウバッファに登録 tTarget.checkFactor = tCheckFactor; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; /* Image tImage = tTarget.GetComponent<Image>() ; * if( tImage != null ) * { * EditorUtility.SetDirty( tImage ) ; * }*/ } } GUILayout.EndHorizontal(); // 横並び終了 } EditorGUILayout.Separator(); // 少し区切りスペース // Begin GUILayout.BeginHorizontal(); // 横並び { GUILayout.Label("Begin", GUILayout.Width(60f)); int tBegin = EditorGUILayout.IntSlider(tTarget.begin, 0, tTarget.spriteAnimation.length - 1); if (tBegin != tTarget.begin) { Undo.RecordObject(tTarget, "UIFlipper : Begin Change "); // アンドウバッファに登録 tTarget.begin = tBegin; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 // end GUILayout.BeginHorizontal(); // 横並び { GUILayout.Label("End", GUILayout.Width(60f)); int tEnd = EditorGUILayout.IntSlider(tTarget.end, 0, tTarget.spriteAnimation.length - 1); if (tEnd != tTarget.end) { Undo.RecordObject(tTarget, "UIFlipper : End Change "); // アンドウバッファに登録 tTarget.end = tEnd; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 } //-------------------------------------------------------------------- EditorGUILayout.Separator(); // 少し区切りスペース GUILayout.BeginHorizontal(); // 横並び { // バック GUILayout.Label("Back", GUILayout.Width(116f)); bool tBack = EditorGUILayout.Toggle(tTarget.back); if (tBack != tTarget.back) { Undo.RecordObject(tTarget, "UIFlipper : Back Change"); // アンドウバッファに登録 tTarget.back = tBack; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 GUILayout.BeginHorizontal(); // 横並び { // ループ GUILayout.Label("Loop", GUILayout.Width(116f)); bool tLoop = EditorGUILayout.Toggle(tTarget.loop); if (tLoop != tTarget.loop) { Undo.RecordObject(tTarget, "UIFlipper : Loop Change"); // アンドウバッファに登録 tTarget.loop = tLoop; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 if (tTarget.loop == true) { GUILayout.BeginHorizontal(); // 横並び { // リバース GUILayout.Label("Reverse", GUILayout.Width(116f)); bool tReverse = EditorGUILayout.Toggle(tTarget.reverse); if (tReverse != tTarget.reverse) { Undo.RecordObject(tTarget, "UIFlipper : Reverse Change"); // アンドウバッファに登録 tTarget.reverse = tReverse; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 } // スピード float tSpeed = EditorGUILayout.FloatField("Speed", tTarget.speed); if (tSpeed != tTarget.speed) { Undo.RecordObject(tTarget, "UIFlipper : Speed Change"); // アンドウバッファに登録 tTarget.speed = tSpeed; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } GUILayout.BeginHorizontal(); // 横並び { // イグノアタイムスケール GUILayout.Label("Ignore Time Scale", GUILayout.Width(116f)); bool tIgnoreTimeScale = EditorGUILayout.Toggle(tTarget.ignoreTimeScale); if (tIgnoreTimeScale != tTarget.ignoreTimeScale) { Undo.RecordObject(tTarget, "UIFlipper : Ignore Time Scale Change"); // アンドウバッファに登録 tTarget.ignoreTimeScale = tIgnoreTimeScale; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 GUILayout.BeginHorizontal(); // 横並び { // プレイオンアウェイク GUILayout.Label("Play On Awake", GUILayout.Width(116f)); bool tPlayOnAwake = EditorGUILayout.Toggle(tTarget.playOnAwake); if (tPlayOnAwake != tTarget.playOnAwake) { Undo.RecordObject(tTarget, "UIFlipper : Play On Awake Change"); // アンドウバッファに登録 tTarget.playOnAwake = tPlayOnAwake; EditorUtility.SetDirty(tTarget); // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ) ; } } GUILayout.EndHorizontal(); // 横並び終了 GUILayout.BeginHorizontal(); // 横並び { // デストロイアットエンド GUILayout.Label("Destroy At End", GUILayout.Width(116f)); bool tDestroyAtEnd = EditorGUILayout.Toggle(tTarget.destroyAtEnd); if (tDestroyAtEnd != tTarget.destroyAtEnd) { Undo.RecordObject(tTarget, "UIFlipper : Destroy At End Change"); // アンドウバッファに登録 tTarget.destroyAtEnd = tDestroyAtEnd; EditorUtility.SetDirty(tTarget); } } GUILayout.EndHorizontal(); // 横並び終了 GUILayout.BeginHorizontal(); // 横並び { // デストロイアットエンド GUILayout.Label("Auto Resize", GUILayout.Width(116f)); bool tAutoResize = EditorGUILayout.Toggle(tTarget.autoResize); if (tAutoResize != tTarget.autoResize) { Undo.RecordObject(tTarget, "UIFlipper : Auto Resize Change"); // アンドウバッファに登録 tTarget.autoResize = tAutoResize; EditorUtility.SetDirty(tTarget); } } GUILayout.EndHorizontal(); // 横並び終了 EditorGUILayout.Separator(); // 少し区切りスペース GUILayout.BeginHorizontal(); // 横並び { // イズプレイング GUILayout.Label("Is Playing", GUILayout.Width(116f)); EditorGUILayout.Toggle(tTarget.isPlaying); } GUILayout.EndHorizontal(); // 横並び終了 EditorGUILayout.Separator(); // 少し区切りスペース // デリゲートの設定状況 SerializedObject tSO = new SerializedObject(tTarget); SerializedProperty tSP = tSO.FindProperty("onFinished"); if (tSP != null) { EditorGUILayout.PropertyField(tSP); } tSO.ApplyModifiedProperties(); }