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