This commit is contained in:
陈思海 2025-11-18 11:28:10 +08:00
parent 70e7a2b50e
commit 514cbee907
624 changed files with 59 additions and 92392 deletions

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 7d1e2719ed0804fc883125b180f9f3e4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: f14bd7cfdc23945d7940874e1cb37674
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 0a8f52f23fc574fea87e42829776d16e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: dc364c8fed26c47bcb452322f48d6a1a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 975 KiB

View File

@ -1,200 +0,0 @@
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

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 8a2bdc87181b847a6a8e3a96bc29f3d0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -1,310 +0,0 @@
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

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
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

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 2bca89fbbf1544afe8a45f0c0190edb5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
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

View File

@ -1,893 +0,0 @@
%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}

View File

@ -1,14 +0,0 @@
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

View File

@ -1,39 +0,0 @@
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();
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c18f647a5a7164039b6952497c059fe1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
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

View File

@ -1,33 +0,0 @@
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();
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e01839547d6cf4670ab8f7ebff1eed13
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
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

View File

@ -1,52 +0,0 @@
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
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 822ba7df12c1e480e8977ce4c4f55f14
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
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

View File

@ -1,41 +0,0 @@
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();
}
}
}
}

View File

@ -1,18 +0,0 @@
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

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +0,0 @@
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

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c25098f671c0d4694b6fe2ae7ae16555
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

@ -1,15 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 2.8 MiB

View File

@ -1,134 +0,0 @@
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

View File

@ -1,14 +0,0 @@
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

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a5775f8e89af34cf09174f1a73585cd0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 8a5007aef86543faa663469a785163d1
timeCreated: 1743100420

View File

@ -1,95 +0,0 @@
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);
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,67 +0,0 @@
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;
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,46 +0,0 @@
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");
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,268 +0,0 @@
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;
}
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,68 +0,0 @@
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);
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,279 +0,0 @@
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();
}
}
}

View File

@ -1,18 +0,0 @@
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

View File

@ -1,102 +0,0 @@
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);
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,22 +0,0 @@
{
"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
}

View File

@ -1,14 +0,0 @@
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

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 2f11b06c9beb48c884f5d710c0df97fe
timeCreated: 1743626298

View File

@ -1,83 +0,0 @@
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;
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 95b75df8010546e296893b6bccba6f3f
timeCreated: 1742483377

View File

@ -1,29 +0,0 @@
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);
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,41 +0,0 @@
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);
}
}
}
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,285 +0,0 @@
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()
.Where(t=>!t.FullName.Contains("Odin"))
.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];
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,157 +0,0 @@
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;
}
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,50 +0,0 @@
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();
}
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: dfa4c864452f405c97ffbdb300135563
timeCreated: 1743014109

View File

@ -1,100 +0,0 @@
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;
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,101 +0,0 @@
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;
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,177 +0,0 @@
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;
}
}
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,49 +0,0 @@
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;
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 91df5f6528d142929c6a3600198f59b4
timeCreated: 1742666568

View File

@ -1,201 +0,0 @@
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);
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: e93f1f83c7a64eeba7c6eea72c58d8c5
timeCreated: 1742858087

View File

@ -1,102 +0,0 @@
.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;
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,51 +0,0 @@
.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;
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 4769bdf42e2040f58b23c651702fdf62
timeCreated: 1744724459

View File

@ -1,44 +0,0 @@
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);
}
}
}

View File

@ -1,10 +0,0 @@
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

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 8adfa4dac75c4a768345f4bfb62a5334
timeCreated: 1742493420

View File

@ -1,75 +0,0 @@
using OM.Editor;
using OM.Animora.Runtime;
using OM.TimelineCreator.Editor;
using OM.Animora.Editor;
namespace OM.Animora.Editor
{
/// <summary>
/// Timeline editor implementation for <see cref="AnimoraPlayer"/>.
/// Manages tracks for <see cref="AnimoraClip"/>s and controls timeline preview behavior.
/// </summary>
public class AnimoraTimeline : OM_Timeline<AnimoraClip, AnimoraTrack>
{
/// <summary>
/// Reference to the parent editor managing this timeline.
/// </summary>
public AnimoraPlayerEditor PlayerEditor { get; }
/// <summary>
/// Constructs the Animora timeline and links it to its owner and player editor.
/// </summary>
/// <param name="timelineEditorOwner">The owning timeline editor context.</param>
/// <param name="playerEditor">The editor for the associated <see cref="AnimoraPlayer"/>.</param>
public AnimoraTimeline(IOM_TimelineEditorOwner<AnimoraClip> timelineEditorOwner, AnimoraPlayerEditor playerEditor)
: base(timelineEditorOwner, playerEditor.Player)
{
PlayerEditor = playerEditor;
}
/// <summary>
/// Opens the search popup to add a new <see cref="AnimoraClip"/> as a timeline track.
/// </summary>
public override void OnAddTrackClicked()
{
OM_SearchPopup.Open(this, PlayerEditor);
}
/// <summary>
/// Instantiates and initializes a new <see cref="AnimoraTrack"/> for a given clip.
/// </summary>
/// <param name="clip">The <see cref="AnimoraClip"/> to wrap in a track.</param>
/// <returns>A new initialized <see cref="AnimoraTrack"/>.</returns>
public override AnimoraTrack CreateTrack(AnimoraClip clip)
{
var track = new AnimoraTrack(this, clip, PlayerEditor);
track.Init();
return track;
}
/// <summary>
/// Updates the <see cref="AnimoraPlayer"/> preview state at the specified time.
/// </summary>
/// <param name="elapsedTime">The time to evaluate preview state at.</param>
public override void UpdatePreviewElapsedTime(float elapsedTime)
{
PlayerEditor.Player.EvaluatePreview(elapsedTime);
}
/// <summary>
/// Called when entering or exiting preview mode. Resets cursor and notifies all tracks and the player.
/// </summary>
/// <param name="isPreviewing">Whether the timeline is currently previewing.</param>
protected override void OnPreviewStateChanged(bool isPreviewing)
{
SetCursorTime(0);
foreach (var track in TracksList)
{
track.OnPreviewStateChanged(isPreviewing);
}
PlayerEditor.Player.OnPreviewStateChanged(isPreviewing);
}
}
}

View File

@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: fb1e1d0b433d4075beb97ed2ac276a4a
timeCreated: 1742493428
AssetOrigin:
serializedVersion: 1
productId: 180030
packageName: Animora UI Animation (Tweening Timeline)
packageVersion: 1.2
assetPath: Assets/Plugins/OM/Animora/Editor/Timeline/AnimoraTimeline.cs
uploadId: 757363

View File

@ -1,85 +0,0 @@
using System.Linq;
using System.Reflection;
using OM.Animora.Runtime;
using OM.TimelineCreator.Editor;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
namespace OM.Animora.Editor
{
/// <summary>
/// Represents a timeline track for an <see cref="AnimoraClip"/> in the Animora timeline editor.
/// Handles icon display, drag-and-drop behavior, and target highlighting.
/// </summary>
public class AnimoraTrack : OM_Track<AnimoraClip, AnimoraTrack>
{
/// <summary>
/// The underlying clip represented by this track.
/// </summary>
public AnimoraClip AnimoraClip { get; private set; }
/// <summary>
/// Reference to the parent editor that owns the timeline.
/// </summary>
public AnimoraPlayerEditor AnimoraPlayerEditor { get; private set; }
/// <summary>
/// Initializes a new instance of the <see cref="AnimoraTrack"/> class.
/// </summary>
/// <param name="timeline">The timeline instance this track belongs to.</param>
/// <param name="clip">The clip associated with this track.</param>
/// <param name="animoraPlayerEditor">The editor that owns the timeline/player.</param>
public AnimoraTrack(OM_Timeline<AnimoraClip, AnimoraTrack> timeline, AnimoraClip clip, AnimoraPlayerEditor animoraPlayerEditor)
: base(timeline, clip)
{
AnimoraClip = clip;
AnimoraPlayerEditor = animoraPlayerEditor;
}
/// <summary>
/// Called when the track icon is clicked.
/// Pings the first target object of the clip in the editor (if any).
/// </summary>
public override void OnIconClicked()
{
base.OnIconClicked();
if (AnimoraClip.GetTargets().Count > 0)
{
EditorGUIUtility.PingObject(AnimoraClip.GetTargets().FirstOrDefault());
}
}
/// <summary>
/// Retrieves the icon to display for this clip's track.
/// Falls back to the default Unity "AnimationClip" icon if none is specified.
/// </summary>
/// <returns>A <see cref="Texture2D"/> representing the icon.</returns>
public override Texture2D GetClipIcon()
{
var iconAttribute = AnimoraClip.GetType().GetCustomAttribute<AnimoraIconAttribute>();
if (iconAttribute == null)
return EditorGUIUtility.IconContent("AnimationClip Icon").image as Texture2D;
var icon = iconAttribute.GetIcon();
return icon != null ? icon : EditorGUIUtility.IconContent("AnimationClip Icon").image as Texture2D;
}
/// <summary>
/// Handles drag-and-drop logic when objects are dropped on the track.
/// Passes the dropped objects to the clip's <see cref="AnimoraClip.OnDrop"/> method.
/// </summary>
/// <param name="e">The drag perform event.</param>
protected override void OnDragPerform(DragPerformEvent e)
{
Timeline.TimelinePlayer.RecordUndo("On Drop Performed");
if (AnimoraClip.OnDrop(DragAndDrop.objectReferences, Timeline.TimelinePlayer))
{
DragAndDrop.AcceptDrag();
Timeline.TimelinePlayer.OnValidate();
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More