opt
This commit is contained in:
parent
6519b14020
commit
ab155946fb
344
Client/Assets/Bundles/UI/UICardWidget.prefab
Normal file
344
Client/Assets/Bundles/UI/UICardWidget.prefab
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &3529610083755649764
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 6054056368442846410}
|
||||||
|
- component: {fileID: 1594745885832791941}
|
||||||
|
- component: {fileID: 7369916918447278109}
|
||||||
|
- component: {fileID: 1744287959665422355}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: UICardWidget
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &6054056368442846410
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3529610083755649764}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 4201042986197880034}
|
||||||
|
- {fileID: 6299928650586651613}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 300, y: 500}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!223 &1594745885832791941
|
||||||
|
Canvas:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3529610083755649764}
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_RenderMode: 0
|
||||||
|
m_Camera: {fileID: 0}
|
||||||
|
m_PlaneDistance: 100
|
||||||
|
m_PixelPerfect: 0
|
||||||
|
m_ReceivesEvents: 1
|
||||||
|
m_OverrideSorting: 0
|
||||||
|
m_OverridePixelPerfect: 0
|
||||||
|
m_SortingBucketNormalizedSize: 0
|
||||||
|
m_VertexColorAlwaysGammaSpace: 1
|
||||||
|
m_AdditionalShaderChannelsFlag: 31
|
||||||
|
m_UpdateRectTransformForStandalone: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_TargetDisplay: 0
|
||||||
|
--- !u!114 &7369916918447278109
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3529610083755649764}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_IgnoreReversedGraphics: 1
|
||||||
|
m_BlockingObjects: 0
|
||||||
|
m_BlockingMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 55
|
||||||
|
--- !u!114 &1744287959665422355
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3529610083755649764}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: e9394045d7c436b418b7e8b879ebe7ca, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!1 &6335583502871219895
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 4201042986197880034}
|
||||||
|
- component: {fileID: 5601054129539157368}
|
||||||
|
- component: {fileID: 5487560666036449699}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: UXImage
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &4201042986197880034
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6335583502871219895}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 6054056368442846410}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 1, y: 1}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!222 &5601054129539157368
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6335583502871219895}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!114 &5487560666036449699
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6335583502871219895}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: af0993b503fa4dd1adf519458df05486, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 2100000, guid: 624af9784554f4047997278dfbb22e47, type: 2}
|
||||||
|
m_Color: {r: 1, g: 0.3537736, b: 0.3537736, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_Maskable: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_Sprite: {fileID: 0}
|
||||||
|
m_Type: 0
|
||||||
|
m_PreserveAspect: 0
|
||||||
|
m_FillCenter: 1
|
||||||
|
m_FillMethod: 4
|
||||||
|
m_FillAmount: 1
|
||||||
|
m_FillClockwise: 1
|
||||||
|
m_FillOrigin: 0
|
||||||
|
m_UseSpriteMesh: 0
|
||||||
|
m_PixelsPerUnitMultiplier: 1
|
||||||
|
m_ColorType: 0
|
||||||
|
m_GradientColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
key0: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
key1: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
key2: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
key3: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
key4: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
key5: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
key6: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
key7: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
ctime0: 0
|
||||||
|
ctime1: 65535
|
||||||
|
ctime2: 0
|
||||||
|
ctime3: 0
|
||||||
|
ctime4: 0
|
||||||
|
ctime5: 0
|
||||||
|
ctime6: 0
|
||||||
|
ctime7: 0
|
||||||
|
atime0: 0
|
||||||
|
atime1: 65535
|
||||||
|
atime2: 0
|
||||||
|
atime3: 0
|
||||||
|
atime4: 0
|
||||||
|
atime5: 0
|
||||||
|
atime6: 0
|
||||||
|
atime7: 0
|
||||||
|
m_Mode: 0
|
||||||
|
m_ColorSpace: -1
|
||||||
|
m_NumColorKeys: 2
|
||||||
|
m_NumAlphaKeys: 2
|
||||||
|
m_Direction: 0
|
||||||
|
m_OriginFlipMode: 0
|
||||||
|
m_FlipMode: 0
|
||||||
|
m_FlipWithCopy: 1
|
||||||
|
m_FlipEdgeHorizontal: 2
|
||||||
|
m_FlipEdgeVertical: 5
|
||||||
|
m_FlipFillCenter: 3
|
||||||
|
m_FlipDirection: 3
|
||||||
|
--- !u!1 &7794214711916059980
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 6299928650586651613}
|
||||||
|
- component: {fileID: 608087438234450738}
|
||||||
|
- component: {fileID: 2143352804330890108}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: UXTextMeshPro
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &6299928650586651613
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7794214711916059980}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 6054056368442846410}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 160, y: 30}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!222 &608087438234450738
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7794214711916059980}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!114 &2143352804330890108
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 7794214711916059980}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: bd17b8b605f2ba540bac156b5cf5ac77, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_Maskable: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_text: Cao NI Ma
|
||||||
|
m_isRightToLeft: 0
|
||||||
|
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
||||||
|
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
||||||
|
m_fontSharedMaterials: []
|
||||||
|
m_fontMaterial: {fileID: 0}
|
||||||
|
m_fontMaterials: []
|
||||||
|
m_fontColor32:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4278190080
|
||||||
|
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
m_enableVertexGradient: 0
|
||||||
|
m_colorMode: 3
|
||||||
|
m_fontColorGradient:
|
||||||
|
topLeft: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
topRight: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
bottomRight: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_fontColorGradientPreset: {fileID: 0}
|
||||||
|
m_spriteAsset: {fileID: 0}
|
||||||
|
m_tintAllSprites: 0
|
||||||
|
m_StyleSheet: {fileID: 0}
|
||||||
|
m_TextStyleHashCode: -1183493901
|
||||||
|
m_overrideHtmlColors: 0
|
||||||
|
m_faceColor:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4294967295
|
||||||
|
m_fontSize: 36
|
||||||
|
m_fontSizeBase: 36
|
||||||
|
m_fontWeight: 400
|
||||||
|
m_enableAutoSizing: 0
|
||||||
|
m_fontSizeMin: 18
|
||||||
|
m_fontSizeMax: 72
|
||||||
|
m_fontStyle: 0
|
||||||
|
m_HorizontalAlignment: 1
|
||||||
|
m_VerticalAlignment: 256
|
||||||
|
m_textAlignment: 65535
|
||||||
|
m_characterSpacing: 0
|
||||||
|
m_wordSpacing: 0
|
||||||
|
m_lineSpacing: 0
|
||||||
|
m_lineSpacingMax: 0
|
||||||
|
m_paragraphSpacing: 0
|
||||||
|
m_charWidthMaxAdj: 0
|
||||||
|
m_enableWordWrapping: 0
|
||||||
|
m_wordWrappingRatios: 0.4
|
||||||
|
m_overflowMode: 0
|
||||||
|
m_linkedTextComponent: {fileID: 0}
|
||||||
|
parentLinkedComponent: {fileID: 0}
|
||||||
|
m_enableKerning: 1
|
||||||
|
m_enableExtraPadding: 0
|
||||||
|
checkPaddingRequired: 0
|
||||||
|
m_isRichText: 1
|
||||||
|
m_parseCtrlCharacters: 1
|
||||||
|
m_isOrthographic: 1
|
||||||
|
m_isCullingEnabled: 0
|
||||||
|
m_horizontalMapping: 0
|
||||||
|
m_verticalMapping: 0
|
||||||
|
m_uvLineOffset: 0
|
||||||
|
m_geometrySortingOrder: 0
|
||||||
|
m_IsTextObjectScaleStatic: 0
|
||||||
|
m_VertexBufferAutoSizeReduction: 0
|
||||||
|
m_useMaxVisibleDescender: 1
|
||||||
|
m_pageToDisplay: 1
|
||||||
|
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_isUsingLegacyAnimationComponent: 0
|
||||||
|
m_isVolumetricText: 0
|
||||||
|
m_hasFontAssetChanged: 0
|
||||||
|
m_baseMaterial: {fileID: 0}
|
||||||
|
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_localizationID: 0
|
||||||
|
m_localizationKey:
|
||||||
7
Client/Assets/Bundles/UI/UICardWidget.prefab.meta
Normal file
7
Client/Assets/Bundles/UI/UICardWidget.prefab.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b76991d3fd07df84983b6da7daa589c8
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "SAOL1.Editor",
|
"name": "Game.Editor",
|
||||||
"rootNamespace": "SAOL1.Editor",
|
"rootNamespace": "Game.Editor",
|
||||||
"references": [
|
"references": [
|
||||||
"GUID:8d62da4aabd2a19419c7378d23ea5849",
|
"GUID:8d62da4aabd2a19419c7378d23ea5849",
|
||||||
"GUID:99a2a63c2a1143c4ba448165a98a5108",
|
"GUID:99a2a63c2a1143c4ba448165a98a5108",
|
||||||
8
Client/Assets/Plugins/OM.meta
Normal file
8
Client/Assets/Plugins/OM.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7d1e2719ed0804fc883125b180f9f3e4
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Assets/Plugins/OM/Animora.meta
Normal file
8
Client/Assets/Plugins/OM/Animora.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f14bd7cfdc23945d7940874e1cb37674
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0a8f52f23fc574fea87e42829776d16e
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 1.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 1.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dc364c8fed26c47bcb452322f48d6a1a
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
2771
Client/Assets/Plugins/OM/Animora/Demos/Demo 1/Demo1.unity
Normal file
2771
Client/Assets/Plugins/OM/Animora/Demos/Demo 1/Demo1.unity
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6147cd98612224312a9cf7b513ff594b
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 1/Demo1.unity
|
||||||
|
uploadId: 757363
|
||||||
BIN
Client/Assets/Plugins/OM/Animora/Demos/Demo 1/Panel.png
Normal file
BIN
Client/Assets/Plugins/OM/Animora/Demos/Demo 1/Panel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 975 KiB |
200
Client/Assets/Plugins/OM/Animora/Demos/Demo 1/Panel.png.meta
Normal file
200
Client/Assets/Plugins/OM/Animora/Demos/Demo 1/Panel.png.meta
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3539997c41c2642cfb143d9cb603e80a
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 13
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 0
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
flipGreenChannel: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMipmapLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 1
|
||||||
|
nPOTScale: 0
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 2
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 1
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 8
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
swizzle: 50462976
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Android
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites:
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: Panel_0
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 479
|
||||||
|
y: 36
|
||||||
|
width: 928
|
||||||
|
height: 858
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0.5, y: 0.5}
|
||||||
|
border: {x: 166, y: 321, z: 214, w: 305}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: b31633fa168b54d7383a731502b2f515
|
||||||
|
internalID: 138726369
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: Panel_1
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 36
|
||||||
|
y: 415
|
||||||
|
width: 361
|
||||||
|
height: 180
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0.5, y: 0.5}
|
||||||
|
border: {x: 53, y: 61, z: 63, w: 55}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: e7059006f7c9844198120d84d9f1a919
|
||||||
|
internalID: -477347263
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: Panel_2
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 39
|
||||||
|
y: 147
|
||||||
|
width: 362
|
||||||
|
height: 180
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0.5, y: 0.5}
|
||||||
|
border: {x: 87, y: 52, z: 74, w: 59}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: 2afeb4b26253f45369c2db0d51361e1d
|
||||||
|
internalID: 236642983
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable:
|
||||||
|
Panel_0: 138726369
|
||||||
|
Panel_1: -477347263
|
||||||
|
Panel_2: 236642983
|
||||||
|
mipmapLimitGroupName:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 1/Panel.png
|
||||||
|
uploadId: 757363
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 2.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 2.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8a2bdc87181b847a6a8e3a96bc29f3d0
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.0 MiB |
@ -0,0 +1,310 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: aad89fce901f142a0a91f7dcf21d7245
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 13
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 0
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
flipGreenChannel: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMipmapLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 1
|
||||||
|
nPOTScale: 0
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 2
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 1
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 8
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
swizzle: 50462976
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Android
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites:
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_0
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 58
|
||||||
|
y: 625
|
||||||
|
width: 456
|
||||||
|
height: 335
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 214, y: 152, z: 213, w: 154}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: 71236c29988044a9da449c95b5b5eea4
|
||||||
|
internalID: 1768004592
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_1
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 584
|
||||||
|
y: 767
|
||||||
|
width: 374
|
||||||
|
height: 151
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 168, y: 65, z: 160, w: 63}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: 310a7ad3a2556430e80a510d21131a56
|
||||||
|
internalID: -545848615
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_2
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 64
|
||||||
|
y: 270
|
||||||
|
width: 590
|
||||||
|
height: 330
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 281, y: 144, z: 280, w: 151}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: 125e8c5cf01c4446eb5ee94eb67c53a6
|
||||||
|
internalID: 1139401055
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_3
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 728
|
||||||
|
y: 506
|
||||||
|
width: 213
|
||||||
|
height: 215
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: 2ebedc4a768df4cc88288ffec2a386c6
|
||||||
|
internalID: -1489807343
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_4
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 696
|
||||||
|
y: 334
|
||||||
|
width: 263
|
||||||
|
height: 113
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: 67baa355bbf47468abec4ca8d292d161
|
||||||
|
internalID: -1373462062
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_5
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 91
|
||||||
|
y: 75
|
||||||
|
width: 163
|
||||||
|
height: 167
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: 7d8c5bb9f3bb54ae6993b7bf347504c9
|
||||||
|
internalID: 172213737
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_6
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 448
|
||||||
|
y: 65
|
||||||
|
width: 152
|
||||||
|
height: 157
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: ed517d5135fa44a499aeb9f8cda921f7
|
||||||
|
internalID: 935205556
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
- serializedVersion: 2
|
||||||
|
name: ChatGPT Image 1. Mai 2025, 16_15_44_7
|
||||||
|
rect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 729
|
||||||
|
y: 81
|
||||||
|
width: 205
|
||||||
|
height: 199
|
||||||
|
alignment: 0
|
||||||
|
pivot: {x: 0, y: 0}
|
||||||
|
border: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
tessellationDetail: 0
|
||||||
|
bones: []
|
||||||
|
spriteID: eec5908ddb7f04190a67f2fcef8c71b4
|
||||||
|
internalID: -766730691
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable:
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_0: 1768004592
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_1: -545848615
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_2: 1139401055
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_3: -1489807343
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_4: -1373462062
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_5: 172213737
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_6: 935205556
|
||||||
|
ChatGPT Image 1. Mai 2025, 16_15_44_7: -766730691
|
||||||
|
mipmapLimitGroupName:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 2/ChatGPT Image 1. Mai 2025, 16_15_44.png
|
||||||
|
uploadId: 757363
|
||||||
1380
Client/Assets/Plugins/OM/Animora/Demos/Demo 2/Demo 2.unity
Normal file
1380
Client/Assets/Plugins/OM/Animora/Demos/Demo 2/Demo 2.unity
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: eade964f4ada44bcc923ba598ee4cc75
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 2/Demo 2.unity
|
||||||
|
uploadId: 757363
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 3.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 3.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2bca89fbbf1544afe8a45f0c0190edb5
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
1024
Client/Assets/Plugins/OM/Animora/Demos/Demo 3/Button.prefab
Normal file
1024
Client/Assets/Plugins/OM/Animora/Demos/Demo 3/Button.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0bef195a5ddb84f0194b75dc9d3330ea
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 3/Button.prefab
|
||||||
|
uploadId: 757363
|
||||||
893
Client/Assets/Plugins/OM/Animora/Demos/Demo 3/Demo 3.unity
Normal file
893
Client/Assets/Plugins/OM/Animora/Demos/Demo 3/Demo 3.unity
Normal file
@ -0,0 +1,893 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!29 &1
|
||||||
|
OcclusionCullingSettings:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 2
|
||||||
|
m_OcclusionBakeSettings:
|
||||||
|
smallestOccluder: 5
|
||||||
|
smallestHole: 0.25
|
||||||
|
backfaceThreshold: 100
|
||||||
|
m_SceneGUID: 00000000000000000000000000000000
|
||||||
|
m_OcclusionCullingData: {fileID: 0}
|
||||||
|
--- !u!104 &2
|
||||||
|
RenderSettings:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 9
|
||||||
|
m_Fog: 0
|
||||||
|
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||||
|
m_FogMode: 3
|
||||||
|
m_FogDensity: 0.01
|
||||||
|
m_LinearFogStart: 0
|
||||||
|
m_LinearFogEnd: 300
|
||||||
|
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||||
|
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||||
|
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||||
|
m_AmbientIntensity: 1
|
||||||
|
m_AmbientMode: 3
|
||||||
|
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||||
|
m_SkyboxMaterial: {fileID: 0}
|
||||||
|
m_HaloStrength: 0.5
|
||||||
|
m_FlareStrength: 1
|
||||||
|
m_FlareFadeSpeed: 3
|
||||||
|
m_HaloTexture: {fileID: 0}
|
||||||
|
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
m_DefaultReflectionMode: 0
|
||||||
|
m_DefaultReflectionResolution: 128
|
||||||
|
m_ReflectionBounces: 1
|
||||||
|
m_ReflectionIntensity: 1
|
||||||
|
m_CustomReflection: {fileID: 0}
|
||||||
|
m_Sun: {fileID: 0}
|
||||||
|
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
m_UseRadianceAmbientProbe: 0
|
||||||
|
--- !u!157 &3
|
||||||
|
LightmapSettings:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 12
|
||||||
|
m_GIWorkflowMode: 1
|
||||||
|
m_GISettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_BounceScale: 1
|
||||||
|
m_IndirectOutputScale: 1
|
||||||
|
m_AlbedoBoost: 1
|
||||||
|
m_EnvironmentLightingMode: 0
|
||||||
|
m_EnableBakedLightmaps: 0
|
||||||
|
m_EnableRealtimeLightmaps: 0
|
||||||
|
m_LightmapEditorSettings:
|
||||||
|
serializedVersion: 12
|
||||||
|
m_Resolution: 2
|
||||||
|
m_BakeResolution: 40
|
||||||
|
m_AtlasSize: 1024
|
||||||
|
m_AO: 0
|
||||||
|
m_AOMaxDistance: 1
|
||||||
|
m_CompAOExponent: 1
|
||||||
|
m_CompAOExponentDirect: 0
|
||||||
|
m_ExtractAmbientOcclusion: 0
|
||||||
|
m_Padding: 2
|
||||||
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_LightmapsBakeMode: 1
|
||||||
|
m_TextureCompression: 1
|
||||||
|
m_FinalGather: 0
|
||||||
|
m_FinalGatherFiltering: 1
|
||||||
|
m_FinalGatherRayCount: 256
|
||||||
|
m_ReflectionCompression: 2
|
||||||
|
m_MixedBakeMode: 2
|
||||||
|
m_BakeBackend: 1
|
||||||
|
m_PVRSampling: 1
|
||||||
|
m_PVRDirectSampleCount: 32
|
||||||
|
m_PVRSampleCount: 512
|
||||||
|
m_PVRBounces: 2
|
||||||
|
m_PVREnvironmentSampleCount: 256
|
||||||
|
m_PVREnvironmentReferencePointCount: 2048
|
||||||
|
m_PVRFilteringMode: 1
|
||||||
|
m_PVRDenoiserTypeDirect: 1
|
||||||
|
m_PVRDenoiserTypeIndirect: 1
|
||||||
|
m_PVRDenoiserTypeAO: 1
|
||||||
|
m_PVRFilterTypeDirect: 0
|
||||||
|
m_PVRFilterTypeIndirect: 0
|
||||||
|
m_PVRFilterTypeAO: 0
|
||||||
|
m_PVREnvironmentMIS: 1
|
||||||
|
m_PVRCulling: 1
|
||||||
|
m_PVRFilteringGaussRadiusDirect: 1
|
||||||
|
m_PVRFilteringGaussRadiusIndirect: 5
|
||||||
|
m_PVRFilteringGaussRadiusAO: 2
|
||||||
|
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||||
|
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||||
|
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||||
|
m_ExportTrainingData: 0
|
||||||
|
m_TrainingDataDestination: TrainingData
|
||||||
|
m_LightProbeSampleCountMultiplier: 4
|
||||||
|
m_LightingDataAsset: {fileID: 0}
|
||||||
|
m_LightingSettings: {fileID: 0}
|
||||||
|
--- !u!196 &4
|
||||||
|
NavMeshSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_BuildSettings:
|
||||||
|
serializedVersion: 3
|
||||||
|
agentTypeID: 0
|
||||||
|
agentRadius: 0.5
|
||||||
|
agentHeight: 2
|
||||||
|
agentSlope: 45
|
||||||
|
agentClimb: 0.4
|
||||||
|
ledgeDropHeight: 0
|
||||||
|
maxJumpAcrossDistance: 0
|
||||||
|
minRegionArea: 2
|
||||||
|
manualCellSize: 0
|
||||||
|
cellSize: 0.16666667
|
||||||
|
manualTileSize: 0
|
||||||
|
tileSize: 256
|
||||||
|
buildHeightMesh: 0
|
||||||
|
maxJobWorkers: 0
|
||||||
|
preserveTilesOutsideBounds: 0
|
||||||
|
debug:
|
||||||
|
m_Flags: 0
|
||||||
|
m_NavMeshData: {fileID: 0}
|
||||||
|
--- !u!1 &470550573
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 470550574}
|
||||||
|
- component: {fileID: 470550576}
|
||||||
|
- component: {fileID: 470550575}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: BG
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &470550574
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 470550573}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 1281803288}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 1, y: 1}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &470550575
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 470550573}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 0.6792453, g: 0.6792453, b: 0.6792453, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_Maskable: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_Sprite: {fileID: 21300000, guid: 63c6328b12b03484ea7d5d85a65f8717, type: 3}
|
||||||
|
m_Type: 0
|
||||||
|
m_PreserveAspect: 0
|
||||||
|
m_FillCenter: 1
|
||||||
|
m_FillMethod: 4
|
||||||
|
m_FillAmount: 1
|
||||||
|
m_FillClockwise: 1
|
||||||
|
m_FillOrigin: 0
|
||||||
|
m_UseSpriteMesh: 0
|
||||||
|
m_PixelsPerUnitMultiplier: 1
|
||||||
|
--- !u!222 &470550576
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 470550573}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!1001 &506175184
|
||||||
|
PrefabInstance:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TransformParent: {fileID: 908922432}
|
||||||
|
m_Modifications:
|
||||||
|
- target: {fileID: 4185050427314471294, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: Button (2)
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Pivot.x
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Pivot.y
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.x
|
||||||
|
value: 374
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.y
|
||||||
|
value: 151
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.w
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5735013091141302440, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_text
|
||||||
|
value: About
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_RemovedGameObjects: []
|
||||||
|
m_AddedGameObjects: []
|
||||||
|
m_AddedComponents: []
|
||||||
|
m_SourcePrefab: {fileID: 100100000, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
--- !u!224 &506175185 stripped
|
||||||
|
RectTransform:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 506175184}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
--- !u!224 &886524886 stripped
|
||||||
|
RectTransform:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 8295416170442591044}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
--- !u!1 &908922431
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 908922432}
|
||||||
|
- component: {fileID: 908922435}
|
||||||
|
- component: {fileID: 908922434}
|
||||||
|
- component: {fileID: 908922433}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: Image
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &908922432
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 908922431}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 886524886}
|
||||||
|
- {fileID: 1634879089}
|
||||||
|
- {fileID: 506175185}
|
||||||
|
m_Father: {fileID: 1281803288}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
|
m_AnchoredPosition: {x: 117, y: 96}
|
||||||
|
m_SizeDelta: {x: 533.6897, y: 561.2256}
|
||||||
|
m_Pivot: {x: 0, y: 0}
|
||||||
|
--- !u!114 &908922433
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 908922431}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Padding:
|
||||||
|
m_Left: 0
|
||||||
|
m_Right: 0
|
||||||
|
m_Top: 0
|
||||||
|
m_Bottom: 0
|
||||||
|
m_ChildAlignment: 1
|
||||||
|
m_Spacing: 25.2
|
||||||
|
m_ChildForceExpandWidth: 1
|
||||||
|
m_ChildForceExpandHeight: 0
|
||||||
|
m_ChildControlWidth: 0
|
||||||
|
m_ChildControlHeight: 0
|
||||||
|
m_ChildScaleWidth: 0
|
||||||
|
m_ChildScaleHeight: 0
|
||||||
|
m_ReverseArrangement: 0
|
||||||
|
--- !u!114 &908922434
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 908922431}
|
||||||
|
m_Enabled: 0
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_Maskable: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_Sprite: {fileID: 0}
|
||||||
|
m_Type: 0
|
||||||
|
m_PreserveAspect: 0
|
||||||
|
m_FillCenter: 1
|
||||||
|
m_FillMethod: 4
|
||||||
|
m_FillAmount: 1
|
||||||
|
m_FillClockwise: 1
|
||||||
|
m_FillOrigin: 0
|
||||||
|
m_UseSpriteMesh: 0
|
||||||
|
m_PixelsPerUnitMultiplier: 1
|
||||||
|
--- !u!222 &908922435
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 908922431}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!1 &933916542
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 933916545}
|
||||||
|
- component: {fileID: 933916544}
|
||||||
|
- component: {fileID: 933916543}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: EventSystem
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &933916543
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 933916542}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_SendPointerHoverToParent: 1
|
||||||
|
m_HorizontalAxis: Horizontal
|
||||||
|
m_VerticalAxis: Vertical
|
||||||
|
m_SubmitButton: Submit
|
||||||
|
m_CancelButton: Cancel
|
||||||
|
m_InputActionsPerSecond: 10
|
||||||
|
m_RepeatDelay: 0.5
|
||||||
|
m_ForceModuleActive: 0
|
||||||
|
--- !u!114 &933916544
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 933916542}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_FirstSelected: {fileID: 0}
|
||||||
|
m_sendNavigationEvents: 1
|
||||||
|
m_DragThreshold: 10
|
||||||
|
--- !u!4 &933916545
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 933916542}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1 &1281803284
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1281803288}
|
||||||
|
- component: {fileID: 1281803287}
|
||||||
|
- component: {fileID: 1281803286}
|
||||||
|
- component: {fileID: 1281803285}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: Canvas
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &1281803285
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1281803284}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_IgnoreReversedGraphics: 1
|
||||||
|
m_BlockingObjects: 0
|
||||||
|
m_BlockingMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 4294967295
|
||||||
|
--- !u!114 &1281803286
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1281803284}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_UiScaleMode: 0
|
||||||
|
m_ReferencePixelsPerUnit: 100
|
||||||
|
m_ScaleFactor: 1
|
||||||
|
m_ReferenceResolution: {x: 800, y: 600}
|
||||||
|
m_ScreenMatchMode: 0
|
||||||
|
m_MatchWidthOrHeight: 0
|
||||||
|
m_PhysicalUnit: 3
|
||||||
|
m_FallbackScreenDPI: 96
|
||||||
|
m_DefaultSpriteDPI: 96
|
||||||
|
m_DynamicPixelsPerUnit: 1
|
||||||
|
m_PresetInfoIsWorld: 0
|
||||||
|
--- !u!223 &1281803287
|
||||||
|
Canvas:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1281803284}
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_RenderMode: 0
|
||||||
|
m_Camera: {fileID: 0}
|
||||||
|
m_PlaneDistance: 100
|
||||||
|
m_PixelPerfect: 0
|
||||||
|
m_ReceivesEvents: 1
|
||||||
|
m_OverrideSorting: 0
|
||||||
|
m_OverridePixelPerfect: 0
|
||||||
|
m_SortingBucketNormalizedSize: 0
|
||||||
|
m_VertexColorAlwaysGammaSpace: 0
|
||||||
|
m_AdditionalShaderChannelsFlag: 25
|
||||||
|
m_UpdateRectTransformForStandalone: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_TargetDisplay: 0
|
||||||
|
--- !u!224 &1281803288
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1281803284}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 0, y: 0, z: 0}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 470550574}
|
||||||
|
- {fileID: 908922432}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0, y: 0}
|
||||||
|
--- !u!1001 &1634879088
|
||||||
|
PrefabInstance:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TransformParent: {fileID: 908922432}
|
||||||
|
m_Modifications:
|
||||||
|
- target: {fileID: 4185050427314471294, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: Button (1)
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Pivot.x
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Pivot.y
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.x
|
||||||
|
value: 374
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.y
|
||||||
|
value: 151
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.w
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 5735013091141302440, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_text
|
||||||
|
value: Settings
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_RemovedGameObjects: []
|
||||||
|
m_AddedGameObjects: []
|
||||||
|
m_AddedComponents: []
|
||||||
|
m_SourcePrefab: {fileID: 100100000, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
--- !u!224 &1634879089 stripped
|
||||||
|
RectTransform:
|
||||||
|
m_CorrespondingSourceObject: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
m_PrefabInstance: {fileID: 1634879088}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
--- !u!1 &1980728272
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1980728275}
|
||||||
|
- component: {fileID: 1980728274}
|
||||||
|
- component: {fileID: 1980728273}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Main Camera
|
||||||
|
m_TagString: MainCamera
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!81 &1980728273
|
||||||
|
AudioListener:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1980728272}
|
||||||
|
m_Enabled: 1
|
||||||
|
--- !u!20 &1980728274
|
||||||
|
Camera:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1980728272}
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 2
|
||||||
|
m_ClearFlags: 1
|
||||||
|
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||||
|
m_projectionMatrixMode: 1
|
||||||
|
m_GateFitMode: 2
|
||||||
|
m_FOVAxisMode: 0
|
||||||
|
m_Iso: 200
|
||||||
|
m_ShutterSpeed: 0.005
|
||||||
|
m_Aperture: 16
|
||||||
|
m_FocusDistance: 10
|
||||||
|
m_FocalLength: 50
|
||||||
|
m_BladeCount: 5
|
||||||
|
m_Curvature: {x: 2, y: 11}
|
||||||
|
m_BarrelClipping: 0.25
|
||||||
|
m_Anamorphism: 0
|
||||||
|
m_SensorSize: {x: 36, y: 24}
|
||||||
|
m_LensShift: {x: 0, y: 0}
|
||||||
|
m_NormalizedViewPortRect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 0
|
||||||
|
y: 0
|
||||||
|
width: 1
|
||||||
|
height: 1
|
||||||
|
near clip plane: 0.3
|
||||||
|
far clip plane: 1000
|
||||||
|
field of view: 60
|
||||||
|
orthographic: 1
|
||||||
|
orthographic size: 5
|
||||||
|
m_Depth: -1
|
||||||
|
m_CullingMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 4294967295
|
||||||
|
m_RenderingPath: -1
|
||||||
|
m_TargetTexture: {fileID: 0}
|
||||||
|
m_TargetDisplay: 0
|
||||||
|
m_TargetEye: 3
|
||||||
|
m_HDR: 1
|
||||||
|
m_AllowMSAA: 1
|
||||||
|
m_AllowDynamicResolution: 0
|
||||||
|
m_ForceIntoRT: 0
|
||||||
|
m_OcclusionCulling: 1
|
||||||
|
m_StereoConvergence: 10
|
||||||
|
m_StereoSeparation: 0.022
|
||||||
|
--- !u!4 &1980728275
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1980728272}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: -10}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1001 &8295416170442591044
|
||||||
|
PrefabInstance:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Modification:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_TransformParent: {fileID: 908922432}
|
||||||
|
m_Modifications:
|
||||||
|
- target: {fileID: 1255829159819132473, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: selectedClipIndex
|
||||||
|
value: -1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4185050427314471294, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Name
|
||||||
|
value: Button
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Pivot.x
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_Pivot.y
|
||||||
|
value: 0.5
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMax.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchorMin.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.x
|
||||||
|
value: 374
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_SizeDelta.y
|
||||||
|
value: 151
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalPosition.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.w
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalRotation.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_AnchoredPosition.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.x
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.y
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 4418222379588032541, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
propertyPath: m_LocalEulerAnglesHint.z
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
m_RemovedComponents: []
|
||||||
|
m_RemovedGameObjects: []
|
||||||
|
m_AddedGameObjects: []
|
||||||
|
m_AddedComponents: []
|
||||||
|
m_SourcePrefab: {fileID: 100100000, guid: 0bef195a5ddb84f0194b75dc9d3330ea, type: 3}
|
||||||
|
--- !u!1660057539 &9223372036854775807
|
||||||
|
SceneRoots:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_Roots:
|
||||||
|
- {fileID: 1980728275}
|
||||||
|
- {fileID: 1281803288}
|
||||||
|
- {fileID: 933916545}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8d3936dbf396b4879801a59fae87c54f
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 3/Demo 3.unity
|
||||||
|
uploadId: 757363
|
||||||
38
Client/Assets/Plugins/OM/Animora/Demos/Demo 3/Demo3Button.cs
Normal file
38
Client/Assets/Plugins/OM/Animora/Demos/Demo 3/Demo3Button.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.EventSystems;
|
||||||
|
|
||||||
|
namespace OM.Animora.Demos
|
||||||
|
{
|
||||||
|
public class Demo3Button : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler
|
||||||
|
{
|
||||||
|
[SerializeField] private AnimoraPlayer hoverAnimation;
|
||||||
|
[SerializeField] private AnimoraPlayer clickAnimation;
|
||||||
|
[SerializeField] private AnimoraPlayer releaseAnimation;
|
||||||
|
|
||||||
|
|
||||||
|
public void OnPointerEnter(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
clickAnimation?.StopAnimation();
|
||||||
|
releaseAnimation?.StopAnimation();
|
||||||
|
|
||||||
|
hoverAnimation?.PlayAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPointerExit(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
hoverAnimation?.StopAnimation();
|
||||||
|
clickAnimation?.StopAnimation();
|
||||||
|
|
||||||
|
releaseAnimation?.PlayAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPointerClick(PointerEventData eventData)
|
||||||
|
{
|
||||||
|
hoverAnimation?.StopAnimation();
|
||||||
|
releaseAnimation?.StopAnimation();
|
||||||
|
|
||||||
|
clickAnimation?.PlayAnimation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b8919e7027aa842d2b0f4d6c525a9d18
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 3/Demo3Button.cs
|
||||||
|
uploadId: 757363
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 4.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 4.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c18f647a5a7164039b6952497c059fe1
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
2457
Client/Assets/Plugins/OM/Animora/Demos/Demo 4/Demo 4.unity
Normal file
2457
Client/Assets/Plugins/OM/Animora/Demos/Demo 4/Demo 4.unity
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a15c047131aa14de782545df6d44666d
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 4/Demo 4.unity
|
||||||
|
uploadId: 757363
|
||||||
33
Client/Assets/Plugins/OM/Animora/Demos/Demo 4/Demo4.cs
Normal file
33
Client/Assets/Plugins/OM/Animora/Demos/Demo 4/Demo4.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace OM.Animora.Demos
|
||||||
|
{
|
||||||
|
public class Demo4 : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private AnimoraPlayer openContainer1;
|
||||||
|
[SerializeField] private AnimoraPlayer openContainer2;
|
||||||
|
[SerializeField] private AnimoraPlayer openContainer3;
|
||||||
|
|
||||||
|
public void OpenContainer1()
|
||||||
|
{
|
||||||
|
openContainer2.StopAnimation();
|
||||||
|
openContainer3.StopAnimation();
|
||||||
|
openContainer1.PlayAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenContainer2()
|
||||||
|
{
|
||||||
|
openContainer1.StopAnimation();
|
||||||
|
openContainer3.StopAnimation();
|
||||||
|
openContainer2.PlayAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OpenContainer3()
|
||||||
|
{
|
||||||
|
openContainer1.StopAnimation();
|
||||||
|
openContainer2.StopAnimation();
|
||||||
|
openContainer3.PlayAnimation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
Client/Assets/Plugins/OM/Animora/Demos/Demo 4/Demo4.cs.meta
Normal file
18
Client/Assets/Plugins/OM/Animora/Demos/Demo 4/Demo4.cs.meta
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7a380c592114f4707b1de450ab046598
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 4/Demo4.cs
|
||||||
|
uploadId: 757363
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 5.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 5.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e01839547d6cf4670ab8f7ebff1eed13
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
1800
Client/Assets/Plugins/OM/Animora/Demos/Demo 5/Demo 5.unity
Normal file
1800
Client/Assets/Plugins/OM/Animora/Demos/Demo 5/Demo 5.unity
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 397488fc3d02649ea9dfdd7d0b7a9e50
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 5/Demo 5.unity
|
||||||
|
uploadId: 757363
|
||||||
52
Client/Assets/Plugins/OM/Animora/Demos/Demo 5/Demo5.cs
Normal file
52
Client/Assets/Plugins/OM/Animora/Demos/Demo 5/Demo5.cs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
using System;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEngine;
|
||||||
|
#if Animora_TMP
|
||||||
|
using TMPro;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace OM.Animora.Demos
|
||||||
|
{
|
||||||
|
public class Demo5 : MonoBehaviour
|
||||||
|
{
|
||||||
|
#if Animora_TMP
|
||||||
|
[SerializeField] private TMP_Text scoreText;
|
||||||
|
#endif
|
||||||
|
[SerializeField] private AnimoraPlayer animationPlayer;
|
||||||
|
[SerializeField] private AnimoraPlayer completeAnimation;
|
||||||
|
[SerializeField] private int maxScore = 10;
|
||||||
|
|
||||||
|
private int _score;
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
_score = 0;
|
||||||
|
UpdateScore();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddScore()
|
||||||
|
{
|
||||||
|
if (_score >= maxScore) return;
|
||||||
|
|
||||||
|
_score++;
|
||||||
|
UpdateScore();
|
||||||
|
|
||||||
|
if (_score >= maxScore)
|
||||||
|
{
|
||||||
|
animationPlayer?.StopAnimation();
|
||||||
|
completeAnimation?.PlayAnimation();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
animationPlayer?.PlayAnimation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateScore()
|
||||||
|
{
|
||||||
|
#if Animora_TMP
|
||||||
|
scoreText.text = _score.ToString() + "/" + maxScore;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
Client/Assets/Plugins/OM/Animora/Demos/Demo 5/Demo5.cs.meta
Normal file
18
Client/Assets/Plugins/OM/Animora/Demos/Demo 5/Demo5.cs.meta
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 52fc38d3947af45749de47a48f7070f2
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 5/Demo5.cs
|
||||||
|
uploadId: 757363
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 6.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos/Demo 6.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 822ba7df12c1e480e8977ce4c4f55f14
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
1836
Client/Assets/Plugins/OM/Animora/Demos/Demo 6/Demo 6.unity
Normal file
1836
Client/Assets/Plugins/OM/Animora/Demos/Demo 6/Demo 6.unity
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: df1d1202c74274c878c791b8089ad9a9
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 6/Demo 6.unity
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace OM.Animora.Demos
|
||||||
|
{
|
||||||
|
public class Demo6Switcher : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private bool startValue = true;
|
||||||
|
[SerializeField] private AnimoraPlayer animationOn;
|
||||||
|
[SerializeField] private AnimoraPlayer animationOff;
|
||||||
|
|
||||||
|
private bool _isOn = true;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
_isOn = startValue;
|
||||||
|
Animate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Toggle()
|
||||||
|
{
|
||||||
|
_isOn = !_isOn;
|
||||||
|
|
||||||
|
Animate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Animate()
|
||||||
|
{
|
||||||
|
if (_isOn)
|
||||||
|
{
|
||||||
|
animationOff?.StopAnimation();
|
||||||
|
animationOn?.PlayAnimation();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
animationOn?.StopAnimation();
|
||||||
|
animationOff?.PlayAnimation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 006708d33bd2e45c085dcb6a28c2b724
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 6/Demo6Switcher.cs
|
||||||
|
uploadId: 757363
|
||||||
1332
Client/Assets/Plugins/OM/Animora/Demos/Demo 6/Switcher.prefab
Normal file
1332
Client/Assets/Plugins/OM/Animora/Demos/Demo 6/Switcher.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b7bf3943f9f4f4915a8a54a9248aa8e5
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Demo 6/Switcher.prefab
|
||||||
|
uploadId: 757363
|
||||||
8
Client/Assets/Plugins/OM/Animora/Demos/Shared.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Demos/Shared.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c25098f671c0d4694b6fe2ae7ae16555
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8090
Client/Assets/Plugins/OM/Animora/Demos/Shared/Animora Text.asset
Normal file
8090
Client/Assets/Plugins/OM/Animora/Demos/Shared/Animora Text.asset
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,15 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 76b4f71253d5941b7b1efd7d351ca41d
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Shared/Animora Text.asset
|
||||||
|
uploadId: 757363
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.8 MiB |
@ -0,0 +1,134 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 63c6328b12b03484ea7d5d85a65f8717
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 13
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 0
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
flipGreenChannel: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMipmapLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 1
|
||||||
|
nPOTScale: 0
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 1
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 1
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 8
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
swizzle: 50462976
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Android
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
mipmapLimitGroupName:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Demos/Shared/ChatGPT Image 1. Mai 2025, 16_32_44.png
|
||||||
|
uploadId: 757363
|
||||||
BIN
Client/Assets/Plugins/OM/Animora/Documentation.pdf
Normal file
BIN
Client/Assets/Plugins/OM/Animora/Documentation.pdf
Normal file
Binary file not shown.
14
Client/Assets/Plugins/OM/Animora/Documentation.pdf.meta
Normal file
14
Client/Assets/Plugins/OM/Animora/Documentation.pdf.meta
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 25001982c0f014c9fa490995f57ac09f
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Documentation.pdf
|
||||||
|
uploadId: 757363
|
||||||
8
Client/Assets/Plugins/OM/Animora/Editor.meta
Normal file
8
Client/Assets/Plugins/OM/Animora/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a5775f8e89af34cf09174f1a73585cd0
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
3
Client/Assets/Plugins/OM/Animora/Editor/Actions.meta
Normal file
3
Client/Assets/Plugins/OM/Animora/Editor/Actions.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8a5007aef86543faa663469a785163d1
|
||||||
|
timeCreated: 1743100420
|
||||||
@ -0,0 +1,95 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom property drawer for <see cref="AnimoraAction"/> that dynamically renders all child properties
|
||||||
|
/// using UI Toolkit, with optional filtering and change handling.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraAction), true)]
|
||||||
|
public class AnimoraActionDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Cached dictionary of property fields by name for easy access and update handling.
|
||||||
|
/// </summary>
|
||||||
|
protected readonly Dictionary<string, PropertyField> PropertyFields = new Dictionary<string, PropertyField>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the UI layout for the property using VisualElements.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized property being drawn.</param>
|
||||||
|
/// <returns>A <see cref="VisualElement"/> containing the entire property UI.</returns>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
PropertyFields.Clear();
|
||||||
|
|
||||||
|
var root = new VisualElement();
|
||||||
|
|
||||||
|
foreach (var childProperty in property.GetAllProperties())
|
||||||
|
{
|
||||||
|
DrawProperty(childProperty.Copy(), root);
|
||||||
|
}
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Draws an individual child property if allowed by <see cref="CanDrawProperty"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The property to draw.</param>
|
||||||
|
/// <param name="parent">The parent element to add the field to.</param>
|
||||||
|
protected virtual void DrawProperty(SerializedProperty property, VisualElement parent)
|
||||||
|
{
|
||||||
|
if (!CanDrawProperty(property)) return;
|
||||||
|
|
||||||
|
var propertyField = new PropertyField(property);
|
||||||
|
propertyField.Bind(property.serializedObject);
|
||||||
|
parent.Add(propertyField);
|
||||||
|
|
||||||
|
PropertyFields.Add(property.name, propertyField);
|
||||||
|
|
||||||
|
propertyField.RegisterValueChangeCallback(e =>
|
||||||
|
{
|
||||||
|
OnAnyPropertyChanged(property.name, propertyField);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines whether a property should be drawn.
|
||||||
|
/// Skips properties marked with <see cref="OM_HideInInspector"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The property to evaluate.</param>
|
||||||
|
/// <returns>True if the property should be drawn; otherwise, false.</returns>
|
||||||
|
protected virtual bool CanDrawProperty(SerializedProperty property)
|
||||||
|
{
|
||||||
|
var hideInInspector = property.GetAttribute<OM_HideInInspector>(true);
|
||||||
|
return hideInInspector == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called whenever any property field changes.
|
||||||
|
/// Can be overridden to implement custom update behavior.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propertyName">The name of the changed property.</param>
|
||||||
|
/// <param name="propertyField">The field instance that changed.</param>
|
||||||
|
protected virtual void OnAnyPropertyChanged(string propertyName, PropertyField propertyField)
|
||||||
|
{
|
||||||
|
// Override in subclass to react to property changes
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a drawn <see cref="PropertyField"/> by its property name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propertyName">The name of the property field.</param>
|
||||||
|
/// <returns>The corresponding <see cref="PropertyField"/>, or null if not found.</returns>
|
||||||
|
protected PropertyField GetPropertyField(string propertyName)
|
||||||
|
{
|
||||||
|
return PropertyFields.GetValueOrDefault(propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 71e92e73414745a881d1efee324fbba4
|
||||||
|
timeCreated: 1743100576
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Actions/AnimoraActionDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A custom <see cref="VisualElement"/> representing a drop area for adding actions to an <see cref="AnimoraActionGroup"/>.
|
||||||
|
/// Supports context menu, keyboard shortcuts, and a "+" button for interaction.
|
||||||
|
/// </summary>
|
||||||
|
public class AnimoraActionDropArea : VisualElement
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The associated <see cref="AnimoraActionGroup"/> this drop area modifies.
|
||||||
|
/// </summary>
|
||||||
|
public readonly AnimoraActionGroup ActionGroup;
|
||||||
|
|
||||||
|
private readonly AnimoraActionManagerDrawer _drawer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="AnimoraActionDropArea"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="actionGroup">The component group this drop area belongs to.</param>
|
||||||
|
/// <param name="drawer">Reference to the parent drawer for invoking popups.</param>
|
||||||
|
public AnimoraActionDropArea(AnimoraActionGroup actionGroup, AnimoraActionManagerDrawer drawer)
|
||||||
|
{
|
||||||
|
ActionGroup = actionGroup;
|
||||||
|
_drawer = drawer;
|
||||||
|
|
||||||
|
this.AddToClassList("drop-area");
|
||||||
|
|
||||||
|
// Right-click context menu
|
||||||
|
this.RegisterCallback<ContextClickEvent>(e =>
|
||||||
|
{
|
||||||
|
var menu = new GenericMenu();
|
||||||
|
menu.AddItem(new GUIContent("Add Action"), false, () => {
|
||||||
|
drawer.ShowSearchPopup(actionGroup, this);
|
||||||
|
});
|
||||||
|
menu.ShowAsContext();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Space key shortcut
|
||||||
|
this.RegisterCallback<KeyDownEvent>(e =>
|
||||||
|
{
|
||||||
|
if (e.keyCode == KeyCode.Space)
|
||||||
|
{
|
||||||
|
drawer.ShowSearchPopup(actionGroup, this);
|
||||||
|
e.StopPropagation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// "+" button
|
||||||
|
var addButton = new Button(() =>
|
||||||
|
{
|
||||||
|
drawer.ShowSearchPopup(actionGroup, this);
|
||||||
|
})
|
||||||
|
{
|
||||||
|
text = "+"
|
||||||
|
};
|
||||||
|
addButton.AddToClassList("drop-area-add-button");
|
||||||
|
Add(addButton);
|
||||||
|
|
||||||
|
focusable = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 42d870894bc484a6abbc0224a357ecb4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Actions/AnimoraActionDropArea.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// UI element that renders a header for an <see cref="AnimoraActionDropArea"/>,
|
||||||
|
/// displaying the component group's name with decorative lines.
|
||||||
|
/// </summary>
|
||||||
|
public class AnimoraActionDropAreaHeader : VisualElement
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="AnimoraActionDropAreaHeader"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="actionGroup">The component group whose name will be displayed in the header.</param>
|
||||||
|
public AnimoraActionDropAreaHeader(AnimoraActionGroup actionGroup)
|
||||||
|
{
|
||||||
|
this.SetPickingMode(PickingMode.Ignore);
|
||||||
|
this.AddToClassList("drop-area-header");
|
||||||
|
|
||||||
|
var line = new VisualElement().SetName("line");
|
||||||
|
line.AddClassNames("drop-area-header-line");
|
||||||
|
Add(line);
|
||||||
|
|
||||||
|
var label = new Label(SplitCamelCase(actionGroup.ToString()));
|
||||||
|
label.SetName("label");
|
||||||
|
Add(label);
|
||||||
|
|
||||||
|
var line2 = new VisualElement().SetName("line");
|
||||||
|
line2.AddClassNames("drop-area-header-line");
|
||||||
|
Add(line2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Splits a camelCase or PascalCase string into words separated by spaces.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">The camelCase or PascalCase string.</param>
|
||||||
|
/// <returns>A human-readable string with spaces between words.</returns>
|
||||||
|
public static string SplitCamelCase(string input)
|
||||||
|
{
|
||||||
|
return Regex.Replace(input, "(?<!^)([A-Z])", " $1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a37c3784ab2ae4afd8b01951e1b507af
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Actions/AnimoraActionDropAreaHeader.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,268 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using OM.Editor;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a UI element for displaying and interacting with a single <see cref="AnimoraAction"/>.
|
||||||
|
/// Supports drag-and-drop, renaming, context menu actions, and reorderable layout.
|
||||||
|
/// </summary>
|
||||||
|
public class AnimoraActionElement : VisualElement
|
||||||
|
{
|
||||||
|
public AnimoraPlayer Player { get; private set; }
|
||||||
|
public AnimoraAction Action { get; }
|
||||||
|
public AnimoraActionsManager ActionsManager { get; }
|
||||||
|
public AnimoraActionManagerDrawer ActionManagerDrawer { get; }
|
||||||
|
public SerializedProperty Property { get; }
|
||||||
|
|
||||||
|
private readonly OM_FoldoutGroup _foldoutGroup;
|
||||||
|
private readonly VisualElement _draggingArea;
|
||||||
|
private Vector2 _startDragPosition;
|
||||||
|
private AnimoraActionDropArea _currentDropArea;
|
||||||
|
private readonly AnimoraClip _clip;
|
||||||
|
private readonly TextField _actionNameTextField;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the component element with all required data and UI setup.
|
||||||
|
/// </summary>
|
||||||
|
public AnimoraActionElement(
|
||||||
|
AnimoraAction action,
|
||||||
|
AnimoraActionsManager actionsManager,
|
||||||
|
AnimoraActionManagerDrawer actionManagerDrawer,
|
||||||
|
SerializedProperty property,
|
||||||
|
AnimoraClip clip)
|
||||||
|
{
|
||||||
|
Player = property.serializedObject.targetObject as AnimoraPlayer;
|
||||||
|
Action = action;
|
||||||
|
ActionsManager = actionsManager;
|
||||||
|
ActionManagerDrawer = actionManagerDrawer;
|
||||||
|
Property = property.Copy();
|
||||||
|
_clip = clip;
|
||||||
|
|
||||||
|
property.serializedObject.Update();
|
||||||
|
|
||||||
|
_draggingArea = new VisualElement().SetName("DraggingArea").AddTo(this).SetPickingMode(PickingMode.Ignore);
|
||||||
|
Add(_draggingArea);
|
||||||
|
|
||||||
|
_foldoutGroup = OM_FoldoutGroup.CreateSettingsGroup(Property, action.GetType().Name, "Action");
|
||||||
|
_draggingArea.Add(_foldoutGroup);
|
||||||
|
|
||||||
|
// Context menu
|
||||||
|
var button = new Button { text = "More" };
|
||||||
|
button.RegisterCallback<ClickEvent>(e =>
|
||||||
|
{
|
||||||
|
OnContextMenuClicked();
|
||||||
|
e.StopImmediatePropagation();
|
||||||
|
});
|
||||||
|
_foldoutGroup.HeaderRightContainer.Add(button);
|
||||||
|
|
||||||
|
// Toggle switch for enabling/disabling
|
||||||
|
var isEnabledProperty = property.FindPropertyRelative("isEnabled");
|
||||||
|
var enablePropertyField = OM_Switcher.CreateSwitcher(null, isEnabledProperty, newValue =>
|
||||||
|
{
|
||||||
|
_foldoutGroup.Content.SetEnabled(newValue);
|
||||||
|
});
|
||||||
|
_foldoutGroup.HeaderLeftContainer.Add(enablePropertyField);
|
||||||
|
enablePropertyField.SendToBack();
|
||||||
|
enablePropertyField.RegisterCallback<ClickEvent>(e => e.StopImmediatePropagation());
|
||||||
|
|
||||||
|
// Action name field
|
||||||
|
var nameProp = property.FindPropertyRelative("actionName");
|
||||||
|
_foldoutGroup.Label.SetDisplay(false);
|
||||||
|
|
||||||
|
_actionNameTextField = new TextField(nameProp.stringValue)
|
||||||
|
{
|
||||||
|
label = ""
|
||||||
|
};
|
||||||
|
_actionNameTextField.BindProperty(nameProp);
|
||||||
|
_actionNameTextField.Bind(nameProp.serializedObject);
|
||||||
|
_actionNameTextField.style.minWidth = new StyleLength(new Length(50, LengthUnit.Pixel));
|
||||||
|
_actionNameTextField.schedule.Execute(() =>
|
||||||
|
{
|
||||||
|
var input = _actionNameTextField.Q("unity-text-input");
|
||||||
|
input.style.flexGrow = 0;
|
||||||
|
input.style.minWidth = new StyleLength(new Length(50, LengthUnit.Pixel));
|
||||||
|
});
|
||||||
|
|
||||||
|
_actionNameTextField.RegisterValueChangedCallback(e =>
|
||||||
|
{
|
||||||
|
ActionManagerDrawer.Player.RecordUndo("Record Action Name Change");
|
||||||
|
action.ActionName = e.newValue;
|
||||||
|
ActionManagerDrawer.Player.OnValidate();
|
||||||
|
});
|
||||||
|
_actionNameTextField.RegisterCallback<ClickEvent>(e => e.StopImmediatePropagation());
|
||||||
|
_foldoutGroup.HeaderLeftContainer.Add(_actionNameTextField);
|
||||||
|
|
||||||
|
// Drag handle
|
||||||
|
var behaviourElementDragArea = new AnimoraActionElementDragArea(this);
|
||||||
|
_foldoutGroup.HeaderLeftContainer.Insert(0, behaviourElementDragArea);
|
||||||
|
|
||||||
|
// Full property content
|
||||||
|
var field = new PropertyField(property);
|
||||||
|
field.Bind(property.serializedObject);
|
||||||
|
_foldoutGroup.AddToContent(field);
|
||||||
|
|
||||||
|
Undo.undoRedoPerformed += OnUndoRedoPerformed;
|
||||||
|
this.RegisterCallback<DetachFromPanelEvent>(_ => Undo.undoRedoPerformed -= OnUndoRedoPerformed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Restores name value after undo/redo.
|
||||||
|
/// </summary>
|
||||||
|
private void OnUndoRedoPerformed()
|
||||||
|
{
|
||||||
|
_actionNameTextField.value = Action.ActionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Builds and displays the context menu for the component.
|
||||||
|
/// </summary>
|
||||||
|
private void OnContextMenuClicked()
|
||||||
|
{
|
||||||
|
var menu = new GenericMenu();
|
||||||
|
menu.AddItem(new GUIContent("Edit"), false, () =>
|
||||||
|
{
|
||||||
|
OMEditorUtility.OpenScriptInEditorByName(Action.GetType().Name);
|
||||||
|
});
|
||||||
|
menu.AddItem(new GUIContent("Reset"), false, () =>
|
||||||
|
{
|
||||||
|
Action.Reset(Player, _clip);
|
||||||
|
});
|
||||||
|
menu.AddItem(new GUIContent("Remove"), false, () =>
|
||||||
|
{
|
||||||
|
ActionsManager.RemoveComponent(Action, ActionManagerDrawer.Player);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add methods marked with [ContextMenu]
|
||||||
|
var methodInfos = Action.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance);
|
||||||
|
foreach (var method in methodInfos)
|
||||||
|
{
|
||||||
|
if (method.GetCustomAttribute<ContextMenu>() != null)
|
||||||
|
{
|
||||||
|
menu.AddItem(new GUIContent(method.Name), false, () => method.Invoke(Action, null));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.ShowAsContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Begins the drag operation.
|
||||||
|
/// </summary>
|
||||||
|
public void StartDrag(Vector2 mousePosition)
|
||||||
|
{
|
||||||
|
var worldToLocal = ActionManagerDrawer.DraggingArea.WorldToLocal(_draggingArea.worldBound);
|
||||||
|
_startDragPosition = new Vector2(
|
||||||
|
_draggingArea.resolvedStyle.left + worldToLocal.x,
|
||||||
|
_draggingArea.localBound.yMin + worldToLocal.y
|
||||||
|
);
|
||||||
|
|
||||||
|
style.minHeight = resolvedStyle.height;
|
||||||
|
_draggingArea.style.width = resolvedStyle.width;
|
||||||
|
_draggingArea.style.height = resolvedStyle.height;
|
||||||
|
|
||||||
|
_draggingArea.RemoveFromHierarchy();
|
||||||
|
ActionManagerDrawer.DraggingArea.Add(_draggingArea);
|
||||||
|
|
||||||
|
_draggingArea.style.left = _startDragPosition.x;
|
||||||
|
_draggingArea.style.top = _startDragPosition.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the position of the element during dragging.
|
||||||
|
/// </summary>
|
||||||
|
public void Drag(Vector2 delta, Vector2 mousePosition)
|
||||||
|
{
|
||||||
|
var newPosition = _startDragPosition + delta;
|
||||||
|
_draggingArea.style.left = newPosition.x;
|
||||||
|
_draggingArea.style.top = newPosition.y;
|
||||||
|
|
||||||
|
TryAddElementToDropArea(mousePosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ends the drag and inserts the element in the drop area.
|
||||||
|
/// </summary>
|
||||||
|
public void EndDrag(Vector2 delta, Vector2 mousePosition)
|
||||||
|
{
|
||||||
|
TryAddElementToDropArea(mousePosition);
|
||||||
|
|
||||||
|
_draggingArea.RemoveFromHierarchy();
|
||||||
|
Add(_draggingArea);
|
||||||
|
style.minHeight = StyleKeyword.Auto;
|
||||||
|
_draggingArea.style.left = StyleKeyword.Auto;
|
||||||
|
_draggingArea.style.top = StyleKeyword.Auto;
|
||||||
|
_draggingArea.style.width = StyleKeyword.Auto;
|
||||||
|
_draggingArea.style.height = StyleKeyword.Auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if a drop area is valid and moves the component accordingly.
|
||||||
|
/// </summary>
|
||||||
|
private void TryAddElementToDropArea(Vector2 mousePosition)
|
||||||
|
{
|
||||||
|
if (!ActionManagerDrawer.TryGetDropArea(mousePosition, out var dropArea)) return;
|
||||||
|
|
||||||
|
if (parent != dropArea)
|
||||||
|
{
|
||||||
|
Apply(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index = -1;
|
||||||
|
foreach (var child in dropArea.Children())
|
||||||
|
{
|
||||||
|
if (child == this) continue;
|
||||||
|
|
||||||
|
var localRect = ActionManagerDrawer.DraggingArea.WorldToLocal(child.worldBound);
|
||||||
|
if (!localRect.Contains(mousePosition)) continue;
|
||||||
|
|
||||||
|
index = mousePosition.y < localRect.center.y
|
||||||
|
? dropArea.IndexOf(child)
|
||||||
|
: dropArea.IndexOf(child) + 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index <= -1 || dropArea.IndexOf(this) == index) return;
|
||||||
|
Apply(index);
|
||||||
|
|
||||||
|
void Apply(int indexToApply)
|
||||||
|
{
|
||||||
|
RemoveFromHierarchy();
|
||||||
|
indexToApply = Mathf.Clamp(indexToApply, -1, dropArea.childCount);
|
||||||
|
if (indexToApply == -1)
|
||||||
|
dropArea.Add(this);
|
||||||
|
else
|
||||||
|
dropArea.Insert(indexToApply, this);
|
||||||
|
|
||||||
|
ActionManagerDrawer.Player.RecordUndo("Record Action Change");
|
||||||
|
|
||||||
|
Action.ActionGroup = dropArea.ActionGroup;
|
||||||
|
Action.OrderIndex = dropArea.IndexOf(this);
|
||||||
|
|
||||||
|
foreach (var child in dropArea.Children())
|
||||||
|
{
|
||||||
|
if (child is AnimoraActionElement element)
|
||||||
|
element.Action.OrderIndex = dropArea.IndexOf(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_currentDropArea != null)
|
||||||
|
{
|
||||||
|
foreach (var child in _currentDropArea.Children())
|
||||||
|
{
|
||||||
|
if (child is AnimoraActionElement element)
|
||||||
|
element.Action.OrderIndex = _currentDropArea.IndexOf(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_currentDropArea = dropArea;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8bc0517e1eab64b9da1822261f811ba7
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Actions/AnimoraActionElement.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,68 @@
|
|||||||
|
using OM.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A drag handle element used within <see cref="AnimoraActionElement"/>.
|
||||||
|
/// Implements <see cref="IOM_DragControlDraggable"/> to delegate drag behavior to the parent component.
|
||||||
|
/// </summary>
|
||||||
|
public class AnimoraActionElementDragArea : VisualElement, IOM_DragControlDraggable
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The parent component element that owns this drag area.
|
||||||
|
/// </summary>
|
||||||
|
public AnimoraActionElement ActionElement { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of <see cref="AnimoraActionElementDragArea"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="actionElement">The parent <see cref="AnimoraActionElement"/> this drag area controls.</param>
|
||||||
|
public AnimoraActionElementDragArea(AnimoraActionElement actionElement)
|
||||||
|
{
|
||||||
|
ActionElement = actionElement;
|
||||||
|
|
||||||
|
style.width = new StyleLength(new Length(30, LengthUnit.Pixel));
|
||||||
|
style.height = new StyleLength(new Length(100, LengthUnit.Percent));
|
||||||
|
|
||||||
|
var icon = new VisualElement().SetPickingMode(PickingMode.Ignore);
|
||||||
|
icon.style.width = new StyleLength(new Length(60, LengthUnit.Percent));
|
||||||
|
icon.style.height = new StyleLength(new Length(60, LengthUnit.Percent));
|
||||||
|
icon.style.backgroundImage = EditorGUIUtility.IconContent("align_vertically_center").image as Texture2D;
|
||||||
|
icon.AddTo(this);
|
||||||
|
|
||||||
|
style.alignContent = Align.Center;
|
||||||
|
style.justifyContent = Justify.Center;
|
||||||
|
style.alignItems = Align.Center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when dragging starts.
|
||||||
|
/// Delegates to the parent component element.
|
||||||
|
/// </summary>
|
||||||
|
public void StartDrag(Vector2 mousePosition)
|
||||||
|
{
|
||||||
|
ActionElement.StartDrag(mousePosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called during dragging movement.
|
||||||
|
/// Delegates to the parent component element.
|
||||||
|
/// </summary>
|
||||||
|
public void Drag(Vector2 delta, Vector2 mousePosition)
|
||||||
|
{
|
||||||
|
ActionElement.Drag(delta, mousePosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when dragging ends.
|
||||||
|
/// Delegates to the parent component element.
|
||||||
|
/// </summary>
|
||||||
|
public void EndDrag(Vector2 delta, Vector2 mousePosition)
|
||||||
|
{
|
||||||
|
ActionElement.EndDrag(delta, mousePosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4644481d0e7be414b9785f50f9effe6b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Actions/AnimoraActionElementDragArea.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,279 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using OM.Editor;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom property drawer for <see cref="AnimoraActionsManager"/>.
|
||||||
|
/// Displays grouped and reorderable Animora actions using foldouts, drag-and-drop, and a searchable popup.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraActionsManager), true)]
|
||||||
|
public class AnimoraActionManagerDrawer : PropertyDrawer, IOM_SearchPopupOwner
|
||||||
|
{
|
||||||
|
private readonly HashSet<AnimoraActionElement> _actionElements = new();
|
||||||
|
private readonly List<AnimoraActionDropArea> _dropAreas = new();
|
||||||
|
|
||||||
|
public OM_FoldoutGroup FoldoutGroup { get; private set; }
|
||||||
|
public VisualElement DraggingArea { get; private set; }
|
||||||
|
public SerializedObject SerializedObject { get; private set; }
|
||||||
|
public AnimoraPlayer Player { get; private set; }
|
||||||
|
public AnimoraActionsManager ActionsManager { get; private set; }
|
||||||
|
public SerializedProperty ActionsContainerProperty { get; private set; }
|
||||||
|
public AnimoraClip Clip { get; private set; }
|
||||||
|
|
||||||
|
private AnimoraActionGroup _currentActionGroup;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to get the drop area under the given mouse position.
|
||||||
|
/// </summary>
|
||||||
|
public bool TryGetDropArea(Vector2 mousePosition, out AnimoraActionDropArea dropArea)
|
||||||
|
{
|
||||||
|
foreach (var data in _dropAreas)
|
||||||
|
{
|
||||||
|
if (data.localBound.Contains(mousePosition))
|
||||||
|
{
|
||||||
|
dropArea = data;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dropArea = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the UI layout for the property drawer.
|
||||||
|
/// </summary>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
_dropAreas.Clear();
|
||||||
|
_actionElements.Clear();
|
||||||
|
|
||||||
|
SerializedObject = property.serializedObject;
|
||||||
|
ActionsContainerProperty = property.Copy();
|
||||||
|
|
||||||
|
ActionsManager = property.GetValueCustom(true) as AnimoraActionsManager;
|
||||||
|
if (ActionsManager == null) return new Label("No Actions Manager found");
|
||||||
|
|
||||||
|
Player = property.serializedObject.targetObject as AnimoraPlayer;
|
||||||
|
if (Player == null) return new Label("No AnimoraPlayer found");
|
||||||
|
|
||||||
|
ActionsManager.CheckActions(Player);
|
||||||
|
|
||||||
|
FoldoutGroup = OM_FoldoutGroup.CreateSettingsGroup(property.Copy(), "Actions", "Actions");
|
||||||
|
FoldoutGroup.AddStyleSheet("AnimoraActionsManager");
|
||||||
|
FoldoutGroup.Content.AddManipulator(new OM_DragControlManipulator());
|
||||||
|
FoldoutGroup.Content.AddClassNames("actions-manager-container");
|
||||||
|
|
||||||
|
var serializedProperty = property.GetParentProperty();
|
||||||
|
Clip = serializedProperty.GetValueCustom(true) as AnimoraClip;
|
||||||
|
if (Clip == null) return new Label("No Clip Found");
|
||||||
|
|
||||||
|
// Create drop areas for each group
|
||||||
|
foreach (AnimoraActionGroup groupType in Enum.GetValues(typeof(AnimoraActionGroup)))
|
||||||
|
{
|
||||||
|
var groupHeader = new AnimoraActionDropAreaHeader(groupType);
|
||||||
|
FoldoutGroup.AddToContent(groupHeader);
|
||||||
|
|
||||||
|
var groupElement = new AnimoraActionDropArea(groupType, this);
|
||||||
|
FoldoutGroup.AddToContent(groupElement);
|
||||||
|
_dropAreas.Add(groupElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create invisible dragging overlay
|
||||||
|
DraggingArea = new VisualElement().AddTo(FoldoutGroup.Content).SetPickingMode(PickingMode.Ignore);
|
||||||
|
DraggingArea.style.position = Position.Absolute;
|
||||||
|
DraggingArea.style.left = 0;
|
||||||
|
DraggingArea.style.top = 0;
|
||||||
|
DraggingArea.style.width = new StyleLength(new Length(100, LengthUnit.Percent));
|
||||||
|
DraggingArea.style.height = new StyleLength(new Length(100, LengthUnit.Percent));
|
||||||
|
|
||||||
|
CreateOrRemoveActions();
|
||||||
|
|
||||||
|
Undo.undoRedoPerformed += UndoRedoPerformed;
|
||||||
|
ActionsManager.OnActionsChanged += ActionsManagerOnOnActionsChanged;
|
||||||
|
|
||||||
|
FoldoutGroup.RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||||
|
{
|
||||||
|
Undo.undoRedoPerformed -= UndoRedoPerformed;
|
||||||
|
ActionsManager.OnActionsChanged -= ActionsManagerOnOnActionsChanged;
|
||||||
|
});
|
||||||
|
|
||||||
|
return FoldoutGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the actions manager fires a change event.
|
||||||
|
/// </summary>
|
||||||
|
private void ActionsManagerOnOnActionsChanged()
|
||||||
|
{
|
||||||
|
CreateOrRemoveActions();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles changes after undo/redo operations.
|
||||||
|
/// </summary>
|
||||||
|
private void UndoRedoPerformed()
|
||||||
|
{
|
||||||
|
if (Player.ClipsManager.GetClips().Contains(Clip))
|
||||||
|
{
|
||||||
|
CreateOrRemoveActions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Synchronizes the displayed elements with the actual state of the <see cref="AnimoraActionsManager"/>.
|
||||||
|
/// </summary>
|
||||||
|
private void CreateOrRemoveActions()
|
||||||
|
{
|
||||||
|
if (ActionsManager == null || ActionsContainerProperty == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SerializedObject.Update();
|
||||||
|
if (ActionsContainerProperty.GetValueCustom(true) == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var currentActions = ActionsManager.GetComponents();
|
||||||
|
var actionsProperty = ActionsContainerProperty.FindPropertyRelative("actions");
|
||||||
|
if (actionsProperty == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Remove stale elements
|
||||||
|
_actionElements.RemoveWhere(element =>
|
||||||
|
{
|
||||||
|
if (element.parent is AnimoraActionDropArea dropArea &&
|
||||||
|
element.Action.ActionGroup != dropArea.ActionGroup)
|
||||||
|
{
|
||||||
|
element.RemoveFromHierarchy();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.Action == null || !currentActions.Contains(element.Action))
|
||||||
|
{
|
||||||
|
element.RemoveFromHierarchy();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add new elements
|
||||||
|
var changedDropAreas = new List<AnimoraActionDropArea>();
|
||||||
|
foreach (var action in currentActions)
|
||||||
|
{
|
||||||
|
if (_actionElements.All(x => x.Action != action))
|
||||||
|
{
|
||||||
|
if (action == null) continue;
|
||||||
|
|
||||||
|
var p = actionsProperty.GetArrayElementAtIndex(currentActions.IndexOf(action));
|
||||||
|
var element = new AnimoraActionElement(action, ActionsManager, this, p.Copy(), Clip);
|
||||||
|
_actionElements.Add(element);
|
||||||
|
|
||||||
|
var dropArea = _dropAreas.First(x => x.ActionGroup == action.ActionGroup);
|
||||||
|
dropArea.Add(element);
|
||||||
|
|
||||||
|
if (!changedDropAreas.Contains(dropArea))
|
||||||
|
{
|
||||||
|
changedDropAreas.Add(dropArea);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reorder elements
|
||||||
|
foreach (var dropArea in changedDropAreas)
|
||||||
|
{
|
||||||
|
var ordered = _actionElements
|
||||||
|
.Where(x => x.Action.ActionGroup == dropArea.ActionGroup)
|
||||||
|
.OrderBy(x => x.Action.OrderIndex)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
for (int i = 0; i < ordered.Count; i++)
|
||||||
|
{
|
||||||
|
var elem = ordered[i];
|
||||||
|
if (dropArea.IndexOf(elem) == i) continue;
|
||||||
|
|
||||||
|
dropArea.Remove(elem);
|
||||||
|
dropArea.Insert(i, elem);
|
||||||
|
elem.Action.OrderIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Displays a search popup for adding new actions.
|
||||||
|
/// </summary>
|
||||||
|
public void ShowSearchPopup(AnimoraActionGroup actionGroup, VisualElement target = null)
|
||||||
|
{
|
||||||
|
_currentActionGroup = actionGroup;
|
||||||
|
OM_SearchPopup.Open(target ?? FoldoutGroup.Content, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Supplies the search popup with available action types.
|
||||||
|
/// </summary>
|
||||||
|
public List<OM_SearchPopupItemData> GetSearchItems()
|
||||||
|
{
|
||||||
|
var allComponents = GetAllActionsFromAssembly();
|
||||||
|
var list = new List<OM_SearchPopupItemData>();
|
||||||
|
|
||||||
|
foreach (var component in allComponents)
|
||||||
|
{
|
||||||
|
var createAttr = component.GetCustomAttribute<AnimoraCreateAttribute>();
|
||||||
|
if (createAttr == null) continue;
|
||||||
|
|
||||||
|
var iconAttr = component.GetCustomAttribute<AnimoraIconAttribute>();
|
||||||
|
var iconPath = iconAttr?.IconName;
|
||||||
|
var iconType = iconAttr?.IconType ?? OM_IconType.ResourcesFolder;
|
||||||
|
var description = component.GetCustomAttribute<AnimoraDescriptionAttribute>()?.Description;
|
||||||
|
var keywords = component.GetCustomAttribute<AnimoraKeywordsAttribute>()?.Keywords;
|
||||||
|
|
||||||
|
var actionAttr = component.GetCustomAttribute<AnimoraActionAttribute>();
|
||||||
|
if (actionAttr != null && !actionAttr.IsTargetType(Clip.GetTargetType()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
list.Add(new OM_SearchPopupItemData(
|
||||||
|
createAttr.Name,
|
||||||
|
createAttr.Path,
|
||||||
|
component,
|
||||||
|
iconType,
|
||||||
|
iconPath,
|
||||||
|
description,
|
||||||
|
keywords));
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Instantiates and adds a selected component from the search popup.
|
||||||
|
/// </summary>
|
||||||
|
public void OnSearchItemSelected(OM_SearchPopupItemData data)
|
||||||
|
{
|
||||||
|
if (data.Data is Type actionType)
|
||||||
|
{
|
||||||
|
var instance = (AnimoraAction)Activator.CreateInstance(actionType);
|
||||||
|
instance.ActionGroup = _currentActionGroup;
|
||||||
|
instance.ActionName = data.Name;
|
||||||
|
ActionsManager.AddComponent(instance, Player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets all valid <see cref="AnimoraAction"/> types in the current AppDomain.
|
||||||
|
/// </summary>
|
||||||
|
private static List<Type> GetAllActionsFromAssembly()
|
||||||
|
{
|
||||||
|
return AppDomain.CurrentDomain.GetAssemblies()
|
||||||
|
.SelectMany(assembly => assembly.GetTypes())
|
||||||
|
.Where(t => typeof(AnimoraAction).IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3b8b89c7c05e24af39253dc804a79c15
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Actions/AnimoraActionManagerDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,102 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom property drawer for <see cref="AnimoraAction"/> that dynamically renders all child properties
|
||||||
|
/// using UI Toolkit, with optional filtering and change handling.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraActionWithTargets<>), true)]
|
||||||
|
public class AnimoraActionWithTargetsDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Cached dictionary of property fields by name for easy access and update handling.
|
||||||
|
/// </summary>
|
||||||
|
protected readonly Dictionary<string, PropertyField> PropertyFields = new Dictionary<string, PropertyField>();
|
||||||
|
protected SerializedProperty MainProperty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the UI layout for the property using VisualElements.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized property being drawn.</param>
|
||||||
|
/// <returns>A <see cref="VisualElement"/> containing the entire property UI.</returns>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
MainProperty = property.Copy();
|
||||||
|
PropertyFields.Clear();
|
||||||
|
|
||||||
|
var root = new VisualElement();
|
||||||
|
|
||||||
|
foreach (var childProperty in property.GetAllProperties())
|
||||||
|
{
|
||||||
|
DrawProperty(childProperty.Copy(), root);
|
||||||
|
}
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Draws an individual child property if allowed by <see cref="CanDrawProperty"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The property to draw.</param>
|
||||||
|
/// <param name="parent">The parent element to add the field to.</param>
|
||||||
|
protected virtual void DrawProperty(SerializedProperty property, VisualElement parent)
|
||||||
|
{
|
||||||
|
if (!CanDrawProperty(property)) return;
|
||||||
|
|
||||||
|
var propertyField = new PropertyField(property);
|
||||||
|
propertyField.Bind(property.serializedObject);
|
||||||
|
parent.Add(propertyField);
|
||||||
|
|
||||||
|
PropertyFields.Add(property.name, propertyField);
|
||||||
|
|
||||||
|
propertyField.RegisterValueChangeCallback(e =>
|
||||||
|
{
|
||||||
|
OnAnyPropertyChanged(property.name, propertyField);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines whether a property should be drawn.
|
||||||
|
/// Skips properties marked with <see cref="OM_HideInInspector"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The property to evaluate.</param>
|
||||||
|
/// <returns>True if the property should be drawn; otherwise, false.</returns>
|
||||||
|
protected virtual bool CanDrawProperty(SerializedProperty property)
|
||||||
|
{
|
||||||
|
var hideInInspector = property.GetAttribute<OM_HideInInspector>(true);
|
||||||
|
return hideInInspector == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called whenever any property field changes.
|
||||||
|
/// Can be overridden to implement custom update behavior.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propertyName">The name of the changed property.</param>
|
||||||
|
/// <param name="propertyField">The field instance that changed.</param>
|
||||||
|
protected virtual void OnAnyPropertyChanged(string propertyName, PropertyField propertyField)
|
||||||
|
{
|
||||||
|
// Override in subclass to react to property changes
|
||||||
|
if (propertyName == "useCustomTargets")
|
||||||
|
{
|
||||||
|
var field = GetPropertyField("customTargets");
|
||||||
|
field?.SetDisplay(MainProperty.FindPropertyRelative("useCustomTargets").boolValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a drawn <see cref="PropertyField"/> by its property name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="propertyName">The name of the property field.</param>
|
||||||
|
/// <returns>The corresponding <see cref="PropertyField"/>, or null if not found.</returns>
|
||||||
|
protected PropertyField GetPropertyField(string propertyName)
|
||||||
|
{
|
||||||
|
return PropertyFields.GetValueOrDefault(propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 64183466bba04910a27452a6e22cce67
|
||||||
|
timeCreated: 1746353358
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Actions/AnimoraActionWithTargetsDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
22
Client/Assets/Plugins/OM/Animora/Editor/AnimoraEditor.asmdef
Normal file
22
Client/Assets/Plugins/OM/Animora/Editor/AnimoraEditor.asmdef
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "AnimoraEditor",
|
||||||
|
"rootNamespace": "",
|
||||||
|
"references": [
|
||||||
|
"GUID:e18551f1fa3b94b20a10e6ffb756586a",
|
||||||
|
"GUID:6f06f7bc90a9a4423bc4467152087b1e",
|
||||||
|
"GUID:4ae89db7f8eb34ecfa05bc30f0162358",
|
||||||
|
"GUID:b62e7de798d864a2fa8cee24acf3a3a6",
|
||||||
|
"GUID:b2189558d420a46e3a7e1421892020e5"
|
||||||
|
],
|
||||||
|
"includePlatforms": [
|
||||||
|
"Editor"
|
||||||
|
],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fb1081e58bd7345dbb5c37b7a0d5f8a1
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/AnimoraEditor.asmdef
|
||||||
|
uploadId: 757363
|
||||||
3
Client/Assets/Plugins/OM/Animora/Editor/Attributes.meta
Normal file
3
Client/Assets/Plugins/OM/Animora/Editor/Attributes.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2f11b06c9beb48c884f5d710c0df97fe
|
||||||
|
timeCreated: 1743626298
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom property drawer for <see cref="AnimoraLoopCountAttribute"/>.
|
||||||
|
/// Displays a help message if the int value is below the defined minimum.
|
||||||
|
/// Supports both IMGUI and UI Toolkit.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraLoopCountAttribute), true)]
|
||||||
|
public class AnimoraLoopCountAttributeDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
private HelpBox _helpBox;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates the height required for the property, including space for the help box if shown.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized int property.</param>
|
||||||
|
/// <param name="label">The label to display.</param>
|
||||||
|
/// <returns>The height in pixels needed for the property and help box.</returns>
|
||||||
|
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
||||||
|
{
|
||||||
|
var propertyAttribute = (AnimoraLoopCountAttribute)this.attribute;
|
||||||
|
|
||||||
|
if (property.intValue < propertyAttribute.Min)
|
||||||
|
{
|
||||||
|
return EditorGUIUtility.singleLineHeight * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EditorGUIUtility.singleLineHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Renders the property field and an error help box if the value is too low (IMGUI).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="position">The rectangle area to draw in.</param>
|
||||||
|
/// <param name="property">The serialized int property.</param>
|
||||||
|
/// <param name="label">The property's label.</param>
|
||||||
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||||||
|
{
|
||||||
|
var propertyAttribute = (AnimoraLoopCountAttribute)this.attribute;
|
||||||
|
|
||||||
|
if (property.intValue < propertyAttribute.Min)
|
||||||
|
{
|
||||||
|
EditorGUI.HelpBox(position, propertyAttribute.MinMessage, MessageType.Error);
|
||||||
|
position.y += EditorGUIUtility.singleLineHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorGUI.PropertyField(position, property, label);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the UI Toolkit-based property field with a conditional help box.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized int property.</param>
|
||||||
|
/// <returns>A <see cref="VisualElement"/> containing the UI representation.</returns>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
var propertyAttribute = (AnimoraLoopCountAttribute)this.attribute;
|
||||||
|
|
||||||
|
var root = new VisualElement();
|
||||||
|
|
||||||
|
var propertyField = new PropertyField(property);
|
||||||
|
propertyField.Bind(property.serializedObject);
|
||||||
|
root.Add(propertyField);
|
||||||
|
|
||||||
|
_helpBox = new HelpBox(propertyAttribute.MinMessage, HelpBoxMessageType.Info);
|
||||||
|
_helpBox.style.display = property.intValue <= propertyAttribute.Min ? DisplayStyle.Flex : DisplayStyle.None;
|
||||||
|
root.Add(_helpBox);
|
||||||
|
|
||||||
|
propertyField.RegisterValueChangeCallback(e =>
|
||||||
|
{
|
||||||
|
_helpBox.style.display = property.intValue <= propertyAttribute.Min ? DisplayStyle.Flex : DisplayStyle.None;
|
||||||
|
});
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 55b1a4362284468bafcb898cbf227902
|
||||||
|
timeCreated: 1743626319
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Attributes/AnimoraLoopCountAttributeDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
3
Client/Assets/Plugins/OM/Animora/Editor/Core.meta
Normal file
3
Client/Assets/Plugins/OM/Animora/Editor/Core.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 95b75df8010546e296893b6bccba6f3f
|
||||||
|
timeCreated: 1742483377
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
using OM.Editor;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A styled button with an icon container used in the Animora editor UI.
|
||||||
|
/// </summary>
|
||||||
|
public class AnimoraIconButton : Button
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The inner icon container element.
|
||||||
|
/// </summary>
|
||||||
|
public VisualElement Icon { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="AnimoraIconButton"/> class with a click action.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="onClick">The callback invoked when the button is clicked.</param>
|
||||||
|
public AnimoraIconButton(System.Action onClick) : base(onClick)
|
||||||
|
{
|
||||||
|
this.AddToClassList("control-section-btn");
|
||||||
|
|
||||||
|
Icon = new VisualElement();
|
||||||
|
Icon.SetName("Icon");
|
||||||
|
Add(Icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1aff1d8b4e4646f7b2bc44d2f18eb245
|
||||||
|
timeCreated: 1744724236
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Core/AnimoraIconButton.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
[CustomEditor(typeof(AnimoraManager),true)]
|
||||||
|
public class AnimoraManagerEditor : UnityEditor.Editor
|
||||||
|
{
|
||||||
|
private AnimoraManager _animoraManager;
|
||||||
|
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
_animoraManager = (AnimoraManager) target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
base.OnInspectorGUI();
|
||||||
|
|
||||||
|
foreach (var pair in _animoraManager.AnimoraPlayers)
|
||||||
|
{
|
||||||
|
var playerName = pair.Key;
|
||||||
|
var playerInstance = pair.Value;
|
||||||
|
|
||||||
|
GUILayout.Label($"Player Name: {playerName}" + $" | Player Count: {playerInstance.Players.Count}");
|
||||||
|
|
||||||
|
foreach (var player in playerInstance.Players)
|
||||||
|
{
|
||||||
|
if (player == null) continue;
|
||||||
|
|
||||||
|
if (GUILayout.Button(player.name))
|
||||||
|
{
|
||||||
|
EditorGUIUtility.PingObject(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6605be60f93b4376b3fcaaf5849b29ce
|
||||||
|
timeCreated: 1747306947
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Core/AnimoraManagerEditor.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,284 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using OM.TimelineCreator.Editor;
|
||||||
|
using OM.TimelineCreator.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom inspector for <see cref="AnimoraPlayer"/>, providing timeline editing, clip management,
|
||||||
|
/// settings UI, and dynamic action inspection.
|
||||||
|
/// </summary>
|
||||||
|
[CustomEditor(typeof(AnimoraPlayer))]
|
||||||
|
public class AnimoraPlayerEditor : UnityEditor.Editor, IOM_SearchPopupOwner, IOM_TimelineEditorOwner<AnimoraClip>
|
||||||
|
{
|
||||||
|
public OM_VisualElementsManager VisualElementsManager { get; private set; }
|
||||||
|
public UnityEditor.Editor Editor => this;
|
||||||
|
public IOM_TimelinePlayer<AnimoraClip> TimelinePlayer => Player;
|
||||||
|
|
||||||
|
public AnimoraTimeline AnimoraTimeline { get; private set; }
|
||||||
|
public AnimoraPlayer Player { get; private set; }
|
||||||
|
public VisualElement Root { get; private set; }
|
||||||
|
public AnimoraInspector Inspector { get; private set; }
|
||||||
|
|
||||||
|
private List<Type> _cachedClipsTypes;
|
||||||
|
private AnimoraPlayerEditorControlSection _animoraPlayerEditorControlSection;
|
||||||
|
|
||||||
|
private List<AnimoraPlayer> _allPlayersInScene;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the editor is enabled.
|
||||||
|
/// </summary>
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
VisualElementsManager = new OM_VisualElementsManager();
|
||||||
|
Player = (AnimoraPlayer)target;
|
||||||
|
|
||||||
|
Undo.undoRedoPerformed += UndoRedoPerformed;
|
||||||
|
Player.OnPlayerValidateCallback += OnPlayerValidate;
|
||||||
|
|
||||||
|
_allPlayersInScene = FindObjectsByType<AnimoraPlayer>(FindObjectsInactive.Include, FindObjectsSortMode.None)
|
||||||
|
.ToList();
|
||||||
|
_allPlayersInScene.Remove(Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the editor is disabled.
|
||||||
|
/// </summary>
|
||||||
|
private void OnDisable()
|
||||||
|
{
|
||||||
|
Undo.undoRedoPerformed -= UndoRedoPerformed;
|
||||||
|
Player.OnPlayerValidateCallback -= OnPlayerValidate;
|
||||||
|
_animoraPlayerEditorControlSection?.OnDisable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UndoRedoPerformed() => VisualElementsManager.TriggerUndoRedo();
|
||||||
|
private void OnPlayerValidate() => VisualElementsManager.TriggerValidate();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the full inspector UI.
|
||||||
|
/// </summary>
|
||||||
|
public override VisualElement CreateInspectorGUI()
|
||||||
|
{
|
||||||
|
Root = new VisualElement();
|
||||||
|
Root.AddStyleSheet("Animora");
|
||||||
|
|
||||||
|
DrawSettings();
|
||||||
|
DrawTimeline();
|
||||||
|
DrawInspector();
|
||||||
|
|
||||||
|
// Ensure all clip actions are up to date
|
||||||
|
foreach (var clip in Player.GetClips())
|
||||||
|
{
|
||||||
|
if (clip is IAnimoraComponentsManagerOwner actionOwner)
|
||||||
|
{
|
||||||
|
actionOwner.ActionsManager.CheckActions(Player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Root;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Draws the player settings UI as a foldout group.
|
||||||
|
/// </summary>
|
||||||
|
private void DrawSettings()
|
||||||
|
{
|
||||||
|
OM_FoldoutGroup foldoutGroup = null;
|
||||||
|
|
||||||
|
foreach (var property in serializedObject.GetAllProperties())
|
||||||
|
{
|
||||||
|
if (property.name == "m_Script") continue;
|
||||||
|
|
||||||
|
if (foldoutGroup == null)
|
||||||
|
{
|
||||||
|
foldoutGroup = OM_FoldoutGroup.CreateSettingsGroup(property.Copy(), "Player Settings", "");
|
||||||
|
foldoutGroup.AddClassNames("main-settings-group");
|
||||||
|
Root.Add(foldoutGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
var hideInInspector = property.GetAttribute<OM_HideInInspector>(true);
|
||||||
|
if (hideInInspector != null) continue;
|
||||||
|
|
||||||
|
var field = new PropertyField(property);
|
||||||
|
field.Bind(serializedObject);
|
||||||
|
|
||||||
|
if (property.name == "animoraPlayerEvents")
|
||||||
|
{
|
||||||
|
Root.Add(field);
|
||||||
|
field.style.marginBottom = 5;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foldoutGroup.AddToContent(field);
|
||||||
|
|
||||||
|
if (property.name == "playerUniqueID")
|
||||||
|
{
|
||||||
|
var helpBox = new HelpBox();
|
||||||
|
helpBox.messageType = HelpBoxMessageType.Info;
|
||||||
|
helpBox.text = "";
|
||||||
|
foldoutGroup.AddToContent(helpBox);
|
||||||
|
field.RegisterValueChangeCallback(e =>
|
||||||
|
{
|
||||||
|
var any = _allPlayersInScene.Any(x=>x.PlayerUniqueID == e.changedProperty.stringValue);
|
||||||
|
if (any)
|
||||||
|
{
|
||||||
|
helpBox.text = "This ID is already used by another player in the scene.";
|
||||||
|
helpBox.messageType = HelpBoxMessageType.Warning;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
helpBox.text = "This ID is unique in the scene.";
|
||||||
|
helpBox.messageType = HelpBoxMessageType.Info;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var settings = OM_TimelineSettings.Instance;
|
||||||
|
if (settings != null && foldoutGroup != null)
|
||||||
|
{
|
||||||
|
var editor = CreateEditor(settings);
|
||||||
|
foldoutGroup.AddToContent(editor.CreateInspectorGUI());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foldoutGroup != null)
|
||||||
|
foldoutGroup.style.marginBottom = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Draws the timeline editor and header control section.
|
||||||
|
/// </summary>
|
||||||
|
private void DrawTimeline()
|
||||||
|
{
|
||||||
|
AnimoraTimeline = new AnimoraTimeline(this, this);
|
||||||
|
Root.Add(AnimoraTimeline);
|
||||||
|
|
||||||
|
_animoraPlayerEditorControlSection = new AnimoraPlayerEditorControlSection(this);
|
||||||
|
_animoraPlayerEditorControlSection.OnEnable();
|
||||||
|
|
||||||
|
AnimoraTimeline.Header.OnContextButtonClicked += () =>
|
||||||
|
{
|
||||||
|
var menu = new GenericMenu();
|
||||||
|
|
||||||
|
menu.AddItem(new GUIContent("Edit Script"), false, () =>
|
||||||
|
{
|
||||||
|
var scriptProp = serializedObject.FindProperty("m_Script");
|
||||||
|
var script = scriptProp.objectReferenceValue as MonoScript;
|
||||||
|
if (script != null)
|
||||||
|
{
|
||||||
|
AssetDatabase.OpenAsset(script);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
menu.AddSeparator("");
|
||||||
|
menu.AddItem(new GUIContent("Save Timeline"), false, () => AnimoraSaveManager.Save(Player));
|
||||||
|
menu.AddItem(new GUIContent("Load Timeline"), false, () => AnimoraSaveManager.Load(Player));
|
||||||
|
|
||||||
|
menu.ShowAsContext();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Draws the inspector section for the currently selected clip.
|
||||||
|
/// </summary>
|
||||||
|
private void DrawInspector()
|
||||||
|
{
|
||||||
|
Inspector = new AnimoraInspector(this);
|
||||||
|
Root.Add(Inspector);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Supplies the searchable list of available clip types.
|
||||||
|
/// </summary>
|
||||||
|
public List<OM_SearchPopupItemData> GetSearchItems()
|
||||||
|
{
|
||||||
|
_cachedClipsTypes ??= GetAllClipsFromAssembly();
|
||||||
|
var searchItems = new List<OM_SearchPopupItemData>();
|
||||||
|
|
||||||
|
foreach (var clipType in _cachedClipsTypes)
|
||||||
|
{
|
||||||
|
var createAttr = clipType.GetCustomAttribute<AnimoraCreateAttribute>();
|
||||||
|
if (createAttr == null) continue;
|
||||||
|
|
||||||
|
var iconAttr = clipType.GetCustomAttribute<AnimoraIconAttribute>();
|
||||||
|
var iconPath = iconAttr?.IconName;
|
||||||
|
var iconType = iconAttr?.IconType ?? OM_IconType.ResourcesFolder;
|
||||||
|
var description = clipType.GetCustomAttribute<AnimoraDescriptionAttribute>()?.Description;
|
||||||
|
var keywords = clipType.GetCustomAttribute<AnimoraKeywordsAttribute>()?.Keywords;
|
||||||
|
|
||||||
|
searchItems.Add(new OM_SearchPopupItemData(
|
||||||
|
createAttr.Name, createAttr.Path, clipType,
|
||||||
|
iconType, iconPath, description, keywords));
|
||||||
|
}
|
||||||
|
|
||||||
|
return searchItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles the creation and registration of a new clip from the search popup.
|
||||||
|
/// </summary>
|
||||||
|
public void OnSearchItemSelected(OM_SearchPopupItemData data)
|
||||||
|
{
|
||||||
|
if (data.Data is not Type clipType) return;
|
||||||
|
|
||||||
|
var instance = (AnimoraClip)Activator.CreateInstance(clipType);
|
||||||
|
instance.OnCreate(Player);
|
||||||
|
instance.ClipName = data.Name;
|
||||||
|
instance.ClipDescription = data.Description;
|
||||||
|
instance.Duration = Player.GetTimelineDuration() * .5f; // half the timeline duration
|
||||||
|
instance.HighlightColor = GetNextColor();
|
||||||
|
|
||||||
|
Player.AddClip(instance);
|
||||||
|
serializedObject.Update();
|
||||||
|
AnimoraTimeline.SelectTrack(Player.GetClips().Count() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns all non-abstract <see cref="AnimoraClip"/> types in the current AppDomain.
|
||||||
|
/// </summary>
|
||||||
|
private static List<Type> GetAllClipsFromAssembly()
|
||||||
|
{
|
||||||
|
return AppDomain.CurrentDomain.GetAssemblies()
|
||||||
|
.SelectMany(s => s.GetTypes())
|
||||||
|
.Where(t => typeof(AnimoraClip).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A rotating list of colors used to differentiate clips (optional).
|
||||||
|
/// </summary>
|
||||||
|
private static readonly List<Color> GetColors = new()
|
||||||
|
{
|
||||||
|
new Color(0.8f, 0.33f, 0.41f),
|
||||||
|
new Color(0.4f, 0.8f, 0.41f),
|
||||||
|
new Color(0.39f, 0.38f, 0.8f),
|
||||||
|
new Color(0.8f, 0.78f, 0.51f),
|
||||||
|
new Color(0.8f, 0.49f, 0.8f),
|
||||||
|
new Color(0.38f, 0.78f, 0.8f),
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Cycles through predefined colors to assign to new clips.
|
||||||
|
/// </summary>
|
||||||
|
private static Color GetNextColor()
|
||||||
|
{
|
||||||
|
var i = PlayerPrefs.GetInt("AnimoraColorIndex", 0);
|
||||||
|
PlayerPrefs.SetInt("AnimoraColorIndex", i + 1);
|
||||||
|
|
||||||
|
if (i < GetColors.Count) return GetColors[i];
|
||||||
|
i = 0;
|
||||||
|
PlayerPrefs.SetInt("AnimoraColorIndex", 0);
|
||||||
|
|
||||||
|
return GetColors[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5e869f8a843b40718a16b2b438d290a3
|
||||||
|
timeCreated: 1742483387
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Core/AnimoraPlayerEditor.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,157 @@
|
|||||||
|
using OM.Editor;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.TimelineCreator.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Handles the playback control logic (Play, Pause, Stop, Replay) for the Animora timeline inside the Unity Editor.
|
||||||
|
/// Connects UI buttons with <see cref="AnimoraPlayer"/> play state logic.
|
||||||
|
/// </summary>
|
||||||
|
public class AnimoraPlayerEditorControlSection
|
||||||
|
{
|
||||||
|
private readonly AnimoraPlayerEditor AnimoraPlayerEditor;
|
||||||
|
private readonly AnimoraPlayer AnimoraPlayer;
|
||||||
|
private readonly OM_HeaderButton _playButton, _stopButton, _replayButton;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the control section and binds UI controls to the player's state.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="playerEditor">The parent <see cref="AnimoraPlayerEditor"/> instance.</param>
|
||||||
|
public AnimoraPlayerEditorControlSection(AnimoraPlayerEditor playerEditor)
|
||||||
|
{
|
||||||
|
AnimoraPlayerEditor = playerEditor;
|
||||||
|
AnimoraPlayer = playerEditor.Player;
|
||||||
|
|
||||||
|
_replayButton = playerEditor.AnimoraTimeline.Header.ReplayButton;
|
||||||
|
_playButton = playerEditor.AnimoraTimeline.Header.PlayButton;
|
||||||
|
_stopButton = playerEditor.AnimoraTimeline.Header.StopButton;
|
||||||
|
|
||||||
|
playerEditor.AnimoraTimeline.Header.OnReplayButtonClicked += Play;
|
||||||
|
playerEditor.AnimoraTimeline.Header.OnPlayButtonClicked += OnPlayButtonClicked;
|
||||||
|
playerEditor.AnimoraTimeline.Header.OnStopButtonClicked += Stop;
|
||||||
|
|
||||||
|
if (!Application.isPlaying)
|
||||||
|
{
|
||||||
|
AnimoraPlayer.SetPlayState(OM_PlayState.Stopped);
|
||||||
|
}
|
||||||
|
|
||||||
|
AnimoraPlayer.OnPlayStateChanged += OnPlayStateChanged;
|
||||||
|
OnPlayStateChanged(AnimoraPlayer.PlayState);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Enables playmode state listeners and sets initial UI state.
|
||||||
|
/// </summary>
|
||||||
|
public void OnEnable()
|
||||||
|
{
|
||||||
|
EditorApplication.playModeStateChanged += OnApplicationPlayModeStateChanged;
|
||||||
|
OnApplicationPlayModeStateChanged(EditorApplication.isPlayingOrWillChangePlaymode
|
||||||
|
? PlayModeStateChange.ExitingEditMode
|
||||||
|
: PlayModeStateChange.EnteredEditMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Cleans up playmode state listeners.
|
||||||
|
/// </summary>
|
||||||
|
public void OnDisable()
|
||||||
|
{
|
||||||
|
EditorApplication.playModeStateChanged -= OnApplicationPlayModeStateChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pauses the animation if in play mode.
|
||||||
|
/// </summary>
|
||||||
|
private void Pause()
|
||||||
|
{
|
||||||
|
if (Application.isPlaying)
|
||||||
|
AnimoraPlayer.PauseAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resumes the animation if in play mode.
|
||||||
|
/// </summary>
|
||||||
|
private void Resume()
|
||||||
|
{
|
||||||
|
if (Application.isPlaying)
|
||||||
|
AnimoraPlayer.ResumeAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Starts the animation if in play mode.
|
||||||
|
/// </summary>
|
||||||
|
private void Play()
|
||||||
|
{
|
||||||
|
if (Application.isPlaying)
|
||||||
|
AnimoraPlayer.PlayAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Stops the animation if in play mode.
|
||||||
|
/// </summary>
|
||||||
|
private void Stop()
|
||||||
|
{
|
||||||
|
if (Application.isPlaying)
|
||||||
|
AnimoraPlayer.StopAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles logic when the play button is clicked.
|
||||||
|
/// Switches between Play, Pause, and Resume.
|
||||||
|
/// </summary>
|
||||||
|
private void OnPlayButtonClicked()
|
||||||
|
{
|
||||||
|
switch (AnimoraPlayer.PlayState)
|
||||||
|
{
|
||||||
|
case OM_PlayState.Playing:
|
||||||
|
Pause();
|
||||||
|
break;
|
||||||
|
case OM_PlayState.Paused:
|
||||||
|
Resume();
|
||||||
|
break;
|
||||||
|
case OM_PlayState.Stopped:
|
||||||
|
Play();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the button states based on Unity's play mode state.
|
||||||
|
/// </summary>
|
||||||
|
private void OnApplicationPlayModeStateChanged(PlayModeStateChange playModeState)
|
||||||
|
{
|
||||||
|
bool enable = playModeState is PlayModeStateChange.ExitingEditMode or PlayModeStateChange.EnteredPlayMode;
|
||||||
|
|
||||||
|
_playButton.SetEnabled(enable);
|
||||||
|
_stopButton.SetEnabled(enable);
|
||||||
|
_replayButton.SetEnabled(enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates button states and icons based on the current <see cref="OM_PlayState"/>.
|
||||||
|
/// </summary>
|
||||||
|
private void OnPlayStateChanged(OM_PlayState newState)
|
||||||
|
{
|
||||||
|
switch (newState)
|
||||||
|
{
|
||||||
|
case OM_PlayState.Playing:
|
||||||
|
_stopButton.SetEnabled(true);
|
||||||
|
_playButton.Icon.SetBackgroundFromIconContent("PauseButton@2x");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OM_PlayState.Paused:
|
||||||
|
_stopButton.SetEnabled(true);
|
||||||
|
_playButton.Icon.SetBackgroundFromIconContent("PlayButton@2x");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OM_PlayState.Stopped:
|
||||||
|
_stopButton.SetEnabled(false);
|
||||||
|
_playButton.Icon.SetBackgroundFromIconContent("PlayButton@2x");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c0e400644c3447728472df0499119748
|
||||||
|
timeCreated: 1745623622
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Core/AnimoraPlayerEditorControlSection.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
[CustomEditor(typeof(AnimoraPlayersContainer),true)]
|
||||||
|
public class AnimoraPlayersContainerEditor : UnityEditor.Editor
|
||||||
|
{
|
||||||
|
private AnimoraPlayersContainer _animoraPlayersContainer;
|
||||||
|
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
_animoraPlayersContainer = (AnimoraPlayersContainer)target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
base.OnInspectorGUI();
|
||||||
|
|
||||||
|
var listOfPlayers = _animoraPlayersContainer.GetSameIDPlayers();
|
||||||
|
if (listOfPlayers.Count > 0)
|
||||||
|
{
|
||||||
|
EditorGUILayout.HelpBox(
|
||||||
|
"There are players with the same name in the container. Please make sure all players have unique names.",
|
||||||
|
MessageType.Warning);
|
||||||
|
|
||||||
|
EditorGUILayout.BeginVertical();
|
||||||
|
|
||||||
|
foreach (var player in listOfPlayers)
|
||||||
|
{
|
||||||
|
if (GUILayout.Button(player.name))
|
||||||
|
{
|
||||||
|
EditorGUIUtility.PingObject(player);
|
||||||
|
}
|
||||||
|
var o = new SerializedObject(player);
|
||||||
|
o.Update();
|
||||||
|
var prop = o.FindProperty("playerUniqueID");
|
||||||
|
EditorGUILayout.PropertyField(prop);
|
||||||
|
o.ApplyModifiedProperties();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorGUILayout.EndVertical();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 98cd88a9ae3d4655878914632b085786
|
||||||
|
timeCreated: 1747428697
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Core/AnimoraPlayersContainerEditor.cs
|
||||||
|
uploadId: 757363
|
||||||
3
Client/Assets/Plugins/OM/Animora/Editor/Drawers.meta
Normal file
3
Client/Assets/Plugins/OM/Animora/Editor/Drawers.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dfa4c864452f405c97ffbdb300135563
|
||||||
|
timeCreated: 1743014109
|
||||||
@ -0,0 +1,100 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom drawer for <see cref="AnimoraInterpolation{T}"/>, used to configure interpolation behavior in the inspector.
|
||||||
|
/// Includes support for enabling/disabling, zero-to-one interpolation, and randomization toggles.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraInterpolation<>), true)]
|
||||||
|
public class AnimoraInterpolationDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
private PropertyField _fieldZero;
|
||||||
|
private PropertyField _fieldRandomizeForEach;
|
||||||
|
private OM_Switcher _randomizeForEachSwitcher;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Builds the custom UI for displaying <see cref="AnimoraInterpolation{T}"/> fields in the inspector.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized interpolation property.</param>
|
||||||
|
/// <returns>A <see cref="VisualElement"/> representing the full UI.</returns>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
var info = property.GetFieldInfo(true);
|
||||||
|
if (info == null)
|
||||||
|
return new Label("No Field Info");
|
||||||
|
|
||||||
|
var interpolationAttribute = info.GetCustomAttribute<AnimoraInterpolationAttribute>();
|
||||||
|
var enabledProperty = property.FindPropertyRelative("enabled");
|
||||||
|
|
||||||
|
var foldout = OM_FoldoutGroup.CreateSettingsGroup(property.Copy(), property.displayName, "Interpolation");
|
||||||
|
|
||||||
|
// Optional "enabled" switcher
|
||||||
|
if (interpolationAttribute != null && interpolationAttribute.UseOptional)
|
||||||
|
{
|
||||||
|
var enablePropertyField = OM_Switcher.CreateSwitcher(null, enabledProperty, newValue =>
|
||||||
|
{
|
||||||
|
foreach (var element in foldout.Content.Children())
|
||||||
|
element.SetEnabled(newValue);
|
||||||
|
}).AddTo(foldout.HeaderRightContainer);
|
||||||
|
|
||||||
|
enablePropertyField.SendToBack();
|
||||||
|
enablePropertyField.RegisterCallback<ClickEvent>(e => e.StopImmediatePropagation());
|
||||||
|
}
|
||||||
|
|
||||||
|
var randomizeForEachProperty = property.FindPropertyRelative("randomizeForEach");
|
||||||
|
|
||||||
|
// Interpolation type field and visibility control
|
||||||
|
var interpolationTypeField = new PropertyField(property.FindPropertyRelative("interpolationType"));
|
||||||
|
interpolationTypeField.RegisterValueChangeCallback(e =>
|
||||||
|
{
|
||||||
|
var type = (AnimoraInterpolationType)e.changedProperty.enumValueIndex;
|
||||||
|
_fieldZero?.SetDisplay(type == AnimoraInterpolationType.FromZeroToOne);
|
||||||
|
});
|
||||||
|
foldout.AddToContent(interpolationTypeField);
|
||||||
|
|
||||||
|
// Draw remaining fields dynamically
|
||||||
|
foreach (var child in property.GetAllProperties())
|
||||||
|
{
|
||||||
|
switch (child.name)
|
||||||
|
{
|
||||||
|
case "relative":
|
||||||
|
case "enabled":
|
||||||
|
case "interpolationType":
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case "randomizeForEach":
|
||||||
|
_randomizeForEachSwitcher = OM_Switcher.CreateSwitcher("Randomize For Each", randomizeForEachProperty.Copy(), _ => { })
|
||||||
|
.AddTo(foldout.Content);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
default:
|
||||||
|
var field = new PropertyField(child);
|
||||||
|
foldout.AddToContent(field);
|
||||||
|
|
||||||
|
if (child.name == "zero")
|
||||||
|
_fieldZero = field;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Visibility control logic for "Randomize For Each" switcher
|
||||||
|
foldout.Add(new IMGUIContainer(() =>
|
||||||
|
{
|
||||||
|
//var zeroRandom = property.FindPropertyRelative("zero").FindPropertyRelative("random").boolValue;
|
||||||
|
//var oneRandom = property.FindPropertyRelative("one").FindPropertyRelative("random").boolValue;
|
||||||
|
|
||||||
|
var zeroRandom = (AnimoraValueType)property.FindPropertyRelative("zero").FindPropertyRelative("valueType").enumValueIndex == AnimoraValueType.Random;
|
||||||
|
var oneRandom = (AnimoraValueType)property.FindPropertyRelative("one").FindPropertyRelative("valueType").enumValueIndex == AnimoraValueType.Random;
|
||||||
|
_randomizeForEachSwitcher?.SetDisplay(zeroRandom || oneRandom);
|
||||||
|
}));
|
||||||
|
|
||||||
|
return foldout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 29623fd616be46659702e7ab7ae5c76d
|
||||||
|
timeCreated: 1743014116
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Drawers/AnimoraInterpolationDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
using System;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom drawer for <see cref="AnimoraTargets{T}"/>.
|
||||||
|
/// Dynamically shows either direct target list or reference ID depending on the selected <see cref="AnimoraTargetType"/>.
|
||||||
|
/// Displays an error icon if the target configuration is invalid.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraTargets<>), true)]
|
||||||
|
public class AnimoraTargetsDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
private PropertyField _directTargetsField, _referenceIdField;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Builds the custom UI for <see cref="AnimoraTargets{T}"/> in the Unity inspector.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized property being drawn.</param>
|
||||||
|
/// <returns>A configured <see cref="VisualElement"/>.</returns>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
var foldoutGroup = OM_FoldoutGroup.CreateSettingsGroup(property.Copy(), property.displayName, "Target");
|
||||||
|
|
||||||
|
// Error icon setup
|
||||||
|
var errorIcon = new VisualElement();
|
||||||
|
errorIcon.SetBackgroundFromIconContent("console.erroricon.sml");
|
||||||
|
errorIcon.style.width = 20;
|
||||||
|
errorIcon.style.height = 20;
|
||||||
|
errorIcon.tooltip = "Error";
|
||||||
|
errorIcon.SetDisplay(false);
|
||||||
|
foldoutGroup.AddToRightHeaderContainer(errorIcon);
|
||||||
|
|
||||||
|
var animoraTargetBase = property.GetValueCustom(true) as AnimoraTargetBase;
|
||||||
|
|
||||||
|
// Iterate over all sub-properties
|
||||||
|
foreach (var childProperty in property.GetAllProperties())
|
||||||
|
{
|
||||||
|
var propertyField = new PropertyField(childProperty);
|
||||||
|
propertyField.Bind(property.serializedObject);
|
||||||
|
|
||||||
|
switch (childProperty.name)
|
||||||
|
{
|
||||||
|
case "directTargets":
|
||||||
|
_directTargetsField = propertyField;
|
||||||
|
foldoutGroup.AddToContent(propertyField);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "referenceId":
|
||||||
|
_referenceIdField = propertyField;
|
||||||
|
foldoutGroup.AddToContent(propertyField);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "targetType":
|
||||||
|
propertyField.label = "";
|
||||||
|
propertyField.RegisterValueChangeCallback(evt =>
|
||||||
|
{
|
||||||
|
var targetType = (AnimoraTargetType)evt.changedProperty.enumValueIndex;
|
||||||
|
switch (targetType)
|
||||||
|
{
|
||||||
|
case AnimoraTargetType.Id:
|
||||||
|
_referenceIdField.SetDisplay(true);
|
||||||
|
_directTargetsField.SetDisplay(false);
|
||||||
|
break;
|
||||||
|
case AnimoraTargetType.Direct:
|
||||||
|
_referenceIdField.SetDisplay(false);
|
||||||
|
_directTargetsField.SetDisplay(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
foldoutGroup.AddToRightHeaderContainer(propertyField);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display error icon if validation fails
|
||||||
|
foldoutGroup.Add(new IMGUIContainer(() =>
|
||||||
|
{
|
||||||
|
if (animoraTargetBase == null) return;
|
||||||
|
|
||||||
|
if (animoraTargetBase.HasErrors(out var error))
|
||||||
|
{
|
||||||
|
errorIcon.SetDisplay(true);
|
||||||
|
errorIcon.tooltip = error;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errorIcon.SetDisplay(false);
|
||||||
|
errorIcon.tooltip = "";
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
return foldoutGroup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d7feb67eb00b44d5a61c59fc0a37377c
|
||||||
|
timeCreated: 1743099423
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Drawers/AnimoraTargetsDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,177 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom drawer for <see cref="AnimoraValue{T}"/>.
|
||||||
|
/// Displays either a single value or two random range fields depending on the `random` toggle.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraValue<>), true)]
|
||||||
|
public class AnimoraValueDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
SerializedProperty valueTypeProperty, targetTransformProperty, vector3TypeProperty, valueProperty, randomValue1Property, randomValue2Property;
|
||||||
|
SerializedProperty currentProperty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Builds the inspector UI for <see cref="AnimoraValue{T}"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized property to render.</param>
|
||||||
|
/// <returns>The root <see cref="VisualElement"/> container.</returns>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
currentProperty = property.Copy();
|
||||||
|
var root = new VisualElement();
|
||||||
|
|
||||||
|
root.style.paddingBottom = 1;
|
||||||
|
root.style.paddingTop = 1;
|
||||||
|
root.style.paddingLeft = 1;
|
||||||
|
root.style.paddingRight = 1;
|
||||||
|
|
||||||
|
root.style.borderBottomWidth = 1;
|
||||||
|
root.style.borderTopWidth = 1;
|
||||||
|
root.style.borderLeftWidth = 1;
|
||||||
|
root.style.borderRightWidth = 1;
|
||||||
|
|
||||||
|
root.style.borderBottomColor = new Color(0.5f, 0.5f, 0.5f, 1);
|
||||||
|
root.style.borderTopColor = new Color(0.5f, 0.5f, 0.5f, 1);
|
||||||
|
root.style.borderLeftColor = new Color(0.5f, 0.5f, 0.5f, 1);
|
||||||
|
root.style.borderRightColor = new Color(0.5f, 0.5f, 0.5f, 1);
|
||||||
|
|
||||||
|
root.style.marginBottom = 2;
|
||||||
|
root.style.marginTop = 2;
|
||||||
|
|
||||||
|
root.style.borderBottomLeftRadius = 4;
|
||||||
|
root.style.borderBottomRightRadius = 4;
|
||||||
|
root.style.borderTopLeftRadius = 4;
|
||||||
|
root.style.borderTopRightRadius = 4;
|
||||||
|
|
||||||
|
// Create container with two sections: value fields and random toggle
|
||||||
|
var container = new OM_Split2().SetFlexDirection(FlexDirection.Row);
|
||||||
|
root.Add(container);
|
||||||
|
container.AddToClassList("jt-value");
|
||||||
|
container.Container2.style.width = 30;
|
||||||
|
container.Container1.style.flexGrow = 1;
|
||||||
|
|
||||||
|
// Find sub-properties
|
||||||
|
valueTypeProperty = property.FindPropertyRelative("valueType");
|
||||||
|
targetTransformProperty = property.FindPropertyRelative("targetTransform");
|
||||||
|
vector3TypeProperty = property.FindPropertyRelative("vector3Type");
|
||||||
|
valueProperty = property.FindPropertyRelative("value");
|
||||||
|
randomValue1Property = property.FindPropertyRelative("randomValue1");
|
||||||
|
randomValue2Property = property.FindPropertyRelative("randomValue2");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var types = new List<string>();
|
||||||
|
foreach (var name in Enum.GetNames(typeof(AnimoraValueType)))
|
||||||
|
{
|
||||||
|
types.Add(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
var animoraValue = property.GetValueCustom(true);
|
||||||
|
if(animoraValue is not AnimoraValue<Vector3> valueBase)
|
||||||
|
{
|
||||||
|
types.Remove(nameof(AnimoraValueType.Target));
|
||||||
|
if (valueTypeProperty.enumValueIndex == types.IndexOf(nameof(AnimoraValueType.Target)))
|
||||||
|
{
|
||||||
|
valueTypeProperty.enumValueIndex = 0;
|
||||||
|
valueTypeProperty.serializedObject.ApplyModifiedProperties();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueField = new PropertyField(valueProperty)
|
||||||
|
{
|
||||||
|
label = property.displayName
|
||||||
|
};
|
||||||
|
var randomValue1Field = new PropertyField(randomValue1Property)
|
||||||
|
{
|
||||||
|
label = property.displayName + " 1"
|
||||||
|
};
|
||||||
|
var randomValue2Field = new PropertyField(randomValue2Property)
|
||||||
|
{
|
||||||
|
label = property.displayName + " 2"
|
||||||
|
};
|
||||||
|
var targetTransformField = new PropertyField(targetTransformProperty);
|
||||||
|
targetTransformField.Bind(property.serializedObject);
|
||||||
|
|
||||||
|
var vector3TypeField = new PropertyField(vector3TypeProperty);
|
||||||
|
vector3TypeField.Bind(property.serializedObject);
|
||||||
|
|
||||||
|
// Add fields to layout
|
||||||
|
container.AddToContainer1(valueField);
|
||||||
|
container.AddToContainer1(randomValue1Field);
|
||||||
|
container.AddToContainer1(randomValue2Field);
|
||||||
|
container.AddToContainer1(targetTransformField);
|
||||||
|
container.AddToContainer1(vector3TypeField);
|
||||||
|
|
||||||
|
var dropdownField = new DropdownField(types, valueTypeProperty.enumValueIndex);
|
||||||
|
dropdownField.label = property.displayName + " Type";
|
||||||
|
dropdownField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
valueTypeProperty.enumValueIndex = types.IndexOf(evt.newValue);
|
||||||
|
valueTypeProperty.serializedObject.ApplyModifiedProperties();
|
||||||
|
|
||||||
|
UpdateDisplay();
|
||||||
|
});
|
||||||
|
root.Insert(0,dropdownField);
|
||||||
|
|
||||||
|
// Initial display setup
|
||||||
|
UpdateDisplay();
|
||||||
|
|
||||||
|
container.RegisterCallback<AttachToPanelEvent>(e =>
|
||||||
|
{
|
||||||
|
Undo.undoRedoPerformed += UpdateDisplay;
|
||||||
|
});
|
||||||
|
|
||||||
|
container.RegisterCallback<DetachFromPanelEvent>(e =>
|
||||||
|
{
|
||||||
|
Undo.undoRedoPerformed -= UpdateDisplay;
|
||||||
|
});
|
||||||
|
|
||||||
|
return root;
|
||||||
|
|
||||||
|
// Local function to toggle visibility
|
||||||
|
void UpdateDisplay()
|
||||||
|
{
|
||||||
|
if(currentProperty.IsSerializedPropertyValid() == false) return;
|
||||||
|
valueTypeProperty = currentProperty.FindPropertyRelative("valueType");
|
||||||
|
|
||||||
|
var valueType = (AnimoraValueType)valueTypeProperty.enumValueIndex;
|
||||||
|
dropdownField.value = valueType.ToString();
|
||||||
|
|
||||||
|
switch (valueType)
|
||||||
|
{
|
||||||
|
case AnimoraValueType.Fixed:
|
||||||
|
valueField.SetDisplay(true);
|
||||||
|
randomValue1Field.SetDisplay(false);
|
||||||
|
randomValue2Field.SetDisplay(false);
|
||||||
|
targetTransformField.SetDisplay(false);
|
||||||
|
vector3TypeField.SetDisplay(false);
|
||||||
|
break;
|
||||||
|
case AnimoraValueType.Random:
|
||||||
|
valueField.SetDisplay(false);
|
||||||
|
randomValue1Field.SetDisplay(true);
|
||||||
|
randomValue2Field.SetDisplay(true);
|
||||||
|
targetTransformField.SetDisplay(false);
|
||||||
|
vector3TypeField.SetDisplay(false);
|
||||||
|
break;
|
||||||
|
case AnimoraValueType.Target:
|
||||||
|
valueField.SetDisplay(false);
|
||||||
|
randomValue1Field.SetDisplay(false);
|
||||||
|
randomValue2Field.SetDisplay(false);
|
||||||
|
targetTransformField.SetDisplay(true);
|
||||||
|
vector3TypeField.SetDisplay(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3a01172c07874b7681a619422d2f3235
|
||||||
|
timeCreated: 1743014177
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Drawers/AnimoraValueDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom drawer for <see cref="AnimoraValueGroup{T}"/>.
|
||||||
|
/// Displays a foldout group with a toggle to enable/disable the group and shows all contained values.
|
||||||
|
/// </summary>
|
||||||
|
[CustomPropertyDrawer(typeof(AnimoraValueGroup<>), true)]
|
||||||
|
public class AnimoraValueGroupDrawer : PropertyDrawer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Builds the custom UI for <see cref="AnimoraValueGroup{T}"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="property">The serialized property representing the group.</param>
|
||||||
|
/// <returns>A <see cref="VisualElement"/> representing the value group layout.</returns>
|
||||||
|
public override VisualElement CreatePropertyGUI(SerializedProperty property)
|
||||||
|
{
|
||||||
|
var settingsGroup = OM_FoldoutGroup.CreateSettingsGroup(property.Copy(), property.displayName, "ValueGroup");
|
||||||
|
|
||||||
|
// Enable/disable switcher
|
||||||
|
var enabledProp = property.FindPropertyRelative("enabled");
|
||||||
|
var switcher = OM_Switcher.CreateSwitcher("", enabledProp.Copy(), isEnabled =>
|
||||||
|
{
|
||||||
|
settingsGroup.Content.SetEnabled(isEnabled);
|
||||||
|
});
|
||||||
|
|
||||||
|
switcher.SendToBack();
|
||||||
|
switcher.RegisterCallback<ClickEvent>(e => e.StopImmediatePropagation());
|
||||||
|
settingsGroup.HeaderRightContainer.Add(switcher);
|
||||||
|
|
||||||
|
// Add all other properties as fields
|
||||||
|
foreach (var childProperty in property.GetAllProperties())
|
||||||
|
{
|
||||||
|
if (childProperty.name == "enabled") continue;
|
||||||
|
|
||||||
|
var propertyField = new PropertyField(childProperty);
|
||||||
|
propertyField.Bind(property.serializedObject);
|
||||||
|
settingsGroup.AddToContent(propertyField);
|
||||||
|
}
|
||||||
|
|
||||||
|
return settingsGroup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 86c2e4eee05047feaed69631a58f73c3
|
||||||
|
timeCreated: 1745150048
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Drawers/AnimoraValueGroupDrawer.cs
|
||||||
|
uploadId: 757363
|
||||||
3
Client/Assets/Plugins/OM/Animora/Editor/Inspector.meta
Normal file
3
Client/Assets/Plugins/OM/Animora/Editor/Inspector.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 91df5f6528d142929c6a3600198f59b4
|
||||||
|
timeCreated: 1742666568
|
||||||
@ -0,0 +1,201 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using OM.Editor;
|
||||||
|
using OM.Animora.Runtime;
|
||||||
|
using OM.TimelineCreator.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Custom inspector UI that displays detailed settings for the currently selected <see cref="AnimoraClip"/>.
|
||||||
|
/// Dynamically reacts to timeline selection changes and supports clip interaction, renaming, toggling, and context actions.
|
||||||
|
/// </summary>
|
||||||
|
public class AnimoraInspector : VisualElement
|
||||||
|
{
|
||||||
|
private readonly AnimoraPlayerEditor _playerEditor;
|
||||||
|
private readonly AnimoraPlayer _player;
|
||||||
|
private readonly AnimoraTimeline _timeline;
|
||||||
|
|
||||||
|
private OM_Track<AnimoraClip, AnimoraTrack> SelectedTrack { get; set; }
|
||||||
|
|
||||||
|
private readonly VisualElement _container;
|
||||||
|
private PropertyField _clipPropertyField;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the inspector for the given <see cref="AnimoraPlayerEditor"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="playerEditor">The parent editor instance.</param>
|
||||||
|
public AnimoraInspector(AnimoraPlayerEditor playerEditor)
|
||||||
|
{
|
||||||
|
_playerEditor = playerEditor;
|
||||||
|
_player = playerEditor.Player;
|
||||||
|
_timeline = playerEditor.AnimoraTimeline;
|
||||||
|
|
||||||
|
_container = new VisualElement();
|
||||||
|
_container.AddClassNames("inspector");
|
||||||
|
Add(_container);
|
||||||
|
|
||||||
|
_timeline.OnSelectedTrackChanged += TimelineOnOnSelectedTrackChanged;
|
||||||
|
TimelineOnOnSelectedTrackChanged(_timeline.SelectedTrack);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the selected track changes in the timeline.
|
||||||
|
/// </summary>
|
||||||
|
private void TimelineOnOnSelectedTrackChanged(OM_Track<AnimoraClip, AnimoraTrack> track)
|
||||||
|
{
|
||||||
|
SelectedTrack = track;
|
||||||
|
RefreshInspector();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Hides the inspector UI.
|
||||||
|
/// </summary>
|
||||||
|
private void HideInspector()
|
||||||
|
{
|
||||||
|
_container.Clear();
|
||||||
|
_container.SetDisplay(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rebuilds the inspector UI for the currently selected track/clip.
|
||||||
|
/// </summary>
|
||||||
|
public virtual void RefreshInspector()
|
||||||
|
{
|
||||||
|
if (SelectedTrack == null)
|
||||||
|
{
|
||||||
|
HideInspector();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var selectedClipIndex = _player.GetClips().ToList().IndexOf(SelectedTrack.Clip);
|
||||||
|
if (selectedClipIndex == -1)
|
||||||
|
{
|
||||||
|
HideInspector();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var clipsManagerProp = _playerEditor.serializedObject.FindProperty("clipsManager");
|
||||||
|
var clipsProp = clipsManagerProp.FindPropertyRelative("clips");
|
||||||
|
|
||||||
|
if (clipsProp == null || selectedClipIndex >= clipsProp.arraySize)
|
||||||
|
{
|
||||||
|
HideInspector();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_container.Clear();
|
||||||
|
_container.SetDisplay(true);
|
||||||
|
|
||||||
|
var selectedClipProp = clipsProp.GetArrayElementAtIndex(selectedClipIndex);
|
||||||
|
var clip = selectedClipProp.GetValueCustom(true);
|
||||||
|
|
||||||
|
// Header
|
||||||
|
var header = new VisualElement();
|
||||||
|
header.AddClassNames("inspector-header");
|
||||||
|
_container.Add(header);
|
||||||
|
|
||||||
|
// IsActive toggle
|
||||||
|
var isActiveProp = selectedClipProp.FindPropertyRelative("isActive");
|
||||||
|
var isActiveSwitcher = OM_Switcher.CreateSwitcher("", isActiveProp.Copy(), isActive =>
|
||||||
|
{
|
||||||
|
isActiveProp.boolValue = isActive;
|
||||||
|
_clipPropertyField.SetEnabled(isActive);
|
||||||
|
});
|
||||||
|
header.Add(isActiveSwitcher);
|
||||||
|
|
||||||
|
// Clip name field
|
||||||
|
var clipNameProp = selectedClipProp.FindPropertyRelative("clipName");
|
||||||
|
var nameField = new TextField(clipNameProp.stringValue)
|
||||||
|
{
|
||||||
|
label = ""
|
||||||
|
};
|
||||||
|
nameField.AddClassNames("inspector-header-name-field");
|
||||||
|
nameField.BindProperty(clipNameProp);
|
||||||
|
nameField.Bind(_playerEditor.serializedObject);
|
||||||
|
header.Add(nameField);
|
||||||
|
|
||||||
|
// Context menu button
|
||||||
|
var contextMenuButton = new Button
|
||||||
|
{
|
||||||
|
text = "⋮"
|
||||||
|
};
|
||||||
|
contextMenuButton.AddToClassList("inspector-header-context-menu-button");
|
||||||
|
contextMenuButton.clicked += () =>
|
||||||
|
{
|
||||||
|
var menu = new GenericMenu();
|
||||||
|
|
||||||
|
menu.AddItem(new GUIContent("Edit Script"), false, () =>
|
||||||
|
{
|
||||||
|
OMEditorUtility.OpenScriptInEditorByName(clip.GetType().Name);
|
||||||
|
});
|
||||||
|
|
||||||
|
menu.AddItem(new GUIContent("Reset"), false, () =>
|
||||||
|
{
|
||||||
|
if (clip is AnimoraClip animoraClip)
|
||||||
|
{
|
||||||
|
animoraClip.Reset();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("Clip is null or not of type AnimoraClip");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Context menu actions via [ContextMenu]
|
||||||
|
var value = selectedClipProp.GetValue();
|
||||||
|
var methodInfos = value.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||||
|
var separatorAdded = false;
|
||||||
|
|
||||||
|
foreach (var methodInfo in methodInfos)
|
||||||
|
{
|
||||||
|
var contextAttr = methodInfo.GetCustomAttribute<ContextMenu>();
|
||||||
|
if (contextAttr != null)
|
||||||
|
{
|
||||||
|
if (!separatorAdded)
|
||||||
|
{
|
||||||
|
menu.AddSeparator("");
|
||||||
|
separatorAdded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.AddItem(new GUIContent(contextAttr.menuItem), false, () =>
|
||||||
|
{
|
||||||
|
var parameters = methodInfo.GetParameters();
|
||||||
|
methodInfo.Invoke(value, parameters.Length == 0 ? null : new object[] { _player });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.ShowAsContext();
|
||||||
|
};
|
||||||
|
header.Add(contextMenuButton);
|
||||||
|
|
||||||
|
if (OMEditorUtility.GetScriptByName(SelectedTrack.Clip.GetType().Name,out var script))
|
||||||
|
{
|
||||||
|
var scriptField = new ObjectField("Script")
|
||||||
|
{
|
||||||
|
objectType = typeof(MonoScript),
|
||||||
|
value = script
|
||||||
|
};
|
||||||
|
scriptField.AddClassNames("inspector-header-script-field");
|
||||||
|
_container.Add(scriptField);
|
||||||
|
scriptField.SetEnabled(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var clipName = new Label(SelectedTrack.Clip.GetType().Name);
|
||||||
|
clipName.AddClassNames("inspector-header-clip-name");
|
||||||
|
_container.Add(clipName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full clip inspector
|
||||||
|
_clipPropertyField = new PropertyField(selectedClipProp);
|
||||||
|
_clipPropertyField.Bind(_playerEditor.serializedObject);
|
||||||
|
_container.Add(_clipPropertyField);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1f2edb1fe29843009e55ff9e0f786498
|
||||||
|
timeCreated: 1742666575
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Inspector/AnimoraInspector.cs
|
||||||
|
uploadId: 757363
|
||||||
3
Client/Assets/Plugins/OM/Animora/Editor/Resources.meta
Normal file
3
Client/Assets/Plugins/OM/Animora/Editor/Resources.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e93f1f83c7a64eeba7c6eea72c58d8c5
|
||||||
|
timeCreated: 1742858087
|
||||||
102
Client/Assets/Plugins/OM/Animora/Editor/Resources/Animora.uss
Normal file
102
Client/Assets/Plugins/OM/Animora/Editor/Resources/Animora.uss
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
.inspector{
|
||||||
|
padding: 5px ;
|
||||||
|
background-color: #313131;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-top: 10px;
|
||||||
|
border-width: 1px;
|
||||||
|
border-color: rgb(30, 30, 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
.inspector-header{
|
||||||
|
flex-direction: row;
|
||||||
|
padding: 0;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
border-radius: 3px;
|
||||||
|
border-width: 0;
|
||||||
|
border-color: rgb(30, 30, 30);
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.context-menu-button{
|
||||||
|
margin-left: 5px;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
background-color: #3f3f3f;
|
||||||
|
border-radius: 5px;
|
||||||
|
border-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.context-menu-button:hover{
|
||||||
|
background-color: #4f4f4f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inspector-label{
|
||||||
|
-unity-text-align: middle-center;
|
||||||
|
color: #8f8f8f;
|
||||||
|
font-size: 16px;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inspector-header TextField{
|
||||||
|
height: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inspector-header-name-field{
|
||||||
|
padding-left: 10px;
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inspector-header-context-menu-button{
|
||||||
|
margin-left: 10px;
|
||||||
|
width: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.main-settings-group{
|
||||||
|
margin-bottom: 20px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes flash-border {
|
||||||
|
0% { border-color: red; }
|
||||||
|
50% { border-color: transparent; }
|
||||||
|
100% { border-color: red; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.flashing-border {
|
||||||
|
border-width: 3px;
|
||||||
|
border-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control-section{
|
||||||
|
padding: 5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
margin-top: 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: #3f3f3f;
|
||||||
|
border-width: 1px;
|
||||||
|
border-color: rgb(30, 30, 30);
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control-section-btn{
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-right: 5px;
|
||||||
|
padding: 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: #3f3f3f;
|
||||||
|
border-width: 1px;
|
||||||
|
border-color: rgb(30, 30, 30);
|
||||||
|
min-width: 30px;
|
||||||
|
min-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control-section-btn:hover{
|
||||||
|
background-color: #4f4f4f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.control-section-btn #Icon{
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 813f65a1298949b29a6b11eff4c18064
|
||||||
|
timeCreated: 1742858097
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Resources/Animora.uss
|
||||||
|
uploadId: 757363
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
.actions-manager-container{
|
||||||
|
padding-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.drop-area{
|
||||||
|
padding: 5px;
|
||||||
|
border-radius: 5px 5px 0 5px;
|
||||||
|
border-width: 1px;
|
||||||
|
border-color: #818181;
|
||||||
|
min-height: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.drop-area-add-button{
|
||||||
|
position: absolute;
|
||||||
|
right: -4px;
|
||||||
|
bottom: -26px;
|
||||||
|
width: 30px;
|
||||||
|
height: 25px;
|
||||||
|
background-color: rgba(255,0,0,0);
|
||||||
|
border-radius: 0 0 5px 5px;
|
||||||
|
color: white;
|
||||||
|
justify-content: center;
|
||||||
|
border-width: 1px;
|
||||||
|
border-color: #818181;
|
||||||
|
cursor: link;
|
||||||
|
}
|
||||||
|
|
||||||
|
.drop-area-add-button:hover{
|
||||||
|
background-color: #afa79e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.drop-area-header{
|
||||||
|
-unity-text-align: middle-center;
|
||||||
|
color: #8f8f8f;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.drop-area-header-line{
|
||||||
|
width: 1px;
|
||||||
|
height: 8px;
|
||||||
|
background-color: #818181;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-layer{
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 277a1be5f7094d17ac4357ce12a59aa5
|
||||||
|
timeCreated: 1743260809
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Resources/AnimoraActionsManager.uss
|
||||||
|
uploadId: 757363
|
||||||
3
Client/Assets/Plugins/OM/Animora/Editor/Saving.meta
Normal file
3
Client/Assets/Plugins/OM/Animora/Editor/Saving.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4769bdf42e2040f58b23c651702fdf62
|
||||||
|
timeCreated: 1744724459
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
using OM.Animora.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace OM.Animora.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides utility methods to save and load <see cref="AnimoraPlayer"/> state to/from a `.animora` JSON file.
|
||||||
|
/// </summary>
|
||||||
|
public static class AnimoraSaveManager
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Serializes the current <see cref="AnimoraPlayer"/> state to JSON and saves it to a file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="player">The <see cref="AnimoraPlayer"/> to save.</param>
|
||||||
|
public static void Save(AnimoraPlayer player)
|
||||||
|
{
|
||||||
|
if (player == null) return;
|
||||||
|
|
||||||
|
var json = JsonUtility.ToJson(player.GetSaveData());
|
||||||
|
|
||||||
|
var path = EditorUtility.SaveFilePanel("Save Animora Player", Application.dataPath, "AnimoraPlayer.animora", "animora");
|
||||||
|
if (string.IsNullOrEmpty(path)) return;
|
||||||
|
|
||||||
|
System.IO.File.WriteAllText(path, json);
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads a previously saved `.animora` file and applies it to the given <see cref="AnimoraPlayer"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="player">The <see cref="AnimoraPlayer"/> to apply the loaded data to.</param>
|
||||||
|
public static void Load(AnimoraPlayer player)
|
||||||
|
{
|
||||||
|
var path = EditorUtility.OpenFilePanel("Load Timeline", Application.dataPath, "animora");
|
||||||
|
if (string.IsNullOrEmpty(path)) return;
|
||||||
|
|
||||||
|
var json = System.IO.File.ReadAllText(path);
|
||||||
|
var animoraPlayerSaveData = JsonUtility.FromJson<AnimoraPlayerSaveData>(json);
|
||||||
|
|
||||||
|
player.LoadSaveData(animoraPlayerSaveData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 69f6dbabf65f4d5b91803c801f145b19
|
||||||
|
timeCreated: 1744724468
|
||||||
|
AssetOrigin:
|
||||||
|
serializedVersion: 1
|
||||||
|
productId: 180030
|
||||||
|
packageName: Animora UI Animation (Tweening Timeline)
|
||||||
|
packageVersion: 1.2
|
||||||
|
assetPath: Assets/Plugins/OM/Animora/Editor/Saving/AnimoraSaveManager.cs
|
||||||
|
uploadId: 757363
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user