From 78eb45f88ebe8ab59d997fcded065dc04f65bed9 Mon Sep 17 00:00:00 2001 From: pspkurara Date: Fri, 6 Nov 2020 16:56:23 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=A8=E3=81=A6=E3=81=AE=E3=82=AA?= =?UTF-8?q?=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=ABRecordObj?= =?UTF-8?q?ect=E3=81=8C=E8=A1=8C=E3=82=8F=E3=82=8C=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/SkinParts/AnimationSample.cs | 1 + .../Runtime/SkinParts/GraphicMaterial.cs | 1 + .../Runtime/SkinParts/ImageSprite.cs | 1 + .../Runtime/SkinParts/RawImageTexture.cs | 1 + .../Runtime/SkinParts/ScriptableLogic.cs | 1 + .../Runtime/SkinnerRuntimeEditorUtility.cs | 56 ++++++++++++++++++- 6 files changed, 60 insertions(+), 1 deletion(-) diff --git a/Packages/uGUI-Skinner/Runtime/SkinParts/AnimationSample.cs b/Packages/uGUI-Skinner/Runtime/SkinParts/AnimationSample.cs index 262327e..d9346d6 100644 --- a/Packages/uGUI-Skinner/Runtime/SkinParts/AnimationSample.cs +++ b/Packages/uGUI-Skinner/Runtime/SkinParts/AnimationSample.cs @@ -46,6 +46,7 @@ public void SetValues(SkinLogicProperty property) //値がないなら何もしない if (property.floatValues.Count < FloatLength) return; activeTime = property.floatValues[TimeIndex]; + SkinnerRuntimeEditorUtility.DeepRecordObject(rootGameObject); animationClip.SampleAnimation(rootGameObject, activeTime); } diff --git a/Packages/uGUI-Skinner/Runtime/SkinParts/GraphicMaterial.cs b/Packages/uGUI-Skinner/Runtime/SkinParts/GraphicMaterial.cs index 4fafbc5..55e783a 100644 --- a/Packages/uGUI-Skinner/Runtime/SkinParts/GraphicMaterial.cs +++ b/Packages/uGUI-Skinner/Runtime/SkinParts/GraphicMaterial.cs @@ -40,6 +40,7 @@ public void SetValues(SkinLogicProperty property) { material = property.objectReferenceValues[MaterialIndex] as Material; } + SkinnerRuntimeEditorUtility.RecordObject(graphic); graphic.material = material; SkinnerUtility.ReloadGameObject(graphic); } diff --git a/Packages/uGUI-Skinner/Runtime/SkinParts/ImageSprite.cs b/Packages/uGUI-Skinner/Runtime/SkinParts/ImageSprite.cs index e1a7a34..13213f3 100644 --- a/Packages/uGUI-Skinner/Runtime/SkinParts/ImageSprite.cs +++ b/Packages/uGUI-Skinner/Runtime/SkinParts/ImageSprite.cs @@ -40,6 +40,7 @@ public void SetValues(SkinLogicProperty property) { sprite = property.objectReferenceValues[SpriteIndex] as Sprite; } + SkinnerRuntimeEditorUtility.RecordObject(image); image.sprite = sprite; SkinnerUtility.ReloadGameObject(image); } diff --git a/Packages/uGUI-Skinner/Runtime/SkinParts/RawImageTexture.cs b/Packages/uGUI-Skinner/Runtime/SkinParts/RawImageTexture.cs index 427cdf6..a1bfa09 100644 --- a/Packages/uGUI-Skinner/Runtime/SkinParts/RawImageTexture.cs +++ b/Packages/uGUI-Skinner/Runtime/SkinParts/RawImageTexture.cs @@ -39,6 +39,7 @@ public void SetValues(SkinLogicProperty property) { texture2D = property.objectReferenceValues[Texture2DIndex] as Texture2D; } + SkinnerRuntimeEditorUtility.RecordObject(rawImage); rawImage.texture = texture2D; SkinnerUtility.ReloadGameObject(rawImage); } diff --git a/Packages/uGUI-Skinner/Runtime/SkinParts/ScriptableLogic.cs b/Packages/uGUI-Skinner/Runtime/SkinParts/ScriptableLogic.cs index dcfe14e..d4fa30d 100644 --- a/Packages/uGUI-Skinner/Runtime/SkinParts/ScriptableLogic.cs +++ b/Packages/uGUI-Skinner/Runtime/SkinParts/ScriptableLogic.cs @@ -46,6 +46,7 @@ public void SetValues(SkinLogicProperty property) // 自由に処理をかけるのでエラー回避を入れておく try { + SkinnerRuntimeEditorUtility.RecordObjects(ignoredLogicProperty.Value.objectReferenceValues); userLogic.SetValues(ignoredLogicProperty.Value); } // エラーが起こっても何もせず終わる diff --git a/Packages/uGUI-Skinner/Runtime/SkinnerRuntimeEditorUtility.cs b/Packages/uGUI-Skinner/Runtime/SkinnerRuntimeEditorUtility.cs index 66b07cc..98c67c9 100644 --- a/Packages/uGUI-Skinner/Runtime/SkinnerRuntimeEditorUtility.cs +++ b/Packages/uGUI-Skinner/Runtime/SkinnerRuntimeEditorUtility.cs @@ -1,4 +1,5 @@ using UnityEngine; +using System.Collections.Generic; #if UNITY_EDITOR using UnityEditor; #endif @@ -9,7 +10,7 @@ namespace Pspkurara.UI.Skinner /// /// ランタイム用asmdef上でエディタ関数を使うためのクラス /// - internal static class SkinnerRuntimeEditorUtility + public static class SkinnerRuntimeEditorUtility { /// @@ -19,11 +20,64 @@ internal static class SkinnerRuntimeEditorUtility [System.Diagnostics.Conditional("UNITY_EDITOR")] public static void RecordObject(Object @object) { + if (@object == null) return; #if UNITY_EDITOR Undo.RecordObject(@object, "SkinnerPartsEdit"); #endif } + /// + /// を呼び出す + /// + /// 履歴を記録する対象のオブジェクト群 + [System.Diagnostics.Conditional("UNITY_EDITOR")] + public static void RecordObjects(IEnumerable objects) + { + foreach (var @object in objects) + { + RecordObject(@object); + } + } + + /// + /// を呼び出す + /// 全ての子に対して適応する + /// + /// 履歴を記録する対象のオブジェクト + [System.Diagnostics.Conditional("UNITY_EDITOR")] + public static void DeepRecordObject(GameObject rootGameObject) + { + // ルートがなければ何もしない + if (rootGameObject == null) return; + + // 全てのコンポーネントのUndoを書き込む + foreach (var component in rootGameObject.GetComponentsInChildren(true)) + { + RecordObject(component); + } + + // 全てのtransformとgameObjectのUndoを書き込む + DeepRecordObjectWithTransformAndGameObject(rootGameObject.transform); + } + + /// + /// に対してを呼び出す + /// 全ての子に適応する + /// + /// 親オブジェクト + [System.Diagnostics.Conditional("UNITY_EDITOR")] + private static void DeepRecordObjectWithTransformAndGameObject(Transform transform) + { + if (transform == null) return; + RecordObject(transform); + RecordObject(transform.gameObject); + for (int i = 0; i < transform.childCount; i++) + { + var child = transform.GetChild(i); + DeepRecordObjectWithTransformAndGameObject(child); + } + } + } }