1
This commit is contained in:
parent
70e7a2b50e
commit
514cbee907
@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 7d1e2719ed0804fc883125b180f9f3e4
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: f14bd7cfdc23945d7940874e1cb37674
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 0a8f52f23fc574fea87e42829776d16e
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -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
@ -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 |
@ -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
|
|
||||||
@ -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 |
@ -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
@ -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
|
|
||||||
@ -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
@ -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
|
|
||||||
@ -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}
|
|
||||||
@ -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
|
|
||||||
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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
@ -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
|
|
||||||
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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
@ -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
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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
@ -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
|
|
||||||
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
@ -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
|
|
||||||
@ -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
@ -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 |
@ -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
|
|
||||||
Binary file not shown.
@ -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
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: a5775f8e89af34cf09174f1a73585cd0
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 8a5007aef86543faa663469a785163d1
|
|
||||||
timeCreated: 1743100420
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 2f11b06c9beb48c884f5d710c0df97fe
|
|
||||||
timeCreated: 1743626298
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 95b75df8010546e296893b6bccba6f3f
|
|
||||||
timeCreated: 1742483377
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: dfa4c864452f405c97ffbdb300135563
|
|
||||||
timeCreated: 1743014109
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 91df5f6528d142929c6a3600198f59b4
|
|
||||||
timeCreated: 1742666568
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: e93f1f83c7a64eeba7c6eea72c58d8c5
|
|
||||||
timeCreated: 1742858087
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 4769bdf42e2040f58b23c651702fdf62
|
|
||||||
timeCreated: 1744724459
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 8adfa4dac75c4a768345f4bfb62a5334
|
|
||||||
timeCreated: 1742493420
|
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
@ -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
Loading…
Reference in New Issue
Block a user