slambb hace 2 años
padre
commit
207f8d79d0
Se han modificado 100 ficheros con 7535 adiciones y 0 borrados
  1. 8 0
      Assets/DuckHunter/Animations.meta
  2. 8 0
      Assets/DuckHunter/Animations/Dog.meta
  3. 21 0
      Assets/DuckHunter/Animations/Dog/dog_Data.asset
  4. 8 0
      Assets/DuckHunter/Animations/Dog/dog_Data.asset.meta
  5. 0 0
      Assets/DuckHunter/Animations/Dog/dog_ske.json
  6. 7 0
      Assets/DuckHunter/Animations/Dog/dog_ske.json.meta
  7. 1 0
      Assets/DuckHunter/Animations/Dog/dog_tex.json
  8. 7 0
      Assets/DuckHunter/Animations/Dog/dog_tex.json.meta
  9. BIN
      Assets/DuckHunter/Animations/Dog/dog_tex.png
  10. 96 0
      Assets/DuckHunter/Animations/Dog/dog_tex.png.meta
  11. 38 0
      Assets/DuckHunter/Animations/Dog/dog_tex_Mat.mat
  12. 8 0
      Assets/DuckHunter/Animations/Dog/dog_tex_Mat.mat.meta
  13. 37 0
      Assets/DuckHunter/Animations/Dog/dog_tex_UI_Mat.mat
  14. 8 0
      Assets/DuckHunter/Animations/Dog/dog_tex_UI_Mat.mat.meta
  15. 8 0
      Assets/DuckHunter/Animations/DogSide.meta
  16. 21 0
      Assets/DuckHunter/Animations/DogSide/dog_side_Data.asset
  17. 8 0
      Assets/DuckHunter/Animations/DogSide/dog_side_Data.asset.meta
  18. 0 0
      Assets/DuckHunter/Animations/DogSide/dog_side_ske.json
  19. 7 0
      Assets/DuckHunter/Animations/DogSide/dog_side_ske.json.meta
  20. 1 0
      Assets/DuckHunter/Animations/DogSide/dog_side_tex.json
  21. 7 0
      Assets/DuckHunter/Animations/DogSide/dog_side_tex.json.meta
  22. BIN
      Assets/DuckHunter/Animations/DogSide/dog_side_tex.png
  23. 96 0
      Assets/DuckHunter/Animations/DogSide/dog_side_tex.png.meta
  24. 38 0
      Assets/DuckHunter/Animations/DogSide/dog_side_tex_Mat.mat
  25. 8 0
      Assets/DuckHunter/Animations/DogSide/dog_side_tex_Mat.mat.meta
  26. 37 0
      Assets/DuckHunter/Animations/DogSide/dog_side_tex_UI_Mat.mat
  27. 8 0
      Assets/DuckHunter/Animations/DogSide/dog_side_tex_UI_Mat.mat.meta
  28. 8 0
      Assets/DuckHunter/Animations/Duck01.meta
  29. 21 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_Data.asset
  30. 8 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_Data.asset.meta
  31. 0 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_ske.json
  32. 7 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_ske.json.meta
  33. 1 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex.json
  34. 7 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex.json.meta
  35. BIN
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex.png
  36. 96 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex.png.meta
  37. 38 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex_Mat.mat
  38. 8 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex_Mat.mat.meta
  39. 37 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex_UI_Mat.mat
  40. 8 0
      Assets/DuckHunter/Animations/Duck01/yazi_01_tex_UI_Mat.mat.meta
  41. 8 0
      Assets/DuckHunter/Animations/Duck02.meta
  42. 21 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_Data.asset
  43. 8 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_Data.asset.meta
  44. 0 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_ske.json
  45. 7 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_ske.json.meta
  46. 1 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex.json
  47. 7 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex.json.meta
  48. BIN
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex.png
  49. 96 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex.png.meta
  50. 38 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex_Mat.mat
  51. 8 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex_Mat.mat.meta
  52. 37 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex_UI_Mat.mat
  53. 8 0
      Assets/DuckHunter/Animations/Duck02/yazi_02_tex_UI_Mat.mat.meta
  54. 8 0
      Assets/DuckHunter/Animations/Duck03.meta
  55. 21 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_Data.asset
  56. 8 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_Data.asset.meta
  57. 0 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_ske.json
  58. 7 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_ske.json.meta
  59. 1 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex.json
  60. 7 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex.json.meta
  61. BIN
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex.png
  62. 96 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex.png.meta
  63. 38 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex_Mat.mat
  64. 8 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex_Mat.mat.meta
  65. 37 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex_UI_Mat.mat
  66. 8 0
      Assets/DuckHunter/Animations/Duck03/yazi_03_tex_UI_Mat.mat.meta
  67. 8 0
      Assets/DuckHunter/ColorPicker.meta
  68. 8 0
      Assets/DuckHunter/ColorPicker/Scripts.meta
  69. 66 0
      Assets/DuckHunter/ColorPicker/Scripts/ColorPalette.cs
  70. 12 0
      Assets/DuckHunter/ColorPicker/Scripts/ColorPalette.cs.meta
  71. 497 0
      Assets/DuckHunter/ColorPicker/Scripts/ColorPicker.cs
  72. 12 0
      Assets/DuckHunter/ColorPicker/Scripts/ColorPicker.cs.meta
  73. 273 0
      Assets/DuckHunter/ColorPicker/Scripts/ColoredTape.cs
  74. 11 0
      Assets/DuckHunter/ColorPicker/Scripts/ColoredTape.cs.meta
  75. 184 0
      Assets/DuckHunter/ColorPicker/Scripts/GUIBox.cs
  76. 11 0
      Assets/DuckHunter/ColorPicker/Scripts/GUIBox.cs.meta
  77. 8 0
      Assets/DuckHunter/DragonBones.meta
  78. 8 0
      Assets/DuckHunter/DragonBones/Editor.meta
  79. 184 0
      Assets/DuckHunter/DragonBones/Editor/AssetProcess.cs
  80. 12 0
      Assets/DuckHunter/DragonBones/Editor/AssetProcess.cs.meta
  81. 116 0
      Assets/DuckHunter/DragonBones/Editor/DragonBonesIcons.cs
  82. 12 0
      Assets/DuckHunter/DragonBones/Editor/DragonBonesIcons.cs.meta
  83. 130 0
      Assets/DuckHunter/DragonBones/Editor/PickJsonDataWindow.cs
  84. 12 0
      Assets/DuckHunter/DragonBones/Editor/PickJsonDataWindow.cs.meta
  85. 141 0
      Assets/DuckHunter/DragonBones/Editor/ShowSlotsWindow.cs
  86. 12 0
      Assets/DuckHunter/DragonBones/Editor/ShowSlotsWindow.cs.meta
  87. 481 0
      Assets/DuckHunter/DragonBones/Editor/UnityArmatureEditor.cs
  88. 12 0
      Assets/DuckHunter/DragonBones/Editor/UnityArmatureEditor.cs.meta
  89. 478 0
      Assets/DuckHunter/DragonBones/Editor/UnityEditor.cs
  90. 12 0
      Assets/DuckHunter/DragonBones/Editor/UnityEditor.cs.meta
  91. 8 0
      Assets/DuckHunter/DragonBones/Scripts.meta
  92. 8 0
      Assets/DuckHunter/DragonBones/Scripts/3rdParty.meta
  93. 549 0
      Assets/DuckHunter/DragonBones/Scripts/3rdParty/MiniJSON.cs
  94. 12 0
      Assets/DuckHunter/DragonBones/Scripts/3rdParty/MiniJSON.cs.meta
  95. 8 0
      Assets/DuckHunter/DragonBones/Scripts/animation.meta
  96. 1050 0
      Assets/DuckHunter/DragonBones/Scripts/animation/AnimationDB.cs
  97. 11 0
      Assets/DuckHunter/DragonBones/Scripts/animation/AnimationDB.cs.meta
  98. 1500 0
      Assets/DuckHunter/DragonBones/Scripts/animation/AnimationState.cs
  99. 12 0
      Assets/DuckHunter/DragonBones/Scripts/animation/AnimationState.cs.meta
  100. 474 0
      Assets/DuckHunter/DragonBones/Scripts/animation/BaseTimelineState.cs

+ 8 - 0
Assets/DuckHunter/Animations.meta

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

+ 8 - 0
Assets/DuckHunter/Animations/Dog.meta

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

+ 21 - 0
Assets/DuckHunter/Animations/Dog/dog_Data.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1a64e5b0e436d4bed9780211ae245f7b, type: 3}
+  m_Name: dog_Data
+  m_EditorClassIdentifier: 
+  dataName: dog
+  dragonBonesJSON: {fileID: 4900000, guid: 5cd479486fc0f9a449e45aeb317cd5de, type: 3}
+  textureAtlas:
+  - textureAtlasJSON: {fileID: 4900000, guid: 80fc35a24c40fc14d98752d15b6fe6bc, type: 3}
+    texture: {fileID: 2800000, guid: 3945c5d1671c5b748995e4e7d053b27b, type: 3}
+    material: {fileID: 2100000, guid: b4c45b5d17b07a94cb82e64c5b4fe09c, type: 2}
+    uiMaterial: {fileID: 2100000, guid: 2bb01292e31f7e0438bfd1ea59cc890b, type: 2}

+ 8 - 0
Assets/DuckHunter/Animations/Dog/dog_Data.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b5056a64e7e35ee4291d67facbcaad92
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
Assets/DuckHunter/Animations/Dog/dog_ske.json


+ 7 - 0
Assets/DuckHunter/Animations/Dog/dog_ske.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5cd479486fc0f9a449e45aeb317cd5de
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 0
Assets/DuckHunter/Animations/Dog/dog_tex.json

@@ -0,0 +1 @@
+{"width":512,"SubTexture":[{"frameY":-1,"y":1,"frameWidth":151,"frameHeight":151,"width":149,"height":149,"name":"shenti","frameX":-1,"x":169},{"frameY":-1,"y":192,"frameWidth":53,"frameHeight":72,"width":51,"height":70,"name":"erduo2","frameX":-1,"x":418},{"frameY":-1,"y":242,"frameWidth":53,"frameHeight":72,"width":51,"height":70,"name":"erduo1","frameX":-1,"x":150},{"frameY":-1,"y":1,"frameWidth":168,"frameHeight":148,"width":166,"height":146,"name":"lian","frameX":-1,"x":1},{"frameY":-1,"y":261,"frameWidth":79,"frameHeight":29,"width":77,"height":27,"name":"yanj1","frameX":-1,"x":203},{"frameY":-1,"y":282,"frameWidth":78,"frameHeight":33,"width":76,"height":31,"name":"yanjing2","frameX":-1,"x":1},{"frameY":-1,"y":152,"frameWidth":33,"frameHeight":26,"width":31,"height":24,"name":"bizi2","frameX":-1,"x":248},{"frameY":-1,"y":152,"frameWidth":33,"frameHeight":24,"width":31,"height":22,"name":"bizi","frameX":-1,"x":281},{"frameY":-1,"y":130,"frameWidth":91,"frameHeight":62,"width":89,"height":60,"name":"zuiba1","frameX":-1,"x":418},{"frameY":-1,"y":220,"frameWidth":98,"frameHeight":41,"width":96,"height":39,"name":"zuiba2","frameX":-1,"x":248},{"frameY":-1,"y":1,"frameWidth":153,"frameHeight":129,"width":151,"height":127,"name":"shoubi3","frameX":-1,"x":320},{"width":96,"y":152,"height":88,"name":"zhuayazi2","x":150},{"frameY":-1,"y":149,"frameWidth":149,"frameHeight":133,"width":147,"height":131,"name":"shoubi4","frameX":-1,"x":1},{"width":96,"y":130,"height":88,"name":"zhuayazi1x","x":320}],"height":512,"name":"dog","imagePath":"dog_tex.png"}

+ 7 - 0
Assets/DuckHunter/Animations/Dog/dog_tex.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 80fc35a24c40fc14d98752d15b6fe6bc
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/DuckHunter/Animations/Dog/dog_tex.png


+ 96 - 0
Assets/DuckHunter/Animations/Dog/dog_tex.png.meta

@@ -0,0 +1,96 @@
+fileFormatVersion: 2
+guid: 3945c5d1671c5b748995e4e7d053b27b
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    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
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  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: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 38 - 0
Assets/DuckHunter/Animations/Dog/dog_tex_Mat.mat

@@ -0,0 +1,38 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: dog_tex_Mat
+  m_Shader: {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 3945c5d1671c5b748995e4e7d053b27b, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - PixelSnap: 0
+    - _EnableExternalAlpha: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _Flip: {r: 1, g: 1, b: 1, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Dog/dog_tex_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b4c45b5d17b07a94cb82e64c5b4fe09c
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 37 - 0
Assets/DuckHunter/Animations/Dog/dog_tex_UI_Mat.mat

@@ -0,0 +1,37 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: dog_tex_UI_Mat
+  m_Shader: {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 3945c5d1671c5b748995e4e7d053b27b, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _ColorMask: 15
+    - _Stencil: 0
+    - _StencilComp: 8
+    - _StencilOp: 0
+    - _StencilReadMask: 255
+    - _StencilWriteMask: 255
+    - _UseUIAlphaClip: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Dog/dog_tex_UI_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2bb01292e31f7e0438bfd1ea59cc890b
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/Animations/DogSide.meta

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

+ 21 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_Data.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1a64e5b0e436d4bed9780211ae245f7b, type: 3}
+  m_Name: dog_side_Data
+  m_EditorClassIdentifier: 
+  dataName: dog_side
+  dragonBonesJSON: {fileID: 4900000, guid: fbee70b3e216b98469f20bb76249d2d9, type: 3}
+  textureAtlas:
+  - textureAtlasJSON: {fileID: 4900000, guid: 567d39e504dfce848a3d504cac0b6de0, type: 3}
+    texture: {fileID: 2800000, guid: 6d2886eac1bd28349bbc59a5d0a03186, type: 3}
+    material: {fileID: 2100000, guid: 7255b21f950f1094d9cfa560a13d2a7d, type: 2}
+    uiMaterial: {fileID: 2100000, guid: cb6c4adfe841f224e83c127b5196db0a, type: 2}

+ 8 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_Data.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6594bd46fabbac44dbbc2b86f5cdb2ac
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_ske.json


+ 7 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_ske.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fbee70b3e216b98469f20bb76249d2d9
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_tex.json

@@ -0,0 +1 @@
+{"width":1024,"SubTexture":[{"width":166,"y":363,"height":180,"name":"c_tou","x":1},{"width":180,"y":243,"height":163,"name":"c_body","x":421},{"frameY":-1,"y":691,"frameWidth":89,"frameHeight":173,"width":87,"height":171,"name":"c_houtui02","frameX":-1,"x":134},{"width":161,"y":631,"height":129,"name":"c_pigu","x":547},{"frameY":-1,"y":648,"frameWidth":86,"frameHeight":182,"width":84,"height":180,"name":"c_houtui01","frameX":-1,"x":282},{"width":265,"y":220,"height":141,"name":"c_qiantui01","x":1},{"frameY":-1,"y":772,"frameWidth":111,"frameHeight":154,"width":109,"height":152,"name":"c_weiba","frameX":-1,"x":417},{"width":124,"y":408,"height":198,"name":"b_houtui02","x":421},{"width":133,"y":477,"height":169,"name":"b_qiantui02","x":282},{"width":138,"y":477,"height":152,"name":"b_weiba","x":547},{"width":357,"y":1,"height":240,"name":"b_body","x":410},{"frameY":-1,"y":201,"frameWidth":185,"frameHeight":176,"width":183,"height":174,"name":"b_tou","frameX":-1,"x":769},{"width":131,"y":545,"height":171,"name":"b_qiantui01","x":1},{"width":108,"y":243,"height":232,"name":"b_houtui01","x":603},{"width":139,"y":377,"height":154,"name":"a_weiba","x":713},{"frameY":-1,"y":477,"frameWidth":113,"frameHeight":214,"width":111,"height":212,"name":"a_houtui02","frameX":-1,"x":169},{"frameY":-1,"y":830,"frameWidth":96,"frameHeight":144,"width":94,"height":142,"name":"a_qiantui02","frameX":-1,"x":223},{"width":407,"y":1,"height":217,"name":"a_body","x":1},{"frameY":-1,"y":608,"frameWidth":107,"frameHeight":164,"width":105,"height":162,"name":"a_qiantui01","frameX":-1,"x":417},{"frameY":-1,"y":243,"frameWidth":153,"frameHeight":202,"width":151,"height":200,"name":"a_houtui01","frameX":-1,"x":268},{"width":200,"y":1,"height":198,"name":"a_tou","x":769}],"height":1024,"name":"dog_side","imagePath":"dog_side_tex.png"}

+ 7 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_tex.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 567d39e504dfce848a3d504cac0b6de0
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/DuckHunter/Animations/DogSide/dog_side_tex.png


+ 96 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_tex.png.meta

@@ -0,0 +1,96 @@
+fileFormatVersion: 2
+guid: 6d2886eac1bd28349bbc59a5d0a03186
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    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
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  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: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 38 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_tex_Mat.mat

@@ -0,0 +1,38 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: dog_side_tex_Mat
+  m_Shader: {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 6d2886eac1bd28349bbc59a5d0a03186, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - PixelSnap: 0
+    - _EnableExternalAlpha: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _Flip: {r: 1, g: 1, b: 1, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_tex_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7255b21f950f1094d9cfa560a13d2a7d
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 37 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_tex_UI_Mat.mat

@@ -0,0 +1,37 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: dog_side_tex_UI_Mat
+  m_Shader: {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 6d2886eac1bd28349bbc59a5d0a03186, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _ColorMask: 15
+    - _Stencil: 0
+    - _StencilComp: 8
+    - _StencilOp: 0
+    - _StencilReadMask: 255
+    - _StencilWriteMask: 255
+    - _UseUIAlphaClip: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/DogSide/dog_side_tex_UI_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cb6c4adfe841f224e83c127b5196db0a
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/Animations/Duck01.meta

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

+ 21 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_Data.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1a64e5b0e436d4bed9780211ae245f7b, type: 3}
+  m_Name: yazi_01_Data
+  m_EditorClassIdentifier: 
+  dataName: yazi_01
+  dragonBonesJSON: {fileID: 4900000, guid: 45a3d6c3146f29945ac54da4cb3e6737, type: 3}
+  textureAtlas:
+  - textureAtlasJSON: {fileID: 4900000, guid: 14fe00e84dbfb0f41b939642129e4110, type: 3}
+    texture: {fileID: 2800000, guid: dbb60a3d904b13445bb7f2a9eb895305, type: 3}
+    material: {fileID: 2100000, guid: 72fd2ddfde3b13945a7592034c5c3b11, type: 2}
+    uiMaterial: {fileID: 2100000, guid: 7b82b4af24e2e5648bc3a85f820167c6, type: 2}

+ 8 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_Data.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 35514e6bd34e4b1499ec9aa0ab5a159e
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_ske.json


+ 7 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_ske.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 45a3d6c3146f29945ac54da4cb3e6737
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_tex.json

@@ -0,0 +1 @@
+{"width":512,"SubTexture":[{"frameY":-1,"y":362,"frameWidth":43,"frameHeight":59,"width":41,"height":57,"name":"yazi12","frameX":-1,"x":1},{"frameY":-1,"y":249,"frameWidth":55,"frameHeight":29,"width":53,"height":27,"name":"yazi11","frameX":-1,"x":237},{"frameY":-1,"y":1,"frameWidth":144,"frameHeight":138,"width":142,"height":136,"name":"yazi13","frameX":-1,"x":1},{"frameY":-1,"y":139,"frameWidth":56,"frameHeight":67,"width":54,"height":65,"name":"yazi14","frameX":-1,"x":77},{"frameY":-1,"y":210,"frameWidth":86,"frameHeight":39,"width":84,"height":37,"name":"yazi16","frameX":-1,"x":237},{"frameY":-1,"y":317,"frameWidth":75,"frameHeight":45,"width":73,"height":43,"name":"yazi15","frameX":-1,"x":1},{"frameY":-1,"y":297,"frameWidth":175,"frameHeight":73,"width":173,"height":71,"name":"yazi17","frameX":-1,"x":77},{"frameY":-1,"y":167,"frameWidth":68,"frameHeight":37,"width":66,"height":35,"name":"yazi20","frameX":-1,"x":283},{"frameY":-1,"y":134,"frameWidth":46,"frameHeight":76,"width":44,"height":74,"name":"yazi18","frameX":-1,"x":237},{"frameY":-1,"y":206,"frameWidth":46,"frameHeight":76,"width":44,"height":74,"name":"yazi19","frameX":-1,"x":77},{"frameY":-1,"y":1,"frameWidth":146,"frameHeight":133,"width":144,"height":131,"name":"yazi21","frameX":-1,"x":145},{"frameY":-1,"y":139,"frameWidth":76,"frameHeight":178,"width":74,"height":176,"name":"yazi22","frameX":-1,"x":1},{"frameY":-1,"y":1,"frameWidth":106,"frameHeight":166,"width":104,"height":164,"name":"yazi23","frameX":-1,"x":291},{"width":90,"y":134,"height":161,"name":"die","x":145}],"height":512,"name":"yazi_01","imagePath":"yazi_01_tex.png"}

+ 7 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_tex.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 14fe00e84dbfb0f41b939642129e4110
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/DuckHunter/Animations/Duck01/yazi_01_tex.png


+ 96 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_tex.png.meta

@@ -0,0 +1,96 @@
+fileFormatVersion: 2
+guid: dbb60a3d904b13445bb7f2a9eb895305
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    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
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  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: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 38 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_tex_Mat.mat

@@ -0,0 +1,38 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: yazi_01_tex_Mat
+  m_Shader: {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: dbb60a3d904b13445bb7f2a9eb895305, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - PixelSnap: 0
+    - _EnableExternalAlpha: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _Flip: {r: 1, g: 1, b: 1, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_tex_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 72fd2ddfde3b13945a7592034c5c3b11
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 37 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_tex_UI_Mat.mat

@@ -0,0 +1,37 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: yazi_01_tex_UI_Mat
+  m_Shader: {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: dbb60a3d904b13445bb7f2a9eb895305, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _ColorMask: 15
+    - _Stencil: 0
+    - _StencilComp: 8
+    - _StencilOp: 0
+    - _StencilReadMask: 255
+    - _StencilWriteMask: 255
+    - _UseUIAlphaClip: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Duck01/yazi_01_tex_UI_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7b82b4af24e2e5648bc3a85f820167c6
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/Animations/Duck02.meta

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

+ 21 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_Data.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1a64e5b0e436d4bed9780211ae245f7b, type: 3}
+  m_Name: yazi_02_Data
+  m_EditorClassIdentifier: 
+  dataName: yazi_02
+  dragonBonesJSON: {fileID: 4900000, guid: 5a4dbea3277f351449b8c9bef4b75ea9, type: 3}
+  textureAtlas:
+  - textureAtlasJSON: {fileID: 4900000, guid: c11df9394e02eec489cfa20a9474e8c0, type: 3}
+    texture: {fileID: 2800000, guid: d5613e6ba44a8be45bc60c9be70ae104, type: 3}
+    material: {fileID: 2100000, guid: b819488e971f5e146b0d3e6bdf640871, type: 2}
+    uiMaterial: {fileID: 2100000, guid: a2aa427dd4d50544692eed1ab305c59e, type: 2}

+ 8 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_Data.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b44dd316c4a870d47a83cf43aea8cf56
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_ske.json


+ 7 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_ske.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5a4dbea3277f351449b8c9bef4b75ea9
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_tex.json

@@ -0,0 +1 @@
+{"width":512,"SubTexture":[{"frameY":-1,"y":249,"frameWidth":55,"frameHeight":29,"width":53,"height":27,"name":"yazi11","frameX":-1,"x":237},{"frameY":-1,"y":362,"frameWidth":43,"frameHeight":59,"width":41,"height":57,"name":"yazi12","frameX":-1,"x":1},{"frameY":-1,"y":1,"frameWidth":144,"frameHeight":138,"width":142,"height":136,"name":"yazi13","frameX":-1,"x":1},{"frameY":-1,"y":317,"frameWidth":75,"frameHeight":45,"width":73,"height":43,"name":"yazi15","frameX":-1,"x":1},{"frameY":-1,"y":139,"frameWidth":56,"frameHeight":67,"width":54,"height":65,"name":"yazi14","frameX":-1,"x":77},{"frameY":-1,"y":210,"frameWidth":86,"frameHeight":39,"width":84,"height":37,"name":"yazi16","frameX":-1,"x":237},{"frameY":-1,"y":297,"frameWidth":175,"frameHeight":73,"width":173,"height":71,"name":"yazi17","frameX":-1,"x":77},{"frameY":-1,"y":206,"frameWidth":46,"frameHeight":76,"width":44,"height":74,"name":"yazi19","frameX":-1,"x":77},{"frameY":-1,"y":167,"frameWidth":68,"frameHeight":37,"width":66,"height":35,"name":"yazi20","frameX":-1,"x":283},{"frameY":-1,"y":134,"frameWidth":46,"frameHeight":76,"width":44,"height":74,"name":"yazi18","frameX":-1,"x":237},{"frameY":-1,"y":1,"frameWidth":146,"frameHeight":133,"width":144,"height":131,"name":"yazi21","frameX":-1,"x":145},{"frameY":-1,"y":139,"frameWidth":76,"frameHeight":178,"width":74,"height":176,"name":"yazi22","frameX":-1,"x":1},{"frameY":-1,"y":1,"frameWidth":106,"frameHeight":166,"width":104,"height":164,"name":"yazi23","frameX":-1,"x":291},{"width":90,"y":134,"height":161,"name":"die","x":145}],"height":512,"name":"yazi_02","imagePath":"yazi_02_tex.png"}

+ 7 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_tex.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c11df9394e02eec489cfa20a9474e8c0
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/DuckHunter/Animations/Duck02/yazi_02_tex.png


+ 96 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_tex.png.meta

@@ -0,0 +1,96 @@
+fileFormatVersion: 2
+guid: d5613e6ba44a8be45bc60c9be70ae104
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    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
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  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: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 38 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_tex_Mat.mat

@@ -0,0 +1,38 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: yazi_02_tex_Mat
+  m_Shader: {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: d5613e6ba44a8be45bc60c9be70ae104, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - PixelSnap: 0
+    - _EnableExternalAlpha: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _Flip: {r: 1, g: 1, b: 1, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_tex_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b819488e971f5e146b0d3e6bdf640871
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 37 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_tex_UI_Mat.mat

@@ -0,0 +1,37 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: yazi_02_tex_UI_Mat
+  m_Shader: {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: d5613e6ba44a8be45bc60c9be70ae104, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _ColorMask: 15
+    - _Stencil: 0
+    - _StencilComp: 8
+    - _StencilOp: 0
+    - _StencilReadMask: 255
+    - _StencilWriteMask: 255
+    - _UseUIAlphaClip: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Duck02/yazi_02_tex_UI_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a2aa427dd4d50544692eed1ab305c59e
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/Animations/Duck03.meta

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

+ 21 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_Data.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1a64e5b0e436d4bed9780211ae245f7b, type: 3}
+  m_Name: yazi_03_Data
+  m_EditorClassIdentifier: 
+  dataName: yazi_03
+  dragonBonesJSON: {fileID: 4900000, guid: fa4f633c08abe47438f55d463f23163e, type: 3}
+  textureAtlas:
+  - textureAtlasJSON: {fileID: 4900000, guid: b83e865d934e8424d89671ec9db3d1b7, type: 3}
+    texture: {fileID: 2800000, guid: f47a61cf104562748a262068466836ad, type: 3}
+    material: {fileID: 2100000, guid: 21687319aa4e99348938f268dcd1e9b7, type: 2}
+    uiMaterial: {fileID: 2100000, guid: a60439d6fed76ef4b9a37e4bf58a8749, type: 2}

+ 8 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_Data.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 44fdaf5209512e144a632eebe38d7641
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_ske.json


+ 7 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_ske.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: fa4f633c08abe47438f55d463f23163e
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_tex.json

@@ -0,0 +1 @@
+{"width":512,"SubTexture":[{"frameY":-1,"y":249,"frameWidth":55,"frameHeight":29,"width":53,"height":27,"name":"yazi11","frameX":-1,"x":237},{"frameY":-1,"y":362,"frameWidth":43,"frameHeight":59,"width":41,"height":57,"name":"yazi12","frameX":-1,"x":1},{"frameY":-1,"y":1,"frameWidth":144,"frameHeight":138,"width":142,"height":136,"name":"yazi13","frameX":-1,"x":1},{"frameY":-1,"y":210,"frameWidth":86,"frameHeight":39,"width":84,"height":37,"name":"yazi16","frameX":-1,"x":237},{"frameY":-1,"y":139,"frameWidth":56,"frameHeight":67,"width":54,"height":65,"name":"yazi14","frameX":-1,"x":77},{"frameY":-1,"y":317,"frameWidth":75,"frameHeight":45,"width":73,"height":43,"name":"yazi15","frameX":-1,"x":1},{"frameY":-1,"y":297,"frameWidth":175,"frameHeight":73,"width":173,"height":71,"name":"yazi17","frameX":-1,"x":77},{"frameY":-1,"y":134,"frameWidth":46,"frameHeight":76,"width":44,"height":74,"name":"yazi18","frameX":-1,"x":237},{"frameY":-1,"y":167,"frameWidth":68,"frameHeight":37,"width":66,"height":35,"name":"yazi20","frameX":-1,"x":283},{"frameY":-1,"y":206,"frameWidth":46,"frameHeight":76,"width":44,"height":74,"name":"yazi19","frameX":-1,"x":77},{"frameY":-1,"y":1,"frameWidth":146,"frameHeight":133,"width":144,"height":131,"name":"yazi21","frameX":-1,"x":145},{"frameY":-1,"y":1,"frameWidth":106,"frameHeight":166,"width":104,"height":164,"name":"yazi23","frameX":-1,"x":291},{"frameY":-1,"y":139,"frameWidth":76,"frameHeight":178,"width":74,"height":176,"name":"yazi22","frameX":-1,"x":1},{"width":90,"y":134,"height":161,"name":"die","x":145}],"height":512,"name":"yazi_03","imagePath":"yazi_03_tex.png"}

+ 7 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_tex.json.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b83e865d934e8424d89671ec9db3d1b7
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/DuckHunter/Animations/Duck03/yazi_03_tex.png


+ 96 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_tex.png.meta

@@ -0,0 +1,96 @@
+fileFormatVersion: 2
+guid: f47a61cf104562748a262068466836ad
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    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
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  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: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 38 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_tex_Mat.mat

@@ -0,0 +1,38 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: yazi_03_tex_Mat
+  m_Shader: {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: f47a61cf104562748a262068466836ad, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - PixelSnap: 0
+    - _EnableExternalAlpha: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _Flip: {r: 1, g: 1, b: 1, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_tex_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 21687319aa4e99348938f268dcd1e9b7
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 37 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_tex_UI_Mat.mat

@@ -0,0 +1,37 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: yazi_03_tex_UI_Mat
+  m_Shader: {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: f47a61cf104562748a262068466836ad, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _ColorMask: 15
+    - _Stencil: 0
+    - _StencilComp: 8
+    - _StencilOp: 0
+    - _StencilReadMask: 255
+    - _StencilWriteMask: 255
+    - _UseUIAlphaClip: 0
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/DuckHunter/Animations/Duck03/yazi_03_tex_UI_Mat.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a60439d6fed76ef4b9a37e4bf58a8749
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/ColorPicker.meta

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

+ 8 - 0
Assets/DuckHunter/ColorPicker/Scripts.meta

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

+ 66 - 0
Assets/DuckHunter/ColorPicker/Scripts/ColorPalette.cs

@@ -0,0 +1,66 @@
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace ColorUiTools
+{
+    /// <summary>
+    /// 调色盘
+    /// </summary>
+    internal class ColorPalette : MonoBehaviour , IPointerUpHandler , IDragHandler ,IPointerDownHandler
+    {
+        private ColorPicker m_colorPicker = null;
+        private Transform m_transform = null;
+        private Transform m_nonius = null;
+        private bool m_canDrag = false;
+        private Vector2 m_size;
+        private float m_halfX;
+        private float m_halfY;
+
+        private void Start()
+        {
+            m_transform = transform;
+            m_size = m_transform.GetComponent<RectTransform>().sizeDelta;
+            m_halfX = m_size.x / 2.0f;
+            m_halfY = m_size.y / 2.0f;
+            m_nonius = transform.Find("ColorNonius");
+            m_colorPicker = m_transform.parent.GetComponent<ColorPicker>();    
+        }
+
+        private void Update()
+        {
+            var x = Mathf.Clamp(m_nonius.localPosition.x , -m_halfX , m_halfX);
+            var y = Mathf.Clamp(m_nonius.localPosition.y , -m_halfY , m_halfY);
+            m_nonius.localPosition = new Vector3(x , y);
+            if(m_canDrag)
+                m_colorPicker.SuckColorByNonius(m_nonius.localPosition);
+        }
+
+        public void ResetNoniusPosition( Vector3 position )
+        {
+            if ( null == m_nonius )
+                m_nonius = transform.Find("ColorNonius");
+            m_nonius.localPosition = position;
+        }
+
+        public void OnPointerUp(PointerEventData eventData)
+        {
+            m_canDrag = false;
+        }
+
+        public void OnDrag(PointerEventData eventData)
+        {
+            if( m_canDrag )
+                m_nonius.localPosition = mousPosition();
+        }
+
+        public void OnPointerDown(PointerEventData eventData)
+        {
+            m_canDrag = true;
+        }
+
+        private Vector3 mousPosition( )
+        {
+            return Input.mousePosition - m_transform.position;
+        }
+    }
+}

+ 12 - 0
Assets/DuckHunter/ColorPicker/Scripts/ColorPalette.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 97e126a3a76acb5409188ffb815d3de8
+timeCreated: 1497334194
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 497 - 0
Assets/DuckHunter/ColorPicker/Scripts/ColorPicker.cs

@@ -0,0 +1,497 @@
+using System;
+using UnityEngine;
+using UnityEngine.UI;
+using System.Collections.Generic;
+using UnityEngine.Events;
+using UnityEngine.EventSystems;
+
+namespace ColorUiTools
+{
+    public class ColorPicker : UIBehaviour
+    {
+        [Serializable]
+        public class ColorPickerEvent : UnityEvent<Color> { }
+
+        [SerializeField]
+        private ColorPickerEvent m_onPicker = new ColorPickerEvent();
+        public ColorPickerEvent onPicker
+        {
+            get { return m_onPicker; }
+            set { m_onPicker = value; }
+        }
+
+        [SerializeField]
+        private ColorPickerEvent m_onPickerStart = new ColorPickerEvent();
+        public ColorPickerEvent onPickerStart
+        {
+            get { return m_onPickerStart; }
+            set { m_onPickerStart = value; }
+        }
+
+        [SerializeField]
+        private Color m_Color = default;
+        public Color Color
+        {
+            get { return m_Color; }
+            set
+            {
+                m_Color = new Color(value.r, value.g, value.b, value.a);
+                resetColorPicker();
+                if (null != onPicker)
+                    onPicker.Invoke(m_Color);
+            }
+        }
+
+        #region base field
+        private Transform m_transform = null;
+
+        private Transform m_colorPalette = null;
+
+        private Transform m_coloredPate = null;
+        #endregion
+
+        #region MainColorTape && ColoredTape
+
+        //Brightness && Saturation && Hue ColoredTape
+        private Image m_mainColorTape = null;
+        private ColoredTape m_firstLayerCT = null;
+        private ColoredTape m_secondLayerCT = null;
+
+
+        private Slider m_verticalCTSlider = null;
+        private ColoredTape m_verticalFirstCT = null;
+
+        #endregion
+
+
+
+        #region RGBA颜色条
+        private InputField m_rValue = null;
+        private Slider m_rSlider = null;
+        private ColoredTape m_rColoredTape = null;
+
+        private InputField m_gValue = null;
+        private Slider m_gSlider = null;
+        private ColoredTape m_gColoredTape = null;
+
+
+        private InputField m_bValue = null;
+        private Slider m_bSlider = null;
+        private ColoredTape m_bColoredTape = null;
+
+        private InputField m_aValue = null;
+        private Slider m_aSlider = null;
+        private ColoredTape m_aColoredTape = null;
+        #endregion
+
+        #region 十六进制颜色
+        private InputField m_hexColor = null;
+        #endregion
+
+        #region 游标
+        private Transform m_nonius = null;
+
+        #endregion
+
+        /// <summary>
+        /// reset color picker 
+        /// </summary>
+        private void resetColorPicker()
+        {
+            SetHexByColor();
+            m_mainColorTape.color = Color;
+            SetRGBA();
+        }
+
+        #region UIBehaviour functions
+        protected override void Start()
+        {
+            m_transform = this.transform;
+            m_mainColorTape = m_transform.Find("MainColor").GetComponent<Image>();
+
+            #region  RGBA ColoredTape RGBA组件获取与事件监听
+            var RGBA = m_transform.Find("RGBA");
+
+
+            m_rValue = RGBA.Find("R/Value").GetComponent<InputField>();
+            m_rSlider = RGBA.Find("R/Slider").GetComponent<Slider>();
+            m_rSlider.onValueChanged.AddListener(OnRedSliderChanged);
+            m_rColoredTape = m_rSlider.transform.Find("ColoredTape").GetComponent<ColoredTape>();
+            m_rValue.onValueChanged.AddListener(SetColorbyR);
+
+
+            m_gValue = RGBA.Find("G/Value").GetComponent<InputField>();
+            m_gSlider = RGBA.Find("G/Slider").GetComponent<Slider>();
+            m_gSlider.onValueChanged.AddListener(OnGreenSliderChanged);
+            m_gColoredTape = m_gSlider.transform.Find("ColoredTape").GetComponent<ColoredTape>();
+            m_gValue.onValueChanged.AddListener(SetColorbyG);
+
+
+            m_bValue = RGBA.Find("B/Value").GetComponent<InputField>();
+            m_bSlider = RGBA.Find("B/Slider").GetComponent<Slider>();
+            m_bSlider.onValueChanged.AddListener(OnBlueSliderChanged);
+            m_bColoredTape = m_bSlider.transform.Find("ColoredTape").GetComponent<ColoredTape>();
+            m_bValue.onValueChanged.AddListener(SetColorbyB);
+
+            m_aValue = RGBA.Find("A/Value").GetComponent<InputField>();
+            m_aSlider = RGBA.Find("A/Slider").GetComponent<Slider>();
+            m_aSlider.onValueChanged.AddListener(OnAlphaSliderChanged);
+            m_aColoredTape = m_aSlider.transform.Find("ColoredTape").GetComponent<ColoredTape>();
+            m_aValue.onValueChanged.AddListener(SetColorbyA);
+            #endregion
+
+
+            // 调色板
+            m_colorPalette = m_transform.Find("ColorPalette");
+            m_nonius = m_colorPalette.Find("ColorNonius");
+            m_firstLayerCT = m_colorPalette.Find("FirstLayerColoredTape").GetComponent<ColoredTape>();
+            m_secondLayerCT = m_colorPalette.Find("SecondLayerColoredTape").GetComponent<ColoredTape>();
+
+
+            // 垂直滑动条
+            m_coloredPate = m_transform.Find("ColoredTapeSlider");
+            m_verticalCTSlider = m_coloredPate.GetComponent<Slider>();
+            m_verticalFirstCT = m_coloredPate.Find("FirstLayerColoredTape").GetComponent<ColoredTape>();
+            m_verticalCTSlider.onValueChanged.AddListener(verticalSliderChanged);
+
+            // 初始化操作
+            InitHexColor();
+
+
+            //Color = Color.white;
+            if (null != onPickerStart)
+                onPickerStart.Invoke(Color.white);
+            else
+                Color = Color.white;
+
+        }
+
+        protected override void OnDisable()
+        {
+            base.OnDisable();
+
+            m_rValue.onValueChanged.RemoveAllListeners();
+            m_gValue.onValueChanged.RemoveAllListeners();
+            m_bValue.onValueChanged.RemoveAllListeners();
+            m_aValue.onValueChanged.RemoveAllListeners();
+        }
+        #endregion
+
+        #region vertical ct && main ct
+
+        /// <summary>
+        /// set color by slider 
+        /// </summary>
+        private void verticalSliderChanged(float value)
+        {
+            float height = m_verticalFirstCT.transform.GetComponent<RectTransform>().sizeDelta.y;
+            Color color = m_verticalFirstCT.GetColor(new Vector2(0, height * (1 - value) - height / 2.0f));
+            changedFirstLayerColoredTape(color);
+            Color = mixedTwoColoredTapeColor(m_nonius.localPosition);
+        }
+
+        /// <summary>
+        /// get nonius position by color
+        /// </summary>
+        /// <param name="color0"></param>
+        /// <returns></returns>
+        private Vector2 getPositionByMixedCT(Color color0)
+        {
+            var result = Vector2.zero;
+            var size = m_colorPalette.GetComponent<RectTransform>().sizeDelta;
+
+            return result;
+        }
+
+        /// <summary>
+        /// set color for vertical slider 
+        /// </summary>
+        /// <param name="value"></param>
+        private void setValueForVerticalSlider(float value)
+        {
+            m_verticalCTSlider.onValueChanged.RemoveAllListeners();
+            m_verticalCTSlider.value = value;
+            m_verticalCTSlider.onValueChanged.AddListener(verticalSliderChanged);
+        }
+
+        /// <summary>
+        /// vetify first ct color
+        /// </summary>
+        /// <param name="color"></param>
+        private void changedFirstLayerColoredTape(Color color)
+        {
+            m_firstLayerCT.SetColors(new Color[] { Color.white, color });
+        }
+
+        /// <summary>
+        /// get color from mixed cts
+        /// </summary>
+        /// <param name="noniusPos"></param>
+        /// <returns></returns>
+        private Color mixedTwoColoredTapeColor(Vector2 noniusPos)
+        {
+            Color first = m_firstLayerCT.GetColor(noniusPos);
+            Color second = m_secondLayerCT.GetColor(noniusPos);
+            float alpha = second.a;
+            Color result = Color.white;
+            result = new Color(second.r, second.g, second.b) * alpha +
+                new Color(first.r, first.g, first.b) * (1 - alpha);
+            result.a = Color.a;
+            return result;
+        }
+
+        #endregion
+
+
+        #region RGBA input
+
+        /// <summary>
+        /// set RGBA inputfield
+        /// </summary>
+        private void SetRGBA()
+        {
+            var red = Color.r;
+            var green = Color.g;
+            var blue = Color.b;
+            setRedInputFieldValue((int)(red * 255));
+            setRedSliderValue(red);
+
+            SetGreenInputFieldValue((int)(green * 255));
+            SetGreenSliderValue(green);
+
+            SetBlueInputFieldValue((int)(blue * 255));
+            SetBlueSliderValue(blue);
+
+            m_aValue.text = ((int)(Color.a * 255)).ToString();
+            //set red 
+            var startColor = new Color(0, green, blue, 1);
+            var endColor = new Color(1, green, blue, 1);
+            m_rColoredTape.SetColors(new Color[] { startColor, endColor });
+            //set green
+            startColor = new Color(red, 0, blue, 1);
+            endColor = new Color(red, 1, blue, 1);
+            m_gColoredTape.SetColors(new Color[] { startColor, endColor });
+            //set blue
+            startColor = new Color(red, green, 0, 1);
+            endColor = new Color(red, green, 1, 1);
+            m_bColoredTape.SetColors(new Color[] { startColor, endColor });
+        }
+
+        /// <summary>
+        /// R inputfiled 
+        /// </summary>
+        /// <param name="red"></param>
+        private void SetColorbyR(string red)
+        {
+            var value = 0;
+            if (!int.TryParse(red, out value))
+            {
+                m_rValue.text = "0";
+                return;
+            }
+            setRedSliderValue(value / 255.0f);
+            Color = new Color((float)value / 255.0f, Color.g, Color.b, Color.a);
+            SetNoniusPositionByColor();
+        }
+
+        private void setRedInputFieldValue(float value)
+        {
+            m_rValue.onValueChanged.RemoveAllListeners();
+            m_rValue.text = ((int)value).ToString();
+            m_rValue.onValueChanged.AddListener(SetColorbyR);
+        }
+
+        private void setRedSliderValue(float value)
+        {
+            m_rSlider.onValueChanged.RemoveAllListeners();
+            m_rSlider.value = value;
+            m_rSlider.onValueChanged.AddListener(OnRedSliderChanged);
+        }
+
+        /// <summary>
+        /// G inputfiled 
+        /// </summary>
+        /// <param name="green"></param>
+        private void SetColorbyG(string green)
+        {
+            var value = 0;
+            if (!int.TryParse(green, out value))
+            {
+                m_gValue.text = "0";
+                return;
+            }
+            SetGreenSliderValue(value / 255.0f);
+            Color = new Color(Color.r, value / 255.0f, Color.b, Color.a);
+            SetNoniusPositionByColor();
+        }
+
+        private void SetGreenInputFieldValue(float value)
+        {
+            m_gValue.onValueChanged.RemoveAllListeners();
+            m_gValue.text = ((int)value).ToString();
+            m_gValue.onValueChanged.AddListener(SetColorbyG);
+        }
+
+        private void SetGreenSliderValue(float value)
+        {
+            m_gSlider.onValueChanged.RemoveAllListeners();
+            m_gSlider.value = value;
+            m_gSlider.onValueChanged.AddListener(OnGreenSliderChanged);
+        }
+
+        /// <summary>
+        /// blue inputfiled 
+        /// </summary>
+        /// <param name="blue"></param>
+        private void SetColorbyB(string blue)
+        {
+            var value = 0;
+            if (!int.TryParse(blue, out value))
+            {
+                m_bValue.text = "0";
+                return;
+            }
+            SetBlueSliderValue(value / 255.0f);
+            Color = new Color(Color.r, Color.g, value / 255.0f, Color.a);
+            SetNoniusPositionByColor();
+        }
+
+        private void SetBlueInputFieldValue(float value)
+        {
+            m_bValue.onValueChanged.RemoveAllListeners();
+            m_bValue.text = ((int)value).ToString();
+            m_bValue.onValueChanged.AddListener(SetColorbyB);
+        }
+
+        private void SetBlueSliderValue(float value)
+        {
+            m_bSlider.onValueChanged.RemoveAllListeners();
+            m_bSlider.value = value;
+            m_bSlider.onValueChanged.AddListener(OnBlueSliderChanged);
+        }
+
+        /// <summary>
+        /// alpha inputfiled 
+        /// </summary>
+        /// <param name="alpha"></param>
+        private void SetColorbyA(string alpha)
+        {
+            var value = 0;
+            if (!int.TryParse(alpha, out value))
+            {
+                m_aValue.text = "0";
+                return;
+            }
+            m_aSlider.onValueChanged.RemoveAllListeners();
+            m_aSlider.value = value / 255.0f;
+            m_aSlider.onValueChanged.AddListener(OnAlphaSliderChanged);
+            Color = new Color(Color.r, Color.g, Color.b, value / 255.0f);
+            SetNoniusPositionByColor();
+        }
+
+        /// <summary>
+        /// change colro by red slider
+        /// </summary>
+        /// <param name="value"></param>
+        private void OnRedSliderChanged(float value)
+        {
+            Color = new Color(value, Color.g, Color.b, Color.a);
+            changedFirstLayerColoredTape(Color);
+            setValueForVerticalSlider(m_verticalFirstCT.GetScale(Color));
+        }
+
+        /// <summary>
+        /// change color by green slider
+        /// </summary>
+        /// <param name="value"></param>
+        private void OnGreenSliderChanged(float value)
+        {
+            Color = new Color(Color.r, value, Color.b, Color.a);
+            changedFirstLayerColoredTape(Color);
+            setValueForVerticalSlider(m_verticalFirstCT.GetScale(Color));
+        }
+
+        /// <summary>
+        /// change color by blue slider
+        /// </summary>
+        /// <param name="value"></param>
+        private void OnBlueSliderChanged(float value)
+        {
+            Color = new Color(Color.r, Color.g, value, Color.a);
+            changedFirstLayerColoredTape(Color);
+            setValueForVerticalSlider(m_verticalFirstCT.GetScale(Color));
+        }
+
+        /// <summary>
+        /// change color by alpha slider 
+        /// </summary>
+        /// <param name="value"></param>
+        private void OnAlphaSliderChanged(float value)
+        {
+            Color = new Color(Color.r, Color.g, Color.b, value);
+        }
+
+        #endregion
+
+        #region hex color
+        private void InitHexColor()
+        {
+            m_hexColor = m_transform.Find("HexColor/Value").GetComponent<InputField>();
+            m_hexColor.onValueChanged.AddListener(SetColorByHex);
+        }
+
+        private void SetColorByHex(string hexColor)
+        {
+            //TODO
+        }
+
+        private void SetHexByColor()
+        {
+            string hexValue = "";
+            hexValue += DecimalToHexadecimal((int)(Color.r * 255));
+            hexValue += DecimalToHexadecimal((int)(Color.g * 255));
+            hexValue += DecimalToHexadecimal((int)(Color.b * 255));
+            hexValue += DecimalToHexadecimal((int)(Color.a * 255));
+            m_hexColor.text = hexValue;
+        }
+
+        private string DecimalToHexadecimal(int dec)
+        {
+            string result = Convert.ToString(dec, 16);
+            result = result.ToUpper();
+            if (result.Length.Equals(1))
+                result = "0" + result;
+            return result;
+        }
+
+        #endregion
+
+
+
+        /// <summary>
+        /// 根据游标设置颜色
+        /// </summary>
+        /// <param name="noniusPos"></param>
+        public void SuckColorByNonius(Vector3 noniusPos)
+        {
+            Color = mixedTwoColoredTapeColor(noniusPos);
+            m_mainColorTape.color = Color;
+        }
+
+        /// <summary>
+        /// 根据颜色设置游标位置
+        /// </summary>
+        private void SetNoniusPositionByColor()
+        {
+            changedFirstLayerColoredTape(Color);
+            m_nonius.localPosition = m_transform.GetComponent<RectTransform>().sizeDelta;
+            setValueForVerticalSlider(m_verticalFirstCT.GetScale(Color));
+        }
+
+        public void SetNoniusPositionByColor(Color _color){
+            Color = _color;
+            resetColorPicker();
+            SetNoniusPositionByColor();
+        }
+    }
+}

+ 12 - 0
Assets/DuckHunter/ColorPicker/Scripts/ColorPicker.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 7bcfe66f89a693248863dc4dfa10174d
+timeCreated: 1496902521
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 273 - 0
Assets/DuckHunter/ColorPicker/Scripts/ColoredTape.cs

@@ -0,0 +1,273 @@
+
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace ColorUiTools
+{
+    public class ColoredTape : MaskableGraphic
+    {
+        public enum E_DrawDirection
+        {
+            Vertical,
+            Horizontal
+        }
+
+        [Header("Colored tape type setting")]
+
+        [SerializeField]
+        public E_DrawDirection TapeDirection = E_DrawDirection.Vertical;
+
+
+        [Header("Colored tape colors setting")]
+        [SerializeField]
+        private List<Color> m_Colors = new List<Color>() { Color.red, Color.magenta };
+        [HideInInspector]
+        public Vector2 RectSize;
+
+        #region draw
+
+        protected override void OnPopulateMesh(VertexHelper vh)
+        {
+            RectSize = GetPixelAdjustedRect().size;
+            vh.Clear();
+            if (TapeDirection == E_DrawDirection.Vertical) DrawVerticalColoredTape(vh);
+            else DrawHorizontalColoredTape(vh);
+        }
+
+        private void DrawVerticalColoredTape(VertexHelper vh)
+        {
+            int colorNumber = m_Colors.Count;
+            float offset = RectSize.y / (colorNumber - 1);
+            Vector2 topLeftPos = new Vector2(-RectSize.x / 2.0f, RectSize.y / 2.0f);
+            Vector2 topRightPos = new Vector2(RectSize.x / 2.0f, RectSize.y / 2.0f);
+            Vector2 bottomLeftPos = topLeftPos - new Vector2(0, offset);
+            Vector2 bottomRightPos = topRightPos - new Vector2(0, offset);
+            for (int i = 0; i < colorNumber - 1; i++)
+            {
+                Color startColor = m_Colors[i];
+                Color endColor = m_Colors[i + 1];
+                var first = GetUIVertex(topLeftPos, startColor);
+                var second = GetUIVertex(topRightPos, startColor);
+                var third = GetUIVertex(bottomRightPos, endColor);
+                var four = GetUIVertex(bottomLeftPos, endColor);
+                vh.AddUIVertexQuad(new UIVertex[] { first, second, third, four });
+                topLeftPos = bottomLeftPos;
+                topRightPos = bottomRightPos;
+                bottomLeftPos = topLeftPos - new Vector2(0, offset);
+                bottomRightPos = topRightPos - new Vector2(0, offset);
+            }
+        }
+
+        private void DrawHorizontalColoredTape(VertexHelper vh)
+        {
+            int colorNumber = m_Colors.Count;
+            float offset = RectSize.x / (colorNumber - 1);
+            Vector2 topLeftPos = new Vector2(-RectSize.x / 2.0f, RectSize.y / 2.0f);
+            Vector2 bottomLeftPos = topLeftPos - new Vector2(0, RectSize.y);
+            Vector2 topRightPos = topLeftPos + new Vector2(offset, 0);
+            Vector2 bottomRightPos = bottomLeftPos + new Vector2(offset, 0);
+            for (int i = 0; i < colorNumber - 1; i++)
+            {
+                Color startColor = m_Colors[i];
+                Color endColor = m_Colors[i + 1];
+                var first = GetUIVertex(topLeftPos, startColor);
+                var second = GetUIVertex(topRightPos, endColor);
+                var third = GetUIVertex(bottomRightPos, endColor);
+                var four = GetUIVertex(bottomLeftPos, startColor);
+                vh.AddUIVertexQuad(new UIVertex[] { first, second, third, four });
+                topLeftPos = topRightPos;
+                bottomLeftPos = bottomRightPos;
+                topRightPos = topLeftPos + new Vector2(offset, 0);
+                bottomRightPos = bottomLeftPos + new Vector2(offset, 0);
+            }
+        }
+
+        #endregion
+
+        #region Helper methods
+        public virtual void SetColors(Color[] colors)
+        {
+            m_Colors.Clear();
+            foreach (Color color1 in colors)
+                m_Colors.Add(color1);
+            OnEnable();
+        }
+
+        public void SetColors(float value)
+        {
+            List<Color> colors = new List<Color>();
+
+            m_Colors.Clear();
+            m_Colors = colors;
+            Rebuild();
+        }
+
+        public virtual Color GetColor(Vector2 position)
+        {
+            int colorCount = m_Colors.Count;
+            switch (TapeDirection)
+            {
+                case E_DrawDirection.Horizontal:
+                    var perX = RectSize.x / ((colorCount - 1) * 2);
+                    var doubelPer = perX * 2;
+                    var lenght0 = position.x + RectSize.x / 2.0f;
+                    int index0 = (int)(lenght0 / doubelPer);
+                    var temp0 = lenght0 % doubelPer / doubelPer;
+                    if (lenght0.Equals(RectSize.x))
+                    {
+                        index0--;
+                        temp0++;
+                    }
+                    Color start = m_Colors[index0];
+                    Color end = m_Colors[index0 + 1];
+                    return start * (1 - temp0) + end * temp0;
+                case E_DrawDirection.Vertical:
+                    var perY = RectSize.y / ((colorCount - 1) * 2);
+                    var doublePer = perY * 2;
+                    var lenght1 = RectSize.y / 2.0f - position.y;
+                    var index1 = (int)(lenght1 / doublePer);
+                    var temp1 = lenght1 % doublePer / doublePer;
+                    if (lenght1.Equals(RectSize.y))
+                    {
+                        index1--;
+                        temp1++;
+                    }
+                    Color start1 = m_Colors[index1];
+                    Color end1 = m_Colors[index1 + 1];
+                    return start1 * (1 - temp1) + end1 * temp1;
+                default:
+                    return Color.white;
+            }
+        }
+
+        public Color GetColor(int index)
+        {
+            return m_Colors[index];
+        }
+
+        public virtual Vector2 GetPosition(Color color0)
+        {
+            var red = color0.r;
+            var green = color0.g;
+            var blue = color0.b;
+            var color1 = color0;
+            var color2 = color0;
+            var offset = 0.0f;
+            ArrayList array = new ArrayList() { red, green, blue };
+            array.Sort();
+
+            if (array[2].Equals(red))
+                color1 = Color.red;
+            else if (array[2].Equals(green))
+                color1 = Color.green;
+            else if (array[2].Equals(blue))
+                color1 = Color.blue;
+
+
+            if (array[1].Equals(red))
+            {
+                color2 = Color.red;
+                offset = color0.r;
+            }
+            if (array[1].Equals(green))
+            {
+                color2 = Color.green;
+                offset = color0.g;
+            }
+            if (array[1].Equals(blue))
+            {
+                color2 = Color.blue;
+                offset = color0.b;
+            }
+            var pos1 = returnIndex(color1);
+            var pos2 = returnIndex(color2);
+            if (color1 == Color.red && color2 == Color.green)
+                pos1 = m_Colors.Count - 1;
+            if (color2 == Color.red && color1 == Color.green)
+                pos2 = m_Colors.Count - 1;
+            switch (TapeDirection)
+            {
+                case E_DrawDirection.Vertical:
+                    var position1 = new Vector2(0, RectSize.y / 2.0f - pos1 * RectSize.y / (m_Colors.Count - 1));
+                    var position2 = new Vector2(0, RectSize.y / 2.0f - pos2 * RectSize.y / (m_Colors.Count - 1));
+                    int sign1 = 1;
+                    if (position1.y > position2.y)
+                        sign1 = -1;
+                    else
+                        sign1 = 1;
+                    return position1 + new Vector2(0, (RectSize.y / (m_Colors.Count - 1)) * offset) * sign1;
+                case E_DrawDirection.Horizontal:
+                    var hp1 = new Vector2(-RectSize.x / 2.0f + pos1 * RectSize.x / (m_Colors.Count - 1), 0);
+                    var hp2 = new Vector2(-RectSize.x / 2.0f + pos2 * RectSize.x / (m_Colors.Count - 1), 0);
+                    int sign2 = 1;
+                    if (hp1.x > hp2.x)
+                        sign2 = -1;
+                    else
+                        sign2 = 1;
+                    return hp1 + new Vector2(RectSize.x / (m_Colors.Count - 1) * offset * sign2, 0);
+            }
+            return Vector2.zero;
+        }
+
+        public virtual float GetScale(Color color0)
+        {
+            Vector2 pos = GetPosition(color0);
+            switch (TapeDirection)
+            {
+                case E_DrawDirection.Vertical:
+                    return Mathf.Abs((RectSize.y / 2.0f - pos.y) / RectSize.y);
+                case E_DrawDirection.Horizontal:
+                    return Mathf.Abs((pos.x - RectSize.x / 2.0f) / RectSize.x);
+            }
+            return 0;
+        }
+
+        private int returnIndex(Color color0)
+        {
+            for (int i = 0; i < m_Colors.Count; i++)
+            {
+                if (m_Colors[i].Equals(color0))
+                    return i;
+            }
+            return 0;
+        }
+
+        public virtual void Rebuild()
+        {
+            OnEnable();
+        }
+
+        public UIVertex GetUIVertex(Vector2 point, Color color0)
+        {
+            UIVertex vertex = new UIVertex
+            {
+                position = point,
+                color = color0,
+            };
+            return vertex;
+        }
+
+        public UIVertex[] GetQuad(Vector2 startPos, Vector2 endPos, Color color0, float LineWidth = 2.0f)
+        {
+            float dis = Vector2.Distance(startPos, endPos);
+            float y = LineWidth * 0.5f * (endPos.x - startPos.x) / dis;
+            float x = LineWidth * 0.5f * (endPos.y - startPos.y) / dis;
+            if (y <= 0)
+                y = -y;
+            else
+                x = -x;
+            UIVertex[] vertex = new UIVertex[4];
+            vertex[0].position = new Vector3(startPos.x + x, startPos.y + y);
+            vertex[1].position = new Vector3(endPos.x + x, endPos.y + y);
+            vertex[2].position = new Vector3(endPos.x - x, endPos.y - y);
+            vertex[3].position = new Vector3(startPos.x - x, startPos.y - y);
+            for (int i = 0; i < vertex.Length; i++)
+                vertex[i].color = color0;
+            return vertex;
+        }
+
+        #endregion
+    }
+}

+ 11 - 0
Assets/DuckHunter/ColorPicker/Scripts/ColoredTape.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bd4825edeb4d4e141a960b8e0363cfab
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 184 - 0
Assets/DuckHunter/ColorPicker/Scripts/GUIBox.cs

@@ -0,0 +1,184 @@
+using System.Collections;
+using ColorUiTools;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class GUIBox : MonoBehaviour
+{
+
+    public Image[] imagesWidth;
+    public Image[] imagesHeight;
+
+    private Vector2 initVector2;
+
+    public ColorPicker colorPicker;
+
+    public Slider sliderObj;
+
+    public Text colorPickerBtnText;
+
+    public Color oldColor;
+    public float oldSliderValue;
+
+    float remainingTime = 0;//记录的剩余时间
+    bool bCanSave = false;
+    float totalTime = 3f;//总共时间s
+
+
+    public GameObject CrossHairImage;
+
+
+
+    void Awake()
+    {
+        oldSliderValue = PlayerPrefs.GetFloat("GUIBoxSliderValue", 0);
+        oldColor = new Color(
+         PlayerPrefs.GetFloat("GUIBoxColor_R", 1f),
+         PlayerPrefs.GetFloat("GUIBoxColor_G", 1f),
+         PlayerPrefs.GetFloat("GUIBoxColor_B", 1f),
+         PlayerPrefs.GetFloat("GUIBoxColor_A", 1f));
+
+        Debug.Log("oldSliderValue 读取值:" + oldSliderValue);
+        Debug.Log("oldColor 读取值:" + oldColor);
+
+        CrossHairImage.SetActive(PlayerPrefs.GetInt("CrossHairImageActive", 1) == 1);
+    }
+
+    void Start()
+    {
+
+        colorPicker?.onPicker.AddListener(color =>
+        {
+
+            changeColor(color);
+            if (color != oldColor)
+            {
+                Debug.Log(color);
+                oldColor = color;
+                remainingTime = totalTime;
+                bCanSave = true;
+
+            }
+
+        });
+        if(colorPicker) colorPickerBtnText.text = colorPicker.gameObject.activeSelf ? "关闭选择颜色" : "开启选择颜色";
+       
+        initVector2 = new Vector2(
+            imagesWidth[0].GetComponent<RectTransform>().sizeDelta.x,
+            imagesHeight[0].GetComponent<RectTransform>().sizeDelta.y);
+
+        if(sliderObj)sliderObj.value = oldSliderValue;
+
+        changeSize(oldSliderValue);
+        changeColor(oldColor);
+
+        colorPicker?.onPickerStart.AddListener(color =>
+        {
+            //colorPicker.Color = oldColor;
+            colorPicker.SetNoniusPositionByColor(oldColor);
+        });
+    }
+
+    void Update()
+    {
+        if (remainingTime > 0)
+        {
+            remainingTime -= Time.deltaTime;
+
+        }
+        else
+        {
+            if (bCanSave)
+            {
+                bCanSave = false;
+                Debug.Log("记录滑块值:" + oldSliderValue);
+                PlayerPrefs.SetFloat("GUIBoxSliderValue", oldSliderValue);
+                Debug.Log("记录颜色值:" + oldColor);
+                PlayerPrefs.SetFloat("GUIBoxColor_R", oldColor.r);
+                PlayerPrefs.SetFloat("GUIBoxColor_G", oldColor.g);
+                PlayerPrefs.SetFloat("GUIBoxColor_B", oldColor.b);
+                PlayerPrefs.SetFloat("GUIBoxColor_A", oldColor.a);
+            }
+        }
+    }
+
+
+    public void onShowColorPicker()
+    {
+        colorPicker.gameObject.SetActive(!colorPicker.gameObject.activeSelf);
+        colorPickerBtnText.text = colorPicker.gameObject.activeSelf ? "关闭选择颜色" : "开启选择颜色";
+
+        // if (colorPicker.gameObject.activeSelf)
+        //     StartCoroutine(colorIEnumerator());
+    }
+
+    IEnumerator colorIEnumerator()
+    {
+        yield return new WaitForEndOfFrame();
+        colorPicker.Color = oldColor;
+    }
+
+    public void onSliceValue(Slider slider)
+    {
+
+        var _value = slider.value;
+        changeSize(_value);
+        if (oldSliderValue != _value)
+        {
+            oldSliderValue = _value;
+            remainingTime = totalTime;
+            bCanSave = true;
+        }
+
+    }
+
+    void changeSize(float step)
+    {
+        for (int i = 0; i < imagesWidth.Length; i++)
+        {
+            var widthTran = imagesWidth[i].GetComponent<RectTransform>();
+            widthTran.sizeDelta = new Vector2(initVector2.x + step, widthTran.sizeDelta.y);
+        }
+
+        for (int i = 0; i < imagesHeight.Length; i++)
+        {
+            var heightTran = imagesHeight[i].GetComponent<RectTransform>();
+            heightTran.sizeDelta = new Vector2(heightTran.sizeDelta.x, initVector2.y + step);
+        }
+    }
+
+    void changeColor(Color color)
+    {
+        for (int i = 0; i < imagesWidth.Length; i++)
+        {
+            imagesWidth[i].color = color;
+        }
+
+        for (int i = 0; i < imagesHeight.Length; i++)
+        {
+            imagesHeight[i].color = color;
+        }
+    }
+
+
+    public void onChangeCrossHairImage()
+    {
+
+  
+        CrossHairImage.SetActive(!CrossHairImage.activeSelf);
+        if (CrossHairImage.activeSelf)
+        {
+            ScreenLocate.Main.mUIManagerSingle?.onShowCrosshair();
+        }
+        else {
+            ScreenLocate.Main.mUIManagerSingle?.onHideCrosshair();
+        }
+        //PlayerPrefs.SetInt("CrossHairImageActive", CrossHairImage.activeSelf ? 1 : 0);
+    }
+
+    public void onSetCrossHairImage(bool bActive)
+    {
+
+        CrossHairImage.SetActive(bActive); 
+    }
+}

+ 11 - 0
Assets/DuckHunter/ColorPicker/Scripts/GUIBox.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c73dd0ac775dffe44b2252b10b18f7e4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/DragonBones.meta

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

+ 8 - 0
Assets/DuckHunter/DragonBones/Editor.meta

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

+ 184 - 0
Assets/DuckHunter/DragonBones/Editor/AssetProcess.cs

@@ -0,0 +1,184 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using UnityEngine;
+using System.Collections.Generic;
+using UnityEditor;
+using System.IO;
+
+namespace DragonBones
+{
+    public class AssetProcess : AssetPostprocessor
+    {
+        [System.Serializable]
+        struct SubTextureClass
+        {
+            public string name;
+            public float x, y, width, height, frameX, frameY, frameWidth, frameHeight;
+        }
+
+        [System.Serializable]
+        class TextureDataClass
+        {
+            public string name=null;
+            public string imagePath=null;
+            public int width=0,height=0;
+            public List<SubTextureClass> SubTexture=null;
+        }
+
+        public static void OnPostprocessAllAssets(string[]imported,string[] deletedAssets,string[] movedAssets,string[]movedFromAssetPaths)  
+        {
+            if (imported.Length == 0)
+            {
+                return;
+            }
+
+            var atlasPaths = new List<string>();
+            var imagePaths = new List<string>();
+            var skeletonPaths = new List<string>();
+
+            foreach (string str in imported)
+            {
+                string extension = Path.GetExtension(str).ToLower();
+                switch (extension)
+                {
+                case ".png":
+                    imagePaths.Add(str);
+                    break;
+                case ".json":
+                    if (str.EndsWith("_tex.json", System.StringComparison.Ordinal))
+                    {
+                        atlasPaths.Add(str);
+                    }
+                    else if (IsValidDragonBonesData((TextAsset)AssetDatabase.LoadAssetAtPath(str, typeof(TextAsset))))
+                    {
+                        skeletonPaths.Add(str);
+                    }
+                    else
+                    {
+                        atlasPaths.Add(str);
+                    }
+                    break;
+                case ".dbbin":
+                    if (File.Exists(str)){
+                        // string bytesPath = Path.GetDirectoryName(str) + "/" + Path.GetFileNameWithoutExtension(str) + ".bytes";
+                        // File.Move(str,bytesPath);
+                        // AssetDatabase.Refresh();
+                        // skeletonPaths.Add(bytesPath);
+                    }
+                    break;
+                case ".bytes":
+                    if (IsValidDragonBonesData((TextAsset)AssetDatabase.LoadAssetAtPath(str, typeof(TextAsset)))){
+                        skeletonPaths.Add(str);
+                    }
+                    break;
+                }
+            }
+            if (skeletonPaths.Count == 0)
+            {
+                return;
+            }
+
+            foreach(string skeletonPath in skeletonPaths)
+            {
+                List<string> imgPaths = new List<string>();
+                List<string> atlPaths = new List<string>();
+                foreach(string atlasPath in atlasPaths)
+                {
+                    if(atlasPath.IndexOf(skeletonPath.Substring(0,skeletonPath.LastIndexOf("/")))==0)
+                    {
+                        atlPaths.Add(atlasPath);
+                        imgPaths.Add(atlasPath.Substring(0,atlasPath.LastIndexOf(".json"))+".png");
+                    }
+                }
+
+                ProcessTextureAtlasData(atlPaths);
+            }
+        }
+
+        public static bool IsValidDragonBonesData (TextAsset asset)
+        {
+            if (asset.name.Contains("_ske"))
+            {
+                return true;
+            }
+
+            if(asset.text == "DBDT")
+            {
+                return true;
+            }
+
+            if (asset.text.IndexOf("\"armature\":") > 0)
+            {
+                return true;
+            }
+
+
+            return false;
+        }
+
+        static void ProcessTextureAtlasData(List<string> atlasPaths)
+        {
+            foreach(string path in atlasPaths)
+            {
+                TextAsset ta = AssetDatabase.LoadAssetAtPath<TextAsset>(path);
+                if(ta)
+                {
+                    TextureDataClass tdc = JsonUtility.FromJson<TextureDataClass>(ta.text);
+                    if(tdc != null && (tdc.width == 0 || tdc.height == 0))
+                    {
+                        //add width and height
+                        string imgPath = path.Substring(0,path.IndexOf(".json"))+".png";
+                        Texture2D texture = LoadPNG(Application.dataPath+"/"+ imgPath.Substring(6));
+                        if(texture)
+                        {
+                            tdc.width = texture.width;
+                            tdc.height = texture.height;
+                            //save
+                            string json = JsonUtility.ToJson(tdc);
+                            File.WriteAllText(path,json);
+                            EditorUtility.SetDirty(ta);
+
+                            GameObject.DestroyImmediate(texture);
+                        }
+                    }
+                }
+            }
+            AssetDatabase.Refresh();
+            AssetDatabase.SaveAssets();
+        }
+
+        static Texture2D LoadPNG(string filePath)
+        {
+            Texture2D tex = null;
+            byte[] fileData;
+
+            if (File.Exists(filePath))
+            {
+                fileData = File.ReadAllBytes(filePath);
+                tex = new Texture2D(2, 2);
+                tex.LoadImage(fileData);
+            }
+            return tex;
+        }
+    }
+}

+ 12 - 0
Assets/DuckHunter/DragonBones/Editor/AssetProcess.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8926fbe308c7c4b4faeac06713d43beb
+timeCreated: 1493429470
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 116 - 0
Assets/DuckHunter/DragonBones/Editor/DragonBonesIcons.cs

@@ -0,0 +1,116 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using UnityEngine;
+using UnityEditor;
+using UnityEditorInternal;
+using System.Reflection;
+using System.IO;
+
+namespace DragonBones
+{
+    [InitializeOnLoad]
+    public class DragonBonesIcons : Editor
+    {
+
+        static Texture2D /*textureBone,*/ textureArmature, textureImg, textureMesh/* , textureIk */;
+        static string editorPath = "";
+        static string editorGUIPath = "";
+        static bool isInited = false;
+        static DragonBonesIcons()
+        {
+            Initialize();
+        }
+
+        static void Initialize()
+        {
+            if (isInited)
+            {
+                return;
+            }
+
+            DirectoryInfo rootDir = new DirectoryInfo(Application.dataPath);
+            FileInfo[] files = rootDir.GetFiles("DragonBonesIcons.cs", SearchOption.AllDirectories);
+            editorPath = Path.GetDirectoryName(files[0].FullName.Replace("\\", "/").Replace(Application.dataPath, "Assets"));
+            editorGUIPath = editorPath + "/GUI";
+
+            // textureBone = AssetDatabase.LoadAssetAtPath<Texture2D>(editorGUIPath + "/icon-bone.png");
+            //textureIk = AssetDatabase.LoadAssetAtPath<Texture2D>(editorGUIPath + "/icon-ik.png");
+            textureArmature = AssetDatabase.LoadAssetAtPath<Texture2D>(editorGUIPath + "/icon-skeleton.png");
+            textureImg = AssetDatabase.LoadAssetAtPath<Texture2D>(editorGUIPath + "/icon-image.png");
+            textureMesh = AssetDatabase.LoadAssetAtPath<Texture2D>(editorGUIPath + "/icon-mesh.png");
+
+            EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI;
+            EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI;
+            isInited = true;
+        }
+
+        static void HierarchyIconsOnGUI(int instanceId, Rect selectionRect)
+        {
+            GameObject go = (GameObject)EditorUtility.InstanceIDToObject(instanceId);
+            if (!go)
+            {
+                return;
+            }
+
+            Rect rect = new Rect(selectionRect.x - 25f, selectionRect.y + 2, 15f, 15f);
+
+            if (go.GetComponent<UnityArmatureComponent>())
+            {
+                rect.x = selectionRect.x + selectionRect.width - 15f;
+                GUI.Label(rect, textureArmature);
+                return;
+            }
+
+            UnityUGUIDisplay ugui = go.GetComponent<UnityUGUIDisplay>();
+            if (ugui && ugui.sharedMesh)
+            {
+                if (ugui.sharedMesh.vertexCount == 4)
+                {
+                    GUI.Label(rect, textureImg);
+                }
+                else
+                {
+                    GUI.Label(rect, textureMesh);
+                }
+                return;
+            }
+
+            MeshFilter mf = go.GetComponent<MeshFilter>();
+            if (mf && mf.sharedMesh &&
+                mf.transform.parent != null &&
+                mf.transform.parent.GetComponent<UnityArmatureComponent>() != null)
+            {
+                if (mf.sharedMesh.vertexCount == 4)
+                {
+                    GUI.Label(rect, textureImg);
+                }
+                else
+                {
+                    GUI.Label(rect, textureMesh);
+                }
+                return;
+            }
+        }
+    }
+
+}

+ 12 - 0
Assets/DuckHunter/DragonBones/Editor/DragonBonesIcons.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a088530dfe3524464b8955ff86e18a2c
+timeCreated: 1493517806
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 130 - 0
Assets/DuckHunter/DragonBones/Editor/PickJsonDataWindow.cs

@@ -0,0 +1,130 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using UnityEngine;
+using UnityEditor;
+using System.Collections.Generic;
+
+namespace DragonBones
+{
+    /// <summary>
+    /// JSON数据拾取,为UnityArmatureComponent创建UnityDragonBonesData
+    /// </summary>
+    public class PickJsonDataWindow : EditorWindow
+    {
+        private const string ObjectSelectorUpdated = "ObjectSelectorUpdated";
+        private const string ObjectSelectorClosed = "ObjectSelectorClosed";
+        //private const string PickFileFileter = "_ske t:TextAsset";
+        private const string PickFileFileter = "t:TextAsset";
+
+
+        private UnityArmatureComponent _armatureComp;
+        private TextAsset _dragonBoneJSONData;
+
+        private bool _isOpenPickWindow = false;
+        private int _controlID;
+
+        //
+        public static void OpenWindow(UnityArmatureComponent armatureComp)
+        {
+            if (armatureComp == null)
+            {
+                return;
+            }
+
+            //
+            var win = GetWindow<PickJsonDataWindow>();
+            win._armatureComp = armatureComp;
+        }
+
+        private void OnDestroy()
+        {
+            _armatureComp = null;
+            _dragonBoneJSONData = null;
+
+            _isOpenPickWindow = false;
+            _controlID = 0;
+        }
+
+        private void Awake()
+        {
+            _dragonBoneJSONData = null;
+
+            _isOpenPickWindow = false;
+            _controlID = 0;
+
+            this.maxSize = Vector2.one;
+            this.minSize = Vector2.one;
+        }
+
+        private void OnGUI()
+        {
+            ShowPickJsonWindow();
+
+            string commandName = Event.current.commandName;
+            if (commandName == ObjectSelectorUpdated)
+            {
+                //更新JSON数据
+                _dragonBoneJSONData = EditorGUIUtility.GetObjectPickerObject() as TextAsset;
+            }
+            else if (commandName == ObjectSelectorClosed)
+            {
+                //根据选择的JSON数据设置DragonBonesData
+
+                //这里不仅创建了DragonBonesData,并且更新了场景中的显示对象
+                //UnityEditor.ChangeDragonBonesData(_armatureComp, _dragonBoneJSONData);
+
+                if (_dragonBoneJSONData != null)
+                {
+                    SetUnityDragonBonesData();
+                }
+
+                Repaint();
+
+                this.Close();
+            }
+        }
+
+        private void ShowPickJsonWindow()
+        {
+            if (_isOpenPickWindow)
+            {
+                return;
+            }
+
+            _controlID = EditorGUIUtility.GetControlID(FocusType.Passive);
+            EditorGUIUtility.ShowObjectPicker<TextAsset>(null, false, PickFileFileter, _controlID);
+
+            _isOpenPickWindow = true;
+        }
+
+        private void SetUnityDragonBonesData()
+        {
+            List<string> textureAtlasJSONs = new List<string>();
+            UnityEditor.GetTextureAtlasConfigs(textureAtlasJSONs, AssetDatabase.GetAssetPath(_dragonBoneJSONData.GetInstanceID()));
+            UnityDragonBonesData.TextureAtlas[] textureAtlas = UnityEditor.GetTextureAtlasByJSONs(textureAtlasJSONs);
+
+            UnityDragonBonesData data = UnityEditor.CreateUnityDragonBonesData(_dragonBoneJSONData, textureAtlas);
+            _armatureComp.unityData = data;
+        }
+    }
+}

+ 12 - 0
Assets/DuckHunter/DragonBones/Editor/PickJsonDataWindow.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b8642302e7db63749a68f2d9ebff07c9
+timeCreated: 1507795665
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 141 - 0
Assets/DuckHunter/DragonBones/Editor/ShowSlotsWindow.cs

@@ -0,0 +1,141 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using DragonBones;
+
+namespace DragonBones
+{
+    [System.Serializable]
+    public class SlotItemData
+    {
+        public UnitySlot slot;
+        public int sumLevel;
+        public bool isSelected;
+    }
+
+    public class ShowSlotsWindow : EditorWindow
+    {
+        private const float WIDTH = 400.0f;
+        private const float HEIGHT = 200.0f;
+        private readonly List<SlotItemData> _slotItems = new List<SlotItemData>();
+        private UnityArmatureComponent _armatureComp;
+
+        private Vector2 _scrollPos;
+        public static void OpenWindow(UnityArmatureComponent armatureComp)
+        {
+            if (armatureComp == null)
+            {
+                return;
+            }
+
+            var win = GetWindowWithRect(typeof(ShowSlotsWindow), new Rect(0.0f, 0.0f, WIDTH, HEIGHT), false) as ShowSlotsWindow;
+            win._armatureComp = armatureComp;
+            win.titleContent = new GUIContent("SlotList");
+            win.Show();
+        }
+
+        void ColletSlotData(Armature armature, int sumLevel)
+        {
+            var slots = armature.GetSlots();
+
+            foreach (UnitySlot slot in slots)
+            {
+                var slotItem = new SlotItemData();
+                slotItem.slot = slot;
+                slotItem.sumLevel = sumLevel;
+                slotItem.isSelected = slot.isIgnoreCombineMesh || (slot.renderDisplay != null && slot.renderDisplay.activeSelf);
+
+                this._slotItems.Add(slotItem);
+                if (slot.childArmature != null)
+                {
+                    this.ColletSlotData(slot.childArmature, sumLevel + 1);
+                }
+            }
+        }
+
+        void OnGUI()
+        {
+            if (this._slotItems.Count == 0)
+            {
+                this.ColletSlotData(this._armatureComp.armature, 0);
+            }
+
+            //
+            ShowSlots(this._armatureComp.armature);
+
+            //
+            if (GUILayout.Button("Apply"))
+            {
+                foreach (var slotItem in this._slotItems)
+                {
+                    var slot = slotItem.slot;
+                    if (slotItem.isSelected && slot.renderDisplay != null && !slot.renderDisplay.activeSelf)
+                    {
+                        slot.DisallowCombineMesh();
+                        var combineMeshs = (slot.armature.proxy as UnityArmatureComponent).GetComponent<UnityCombineMeshs>();
+                        if (combineMeshs != null)
+                        {
+                            combineMeshs.BeginCombineMesh();
+                        }
+                    }
+                }
+                //
+                this.Close();
+            }
+        }
+
+        void ShowSlots(Armature armature)
+        {
+            var leftMargin = 20;
+            var indentSpace = 50;
+            _scrollPos = GUILayout.BeginScrollView(_scrollPos);
+            for (var i = 0; i < this._slotItems.Count; i++)
+            {
+                var slotItem = this._slotItems[i];
+                var slot = slotItem.slot;
+
+                //
+                GUILayout.BeginHorizontal();
+                var lableStyle = new GUIStyle();
+                lableStyle.margin.left = slotItem.sumLevel * indentSpace + leftMargin;
+                GUILayout.Label(slot.name, lableStyle, GUILayout.Width(100.0f));
+                if(slot.renderDisplay == null || !slot.renderDisplay.activeSelf)
+                {
+                    slotItem.isSelected = GUILayout.Toggle(slotItem.isSelected, "Active");
+                }
+                else
+                {
+                    GUILayout.Label("Activated");
+                }
+                
+                GUILayout.EndHorizontal();
+            }
+
+            GUILayout.EndScrollView();
+        }
+    }
+}
+

+ 12 - 0
Assets/DuckHunter/DragonBones/Editor/ShowSlotsWindow.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 99d9d3ec59c699f45b6a13426945389d
+timeCreated: 1515123986
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 481 - 0
Assets/DuckHunter/DragonBones/Editor/UnityArmatureEditor.cs

@@ -0,0 +1,481 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using UnityEditorInternal;
+using System.Reflection;
+using UnityEditor.SceneManagement;
+
+namespace DragonBones
+{
+    [CustomEditor(typeof(UnityArmatureComponent))]
+    public class UnityArmatureEditor : Editor
+    {
+        private long _nowTime = 0;
+        private float _frameRate = 1.0f / 24.0f;
+
+        private int _armatureIndex = -1;
+        private int _animationIndex = -1;
+        private int _sortingModeIndex = -1;
+        private int _sortingLayerIndex = -1;
+
+        private List<string> _armatureNames = null;
+        private List<string> _animationNames = null;
+        private List<string> _sortingLayerNames = null;
+
+        private UnityArmatureComponent _armatureComponent = null;
+
+        private SerializedProperty _playTimesPro;
+        private SerializedProperty _timeScalePro;
+        private SerializedProperty _flipXPro;
+        private SerializedProperty _flipYPro;
+        private SerializedProperty _closeCombineMeshsPro;
+
+        private string[] _sortingMode = new string[] { SortingMode.SortByZ.ToString(), SortingMode.SortByOrder.ToString() };
+
+        void ClearUp()
+        {
+            this._armatureIndex = -1;
+            this._animationIndex = -1;
+            // this._sortingModeIndex = -1;
+            // this._sortingLayerIndex = -1;
+
+            this._armatureNames = null;
+            this._animationNames = null;
+            // this._sortingLayerNames = null;
+        }
+
+        void OnDisable()
+        {
+        }
+
+        void OnEnable()
+        {
+            this._armatureComponent = target as UnityArmatureComponent;
+            if (_IsPrefab())
+            {
+                return;
+            }
+
+            // 
+            this._nowTime = System.DateTime.Now.Ticks;
+
+            this._sortingModeIndex = (int)this._armatureComponent.sortingMode;
+            this._sortingLayerNames = _GetSortingLayerNames();
+            this._sortingLayerIndex = this._sortingLayerNames.IndexOf(this._armatureComponent.sortingLayerName);
+
+            this._playTimesPro = serializedObject.FindProperty("_playTimes");
+            this._timeScalePro = serializedObject.FindProperty("_timeScale");
+            this._flipXPro = serializedObject.FindProperty("_flipX");
+            this._flipYPro = serializedObject.FindProperty("_flipY");
+            this._closeCombineMeshsPro = serializedObject.FindProperty("_closeCombineMeshs");
+
+            // Update armature.
+            if (!EditorApplication.isPlayingOrWillChangePlaymode &&
+                _armatureComponent.armature == null &&
+                _armatureComponent.unityData != null &&
+                !string.IsNullOrEmpty(_armatureComponent.armatureName))
+            {
+                // Clear cache
+                UnityFactory.factory.Clear(true);
+
+                // Unload
+                EditorUtility.UnloadUnusedAssetsImmediate();
+                System.GC.Collect();
+
+                // Load data.
+                var dragonBonesData = UnityFactory.factory.LoadData(_armatureComponent.unityData);
+
+                // Refresh texture atlas.
+                UnityFactory.factory.RefreshAllTextureAtlas(_armatureComponent);
+
+                // Refresh armature.
+                UnityEditor.ChangeArmatureData(_armatureComponent, _armatureComponent.armatureName, dragonBonesData.name);
+
+                // Refresh texture.
+                _armatureComponent.armature.InvalidUpdate(null, true);
+
+                // Play animation.
+                if (!string.IsNullOrEmpty(_armatureComponent.animationName))
+                {
+                    _armatureComponent.animation.Play(_armatureComponent.animationName, _playTimesPro.intValue);
+                }
+            }
+
+            // Update hideFlags.
+            if (!EditorApplication.isPlayingOrWillChangePlaymode &&
+                _armatureComponent.armature != null &&
+                _armatureComponent.armature.parent != null)
+            {
+                _armatureComponent.gameObject.hideFlags = HideFlags.NotEditable;
+            }
+            else
+            {
+                _armatureComponent.gameObject.hideFlags = HideFlags.None;
+            }
+
+            _UpdateParameters();
+        }
+
+        public override void OnInspectorGUI()
+        {
+            if (_IsPrefab())
+            {
+                return;
+            }
+
+            serializedObject.Update();
+
+            if (_armatureIndex == -1)
+            {
+                _UpdateParameters();
+            }
+
+            // DragonBones Data
+            EditorGUILayout.BeginHorizontal();
+
+            _armatureComponent.unityData = EditorGUILayout.ObjectField("DragonBones Data", _armatureComponent.unityData, typeof(UnityDragonBonesData), false) as UnityDragonBonesData;
+
+            var created = false;
+            if (_armatureComponent.unityData != null)
+            {
+                if (_armatureComponent.armature == null)
+                {
+                    if (GUILayout.Button("Create"))
+                    {
+                        created = true;
+                    }
+                }
+                else
+                {
+                    if (GUILayout.Button("Reload"))
+                    {
+                        if (EditorUtility.DisplayDialog("DragonBones Alert", "Are you sure you want to reload data", "Yes", "No"))
+                        {
+                            created = true;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                //create UnityDragonBonesData by a json data
+                if (GUILayout.Button("JSON"))
+                {
+                    PickJsonDataWindow.OpenWindow(_armatureComponent);
+                }
+            }
+
+            if (created)
+            {
+                //clear cache
+                UnityFactory.factory.Clear(true);
+                ClearUp();
+                _armatureComponent.animationName = null;
+
+                if (UnityEditor.ChangeDragonBonesData(_armatureComponent, _armatureComponent.unityData.dragonBonesJSON))
+                {
+                    _UpdateParameters();
+                }
+            }
+
+            EditorGUILayout.EndHorizontal();
+            EditorGUILayout.Space();
+
+            if (_armatureComponent.armature != null)
+            {
+                var dragonBonesData = _armatureComponent.armature.armatureData.parent;
+
+                // Armature
+                if (UnityFactory.factory.GetAllDragonBonesData().ContainsValue(dragonBonesData) && _armatureNames != null)
+                {
+                    var armatureIndex = EditorGUILayout.Popup("Armature", _armatureIndex, _armatureNames.ToArray());
+                    if (_armatureIndex != armatureIndex)
+                    {
+                        _armatureIndex = armatureIndex;
+
+                        var armatureName = _armatureNames[_armatureIndex];
+                        UnityEditor.ChangeArmatureData(_armatureComponent, armatureName, dragonBonesData.name);
+                        _UpdateParameters();
+
+                        _armatureComponent.gameObject.name = armatureName;
+
+                        MarkSceneDirty();
+                    }
+                }
+
+                // Animation
+                if (_animationNames != null && _animationNames.Count > 0)
+                {
+                    EditorGUILayout.BeginHorizontal();
+                    List<string> anims = new List<string>(_animationNames);
+                    anims.Insert(0, "<None>");
+                    var animationIndex = EditorGUILayout.Popup("Animation", _animationIndex + 1, anims.ToArray()) - 1;
+                    if (animationIndex != _animationIndex)
+                    {
+                        _animationIndex = animationIndex;
+                        if (animationIndex >= 0)
+                        {
+                            _armatureComponent.animationName = _animationNames[animationIndex];
+                            var animationData = _armatureComponent.animation.animations[_armatureComponent.animationName];
+                            _armatureComponent.animation.Play(_armatureComponent.animationName, _playTimesPro.intValue);
+                            _UpdateParameters();
+                        }
+                        else
+                        {
+                            _armatureComponent.animationName = null;
+                            _playTimesPro.intValue = 0;
+                            _armatureComponent.animation.Stop();
+                        }
+
+                        MarkSceneDirty();
+                    }
+
+                    if (_animationIndex >= 0)
+                    {
+                        if (_armatureComponent.animation.isPlaying)
+                        {
+                            if (GUILayout.Button("Stop"))
+                            {
+                                _armatureComponent.animation.Stop();
+                            }
+                        }
+                        else
+                        {
+                            if (GUILayout.Button("Play"))
+                            {
+                                _armatureComponent.animation.Play(null, _playTimesPro.intValue);
+                            }
+                        }
+                    }
+                    EditorGUILayout.EndHorizontal();
+
+                    //playTimes
+                    EditorGUILayout.BeginHorizontal();
+                    var playTimes = _playTimesPro.intValue;
+                    EditorGUILayout.PropertyField(_playTimesPro, false);
+                    if (playTimes != _playTimesPro.intValue)
+                    {
+                        if (!string.IsNullOrEmpty(_armatureComponent.animationName))
+                        {
+                            _armatureComponent.animation.Reset();
+                            _armatureComponent.animation.Play(_armatureComponent.animationName, _playTimesPro.intValue);
+                        }
+                    }
+                    EditorGUILayout.EndHorizontal();
+
+                    // TimeScale
+                    var timeScale = _timeScalePro.floatValue;
+                    EditorGUILayout.PropertyField(_timeScalePro, false);
+                    if (timeScale != _timeScalePro.floatValue)
+                    {
+                        _armatureComponent.animation.timeScale = _timeScalePro.floatValue;
+                    }
+                }
+
+                //
+                EditorGUILayout.Space();
+
+                if (!_armatureComponent.isUGUI)
+                {
+                    //Sorting Mode
+                    _sortingModeIndex = EditorGUILayout.Popup("Sorting Mode", (int)_armatureComponent.sortingMode, _sortingMode);
+                    if (_sortingModeIndex != (int)_armatureComponent.sortingMode)
+                    {
+                        Undo.RecordObject(_armatureComponent, "Sorting Mode");
+                        _armatureComponent.sortingMode = (SortingMode)_sortingModeIndex;
+                        // 里面return了,没有赋值成功
+                        if (_armatureComponent.sortingMode != (SortingMode)_sortingModeIndex)
+                        {
+                            _sortingModeIndex = (int)_armatureComponent.sortingMode;
+                        }
+
+                        MarkSceneDirty();
+                    }
+
+                    // Sorting Layer
+                    _sortingLayerIndex = EditorGUILayout.Popup("Sorting Layer", _sortingLayerIndex, _sortingLayerNames.ToArray());
+                    if (_sortingLayerNames[_sortingLayerIndex] != _armatureComponent.sortingLayerName)
+                    {
+                        Undo.RecordObject(_armatureComponent, "Sorting Layer");
+                        _armatureComponent.sortingLayerName = _sortingLayerNames[_sortingLayerIndex];
+
+                        MarkSceneDirty();
+                    }
+
+                    // Sorting Order
+                    var sortingOrder = EditorGUILayout.IntField("Order in Layer", _armatureComponent.sortingOrder);
+                    if (sortingOrder != _armatureComponent.sortingOrder)
+                    {
+                        Undo.RecordObject(_armatureComponent, "Edit Sorting Order");
+                        _armatureComponent.sortingOrder = sortingOrder;
+
+                        MarkSceneDirty();
+                    }
+
+                    // ZSpace
+                    EditorGUILayout.BeginHorizontal();
+                    _armatureComponent.zSpace = EditorGUILayout.Slider("Z Space", _armatureComponent.zSpace, 0.0f, 0.5f);
+                    EditorGUILayout.EndHorizontal();
+                }
+
+                EditorGUILayout.Space();
+
+                // Flip
+                EditorGUILayout.BeginHorizontal();
+                EditorGUILayout.PrefixLabel("Flip");
+                var flipX = _flipXPro.boolValue;
+                var flipY = _flipYPro.boolValue;
+                _flipXPro.boolValue = GUILayout.Toggle(_flipXPro.boolValue, "X", GUILayout.Width(30));
+                _flipYPro.boolValue = GUILayout.Toggle(_flipYPro.boolValue, "Y", GUILayout.Width(30));
+                if (flipX != _flipXPro.boolValue || flipY != _flipYPro.boolValue)
+                {
+                    _armatureComponent.armature.flipX = _flipXPro.boolValue;
+                    _armatureComponent.armature.flipY = _flipYPro.boolValue;
+
+                    MarkSceneDirty();
+                }
+
+                EditorGUILayout.EndHorizontal();
+
+                EditorGUILayout.Space();
+            }
+
+            if (_armatureComponent.armature != null && _armatureComponent.armature.parent == null)
+            {
+                if (!Application.isPlaying && !this._armatureComponent.isUGUI)
+                {
+                    //
+                    var oldValue = this._closeCombineMeshsPro.boolValue;
+                    if (!this._closeCombineMeshsPro.boolValue)
+                    {
+                        this._closeCombineMeshsPro.boolValue = EditorGUILayout.Toggle("CloseCombineMeshs", this._closeCombineMeshsPro.boolValue);
+
+                        if (GUILayout.Button("Show Slots"))
+                        {
+                            ShowSlotsWindow.OpenWindow(this._armatureComponent);
+                        }
+                    }
+
+                    if (oldValue != this._closeCombineMeshsPro.boolValue)
+                    {
+                        if (this._closeCombineMeshsPro.boolValue)
+                        {
+                            this._armatureComponent.CloseCombineMeshs();
+                        }
+                    }
+                }
+            }
+
+            serializedObject.ApplyModifiedProperties();
+
+            if (!EditorApplication.isPlayingOrWillChangePlaymode && Selection.activeObject == _armatureComponent.gameObject)
+            {
+                EditorUtility.SetDirty(_armatureComponent);
+                HandleUtility.Repaint();
+            }
+        }
+
+        void OnSceneGUI()
+        {
+            if (!EditorApplication.isPlayingOrWillChangePlaymode && _armatureComponent.armature != null)
+            {
+                var dt = (System.DateTime.Now.Ticks - _nowTime) * 0.0000001f;
+                if (dt >= _frameRate)
+                {
+                    _armatureComponent.armature.AdvanceTime(dt);
+
+                    foreach (var slot in _armatureComponent.armature.GetSlots())
+                    {
+                        if (slot.childArmature != null)
+                        {
+                            slot.childArmature.AdvanceTime(dt);
+                        }
+                    }
+
+                    //
+                    _nowTime = System.DateTime.Now.Ticks;
+                }
+            }
+        }
+
+        private void _UpdateParameters()
+        {
+            if (_armatureComponent.armature != null)
+            {
+                _frameRate = 1.0f / (float)_armatureComponent.armature.armatureData.frameRate;
+
+                if (_armatureComponent.armature.armatureData.parent != null)
+                {
+                    _armatureNames = _armatureComponent.armature.armatureData.parent.armatureNames;
+                    _animationNames = _armatureComponent.animation.animationNames;
+                    _armatureIndex = _armatureNames.IndexOf(_armatureComponent.armature.name);
+                    //
+                    if (!string.IsNullOrEmpty(_armatureComponent.animationName))
+                    {
+                        _animationIndex = _animationNames.IndexOf(_armatureComponent.animationName);
+                    }
+                }
+                else
+                {
+                    _armatureNames = null;
+                    _animationNames = null;
+                    _armatureIndex = -1;
+                    _animationIndex = -1;
+                }
+            }
+            else
+            {
+                _armatureNames = null;
+                _animationNames = null;
+                _armatureIndex = -1;
+                _animationIndex = -1;
+            }
+        }
+
+        private bool _IsPrefab()
+        {
+            return PrefabUtility.GetCorrespondingObjectFromSource(_armatureComponent.gameObject) == null
+                && PrefabUtility.GetCorrespondingObjectFromSource(_armatureComponent.gameObject) != null;
+        }
+
+        private List<string> _GetSortingLayerNames()
+        {
+            var internalEditorUtilityType = typeof(InternalEditorUtility);
+            var sortingLayersProperty = internalEditorUtilityType.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic);
+
+            return new List<string>(sortingLayersProperty.GetValue(null, new object[0]) as string[]);
+        }
+
+        private void MarkSceneDirty()
+        {
+            EditorUtility.SetDirty(_armatureComponent);
+            //
+            if (!Application.isPlaying && !_IsPrefab())
+            {
+                EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
+            }
+        }
+    }
+}

+ 12 - 0
Assets/DuckHunter/DragonBones/Editor/UnityArmatureEditor.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: dec2f8b52399f482e8aea6601611a8cd
+timeCreated: 1493990767
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 478 - 0
Assets/DuckHunter/DragonBones/Editor/UnityEditor.cs

@@ -0,0 +1,478 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System.Collections.Generic;
+using System.IO;
+using UnityEngine;
+using UnityEditor;
+using UnityEditor.SceneManagement;
+using System.Text.RegularExpressions;
+
+namespace DragonBones
+{
+    public class UnityEditor
+    {
+        [MenuItem("GameObject/DragonBones/Armature Object", false, 10)]
+        private static void _CreateArmatureObjectMenuItem()
+        {
+            _CreateEmptyObject(GetSelectionParentTransform());
+        }
+
+        [MenuItem("Assets/Create/DragonBones/Armature Object", true)]
+        private static bool _CreateArmatureObjectFromSkeValidateMenuItem()
+        {
+            return _GetDragonBonesSkePaths().Count > 0;
+        }
+
+        [MenuItem("Assets/Create/DragonBones/Armature Object", false, 10)]
+        private static void _CreateArmatureObjectFromSkeMenuItem()
+        {
+            var parentTransform = GetSelectionParentTransform();
+            foreach (var dragonBonesJSONPath in _GetDragonBonesSkePaths())
+            {
+                var armatureComponent = _CreateEmptyObject(parentTransform);
+                var dragonBonesJSON = AssetDatabase.LoadMainAssetAtPath(dragonBonesJSONPath) as TextAsset;
+
+                ChangeDragonBonesData(armatureComponent, dragonBonesJSON);
+            }
+        }
+
+        [MenuItem("GameObject/DragonBones/Armature Object(UGUI)", false, 11)]
+        private static void _CreateUGUIArmatureObjectMenuItem()
+        {
+            var armatureComponent = _CreateEmptyObject(GetSelectionParentTransform());
+            armatureComponent.isUGUI = true;
+            if (armatureComponent.GetComponentInParent<Canvas>() == null)
+            {
+                var canvas = GameObject.Find("/Canvas");
+                if (canvas)
+                {
+                    armatureComponent.transform.SetParent(canvas.transform);
+                }
+            }
+
+            armatureComponent.transform.localScale = Vector2.one * 100.0f;
+            armatureComponent.transform.localPosition = Vector3.zero;
+        }
+
+        [MenuItem("Assets/Create/DragonBones/Armature Object(UGUI)", true)]
+        private static bool _CreateUGUIArmatureObjectFromJSONValidateMenuItem()
+        {
+            return _GetDragonBonesSkePaths().Count > 0;
+        }
+
+        [MenuItem("Assets/Create/DragonBones/Armature Object(UGUI)", false, 11)]
+        private static void _CreateUGUIArmatureObjectFromJSOIMenuItem()
+        {
+            var parentTransform = GetSelectionParentTransform();
+            foreach (var dragonBonesJSONPath in _GetDragonBonesSkePaths())
+            {
+                var armatureComponent = _CreateEmptyObject(parentTransform);
+                armatureComponent.isUGUI = true;
+                if (armatureComponent.GetComponentInParent<Canvas>() == null)
+                {
+                    var canvas = GameObject.Find("/Canvas");
+                    if (canvas)
+                    {
+                        armatureComponent.transform.SetParent(canvas.transform);
+                    }
+                }
+                armatureComponent.transform.localScale = Vector2.one * 100.0f;
+                armatureComponent.transform.localPosition = Vector3.zero;
+                var dragonBonesJSON = AssetDatabase.LoadMainAssetAtPath(dragonBonesJSONPath) as TextAsset;
+
+                ChangeDragonBonesData(armatureComponent, dragonBonesJSON);
+            }
+        }
+
+
+        [MenuItem("Assets/Create/DragonBones/Create Unity Data", true)]
+        private static bool _CreateUnityDataValidateMenuItem()
+        {
+            return _GetDragonBonesSkePaths(true).Count > 0;
+        }
+
+        [MenuItem("Assets/Create/DragonBones/Create Unity Data", false, 32)]
+        private static void _CreateUnityDataMenuItem()
+        {
+            foreach (var dragonBonesSkePath in _GetDragonBonesSkePaths(true))
+            {
+                var dragonBonesSke = AssetDatabase.LoadMainAssetAtPath(dragonBonesSkePath) as TextAsset;
+                var textureAtlasJSONs = new List<string>();
+                GetTextureAtlasConfigs(textureAtlasJSONs, AssetDatabase.GetAssetPath(dragonBonesSke.GetInstanceID()));
+                UnityDragonBonesData.TextureAtlas[] textureAtlas = new UnityDragonBonesData.TextureAtlas[textureAtlasJSONs.Count];
+
+                for (int i = 0; i < textureAtlasJSONs.Count; ++i)
+                {
+                    string path = textureAtlasJSONs[i];
+                    //load textureAtlas data
+                    UnityDragonBonesData.TextureAtlas ta = new UnityDragonBonesData.TextureAtlas();
+                    ta.textureAtlasJSON = AssetDatabase.LoadAssetAtPath<TextAsset>(path);
+                    //load texture
+                    path = path.Substring(0, path.LastIndexOf(".json"));
+                    ta.texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path + ".png");
+                    //load material
+                    ta.material = AssetDatabase.LoadAssetAtPath<Material>(path + "_Mat.mat");
+                    ta.uiMaterial = AssetDatabase.LoadAssetAtPath<Material>(path + "_UI_Mat.mat");
+                    textureAtlas[i] = ta;
+                }
+
+                //
+                CreateUnityDragonBonesData(dragonBonesSke, textureAtlas);
+            }
+        }
+
+        public static UnityDragonBonesData.TextureAtlas[] GetTextureAtlasByJSONs(List<string> textureAtlasJSONs)
+        {
+            UnityDragonBonesData.TextureAtlas[] textureAtlas = new UnityDragonBonesData.TextureAtlas[textureAtlasJSONs.Count];
+
+            for (int i = 0; i < textureAtlasJSONs.Count; ++i)
+            {
+                string path = textureAtlasJSONs[i];
+                //load textureAtlas data
+                UnityDragonBonesData.TextureAtlas ta = new UnityDragonBonesData.TextureAtlas();
+                ta.textureAtlasJSON = AssetDatabase.LoadAssetAtPath<TextAsset>(path);
+                //load texture
+                path = path.Substring(0, path.LastIndexOf(".json"));
+                ta.texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path + ".png");
+                //load material
+                ta.material = AssetDatabase.LoadAssetAtPath<Material>(path + "_Mat.mat");
+                ta.uiMaterial = AssetDatabase.LoadAssetAtPath<Material>(path + "_UI_Mat.mat");
+                textureAtlas[i] = ta;
+            }
+
+            return textureAtlas;
+        }
+
+
+        public static bool ChangeDragonBonesData(UnityArmatureComponent _armatureComponent, TextAsset dragonBoneJSON)
+        {
+            if (dragonBoneJSON != null)
+            {
+                var textureAtlasJSONs = new List<string>();
+                UnityEditor.GetTextureAtlasConfigs(textureAtlasJSONs, AssetDatabase.GetAssetPath(dragonBoneJSON.GetInstanceID()));
+
+                UnityDragonBonesData.TextureAtlas[] textureAtlas = UnityEditor.GetTextureAtlasByJSONs(textureAtlasJSONs);
+
+                UnityDragonBonesData data = UnityEditor.CreateUnityDragonBonesData(dragonBoneJSON, textureAtlas);
+                _armatureComponent.unityData = data;
+
+                var dragonBonesData = UnityFactory.factory.LoadData(data, _armatureComponent.isUGUI);
+                if (dragonBonesData != null)
+                {
+                    Undo.RecordObject(_armatureComponent, "Set DragonBones");
+
+                    _armatureComponent.unityData = data;
+
+                    var armatureName = dragonBonesData.armatureNames[0];
+                    ChangeArmatureData(_armatureComponent, armatureName, _armatureComponent.unityData.dataName);
+
+                    _armatureComponent.gameObject.name = armatureName;
+
+                    EditorUtility.SetDirty(_armatureComponent);
+
+                    return true;
+                }
+                else
+                {
+                    EditorUtility.DisplayDialog("Error", "Could not load dragonBones data.", "OK", null);
+
+                    return false;
+                }
+            }
+            else if (_armatureComponent.unityData != null)
+            {
+                Undo.RecordObject(_armatureComponent, "Set DragonBones");
+
+                _armatureComponent.unityData = null;
+
+                if (_armatureComponent.armature != null)
+                {
+                    _armatureComponent.Dispose(false);
+                }
+
+                EditorUtility.SetDirty(_armatureComponent);
+
+                return true;
+            }
+
+            return false;
+        }
+
+        public static void ChangeArmatureData(UnityArmatureComponent _armatureComponent, string armatureName, string dragonBonesName)
+        {
+            bool isUGUI = _armatureComponent.isUGUI;
+            UnityDragonBonesData unityData = null;
+            Slot slot = null;
+            if (_armatureComponent.armature != null)
+            {
+                unityData = _armatureComponent.unityData;
+                slot = _armatureComponent.armature.parent;
+                _armatureComponent.Dispose(false);
+
+                UnityFactory.factory._dragonBones.AdvanceTime(0.0f);
+
+                _armatureComponent.unityData = unityData;
+            }
+
+            _armatureComponent.armatureName = armatureName;
+            _armatureComponent.isUGUI = isUGUI;
+
+            _armatureComponent = UnityFactory.factory.BuildArmatureComponent(_armatureComponent.armatureName, dragonBonesName, null, _armatureComponent.unityData.dataName, _armatureComponent.gameObject, _armatureComponent.isUGUI);
+            if (slot != null)
+            {
+                slot.childArmature = _armatureComponent.armature;
+            }
+
+            _armatureComponent.sortingLayerName = _armatureComponent.sortingLayerName;
+            _armatureComponent.sortingOrder = _armatureComponent.sortingOrder;
+        }
+
+        public static UnityEngine.Transform GetSelectionParentTransform()
+        {
+            var parent = Selection.activeObject as GameObject;
+            return parent != null ? parent.transform : null;
+        }
+
+        public static void GetTextureAtlasConfigs(List<string> textureAtlasFiles, string filePath, string rawName = null, string suffix = "tex")
+        {
+            var folder = Directory.GetParent(filePath).ToString();
+
+            var name = rawName != null ? rawName : filePath.Substring(0, filePath.LastIndexOf(".")).Substring(filePath.LastIndexOf("/") + 1);
+            if (name.LastIndexOf("_ske") == name.Length - 4)
+            {
+                name = name.Substring(0, name.LastIndexOf("_ske"));
+            }
+            int index = 0;
+            var textureAtlasName = "";
+            var textureAtlasConfigFile = "";
+
+            textureAtlasName = !string.IsNullOrEmpty(name) ? name + (!string.IsNullOrEmpty(suffix) ? "_" + suffix : suffix) : suffix;
+            textureAtlasConfigFile = folder + "/" + textureAtlasName + ".json";
+
+            if (File.Exists(textureAtlasConfigFile))
+            {
+                textureAtlasFiles.Add(textureAtlasConfigFile);
+                return;
+            }
+
+            while (true)
+            {
+                textureAtlasName = (!string.IsNullOrEmpty(name) ? name + (!string.IsNullOrEmpty(suffix) ? "_" + suffix : suffix) : suffix) + "_" + (index++);
+                textureAtlasConfigFile = folder + "/" + textureAtlasName + ".json";
+                if (File.Exists(textureAtlasConfigFile))
+                {
+                    textureAtlasFiles.Add(textureAtlasConfigFile);
+                }
+                else if (index > 1)
+                {
+                    break;
+                }
+            }
+
+            if (textureAtlasFiles.Count > 0 || rawName != null)
+            {
+                return;
+            }
+
+            GetTextureAtlasConfigs(textureAtlasFiles, filePath, "", suffix);
+            if (textureAtlasFiles.Count > 0)
+            {
+                return;
+            }
+
+            index = name.LastIndexOf("_");
+            if (index >= 0)
+            {
+                name = name.Substring(0, index);
+
+                GetTextureAtlasConfigs(textureAtlasFiles, filePath, name, suffix);
+                if (textureAtlasFiles.Count > 0)
+                {
+                    return;
+                }
+
+                GetTextureAtlasConfigs(textureAtlasFiles, filePath, name, "");
+                if (textureAtlasFiles.Count > 0)
+                {
+                    return;
+                }
+            }
+
+            if (suffix != "texture")
+            {
+                GetTextureAtlasConfigs(textureAtlasFiles, filePath, null, "texture");
+            }
+        }
+
+        public static UnityDragonBonesData CreateUnityDragonBonesData(TextAsset dragonBonesAsset, UnityDragonBonesData.TextureAtlas[] textureAtlas)
+        {
+            if (dragonBonesAsset != null)
+            {
+                bool isDirty = false;
+                string path = AssetDatabase.GetAssetPath(dragonBonesAsset);
+                path = path.Substring(0, path.Length - 5);
+                int index = path.LastIndexOf("_ske");
+                if (index > 0)
+                {
+                    path = path.Substring(0, index);
+                }
+                //
+                string dataPath = path + "_Data.asset";
+
+                var jsonObject = (Dictionary<string, object>)MiniJSON.Json.Deserialize(dragonBonesAsset.text);
+                if (dragonBonesAsset.text == "DBDT")
+                {
+                    int headerLength  = 0;
+                    jsonObject = BinaryDataParser.DeserializeBinaryJsonData(dragonBonesAsset.bytes, out headerLength);
+                }
+                else
+                {
+                    jsonObject = MiniJSON.Json.Deserialize(dragonBonesAsset.text) as Dictionary<string, object>;
+                }
+
+                var dataName = jsonObject.ContainsKey("name") ? jsonObject["name"] as string : "";
+
+                //先从缓存里面取
+                UnityDragonBonesData data = UnityFactory.factory.GetCacheUnityDragonBonesData(dataName);
+
+                //缓存中没有,从资源里面取
+                if (data == null)
+                {
+                    data = AssetDatabase.LoadAssetAtPath<UnityDragonBonesData>(dataPath);
+                }
+
+                //资源里面也没有,那么重新创建
+                if (data == null)
+                {
+                    data = UnityDragonBonesData.CreateInstance<UnityDragonBonesData>();
+                    data.dataName = dataName;
+                    AssetDatabase.CreateAsset(data, dataPath);
+                    isDirty = true;
+                }
+
+                //
+                if (string.IsNullOrEmpty(data.dataName) || !data.dataName.Equals(dataName))
+                {
+                    //走到这里,说明原先已经创建了,之后手动改了名字,既然又走了创建流程,那么名字也重置下
+                    data.dataName = dataName;
+                    isDirty = true;
+                }
+
+                if (data.dragonBonesJSON != dragonBonesAsset)
+                {
+                    data.dragonBonesJSON = dragonBonesAsset;
+                    isDirty = true;
+                }
+
+                if (textureAtlas != null && textureAtlas.Length > 0 && textureAtlas[0] != null && textureAtlas[0].texture != null)
+                {
+                    if (data.textureAtlas == null || data.textureAtlas.Length != textureAtlas.Length)
+                    {
+                        isDirty = true;
+                    }
+                    else
+                    {
+                        for (int i = 0; i < textureAtlas.Length; ++i)
+                        {
+                            if (textureAtlas[i].material != data.textureAtlas[i].material ||
+                                textureAtlas[i].uiMaterial != data.textureAtlas[i].uiMaterial ||
+                                textureAtlas[i].texture != data.textureAtlas[i].texture ||
+                                textureAtlas[i].textureAtlasJSON != data.textureAtlas[i].textureAtlasJSON
+                            )
+                            {
+                                isDirty = true;
+                                break;
+                            }
+                        }
+                    }
+                    data.textureAtlas = textureAtlas;
+                }
+
+                if (isDirty)
+                {
+                    AssetDatabase.Refresh();
+                    EditorUtility.SetDirty(data);
+                }
+
+                //
+                UnityFactory.factory.AddCacheUnityDragonBonesData(data);
+
+                AssetDatabase.SaveAssets();
+                return data;
+            }
+            return null;
+        }
+
+
+        private static List<string> _GetDragonBonesSkePaths(bool isCreateUnityData = false)
+        {
+            var dragonBonesSkePaths = new List<string>();
+            foreach (var guid in Selection.assetGUIDs)
+            {
+                var assetPath = AssetDatabase.GUIDToAssetPath(guid);
+                if (assetPath.EndsWith(".json"))
+                {
+                    var jsonCode = File.ReadAllText(assetPath);
+                    if (jsonCode.IndexOf("\"armature\":") > 0)
+                    {
+                        dragonBonesSkePaths.Add(assetPath);
+                    }
+                }
+                if (assetPath.EndsWith(".bytes"))
+                {
+                    TextAsset asset = AssetDatabase.LoadAssetAtPath<TextAsset>(assetPath);
+                    if (asset && asset.text == "DBDT")
+                    {
+                        dragonBonesSkePaths.Add(assetPath);
+                    }
+                }
+                else if (!isCreateUnityData && assetPath.EndsWith("_Data.asset"))
+                {
+                    UnityDragonBonesData data = AssetDatabase.LoadAssetAtPath<UnityDragonBonesData>(assetPath);
+
+                    dragonBonesSkePaths.Add(AssetDatabase.GetAssetPath(data.dragonBonesJSON));
+                }
+            }
+
+            return dragonBonesSkePaths;
+        }
+
+
+        private static UnityArmatureComponent _CreateEmptyObject(UnityEngine.Transform parentTransform)
+        {
+            var gameObject = new GameObject("New Armature Object", typeof(UnityArmatureComponent));
+            var armatureComponent = gameObject.GetComponent<UnityArmatureComponent>();
+            gameObject.transform.SetParent(parentTransform, false);
+
+            //
+            EditorUtility.FocusProjectWindow();
+            Selection.activeObject = gameObject;
+            EditorGUIUtility.PingObject(Selection.activeObject);
+            Undo.RegisterCreatedObjectUndo(gameObject, "Create Armature Object");
+            EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
+
+            return armatureComponent;
+        }
+
+    }
+}

+ 12 - 0
Assets/DuckHunter/DragonBones/Editor/UnityEditor.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 54113ce072e34b147937892001015ece
+timeCreated: 1476347619
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/DragonBones/Scripts.meta

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

+ 8 - 0
Assets/DuckHunter/DragonBones/Scripts/3rdParty.meta

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

+ 549 - 0
Assets/DuckHunter/DragonBones/Scripts/3rdParty/MiniJSON.cs

@@ -0,0 +1,549 @@
+/*
+ * Copyright (c) 2013 Calvin Rien
+ *
+ * Based on the JSON parser by Patrick van Bergen
+ * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html
+ *
+ * Simplified it so that it doesn't throw exceptions
+ * and can be used in Unity iPhone with maximum code stripping.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+
+namespace MiniJSON {
+    // Example usage:
+    //
+    //  using UnityEngine;
+    //  using System.Collections;
+    //  using System.Collections.Generic;
+    //  using MiniJSON;
+    //
+    //  public class MiniJSONTest : MonoBehaviour {
+    //      void Start () {
+    //          var jsonString = "{ \"array\": [1.44,2,3], " +
+    //                          "\"object\": {\"key1\":\"value1\", \"key2\":256}, " +
+    //                          "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " +
+    //                          "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " +
+    //                          "\"int\": 65536, " +
+    //                          "\"float\": 3.1415926, " +
+    //                          "\"bool\": true, " +
+    //                          "\"null\": null }";
+    //
+    //          var dict = Json.Deserialize(jsonString) as Dictionary<string,object>;
+    //
+    //          Debug.Log("deserialized: " + dict.GetType());
+    //          Debug.Log("dict['array'][0]: " + ((List<object>) dict["array"])[0]);
+    //          Debug.Log("dict['string']: " + (string) dict["string"]);
+    //          Debug.Log("dict['float']: " + (double) dict["float"]); // floats come out as doubles
+    //          Debug.Log("dict['int']: " + (long) dict["int"]); // ints come out as longs
+    //          Debug.Log("dict['unicode']: " + (string) dict["unicode"]);
+    //
+    //          var str = Json.Serialize(dict);
+    //
+    //          Debug.Log("serialized: " + str);
+    //      }
+    //  }
+
+    /// <summary>
+    /// This class encodes and decodes JSON strings.
+    /// Spec. details, see http://www.json.org/
+    ///
+    /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.
+    /// All numbers are parsed to doubles.
+    /// </summary>
+    public static class Json {
+        /// <summary>
+        /// Parses the string json into a value
+        /// </summary>
+        /// <param name="json">A JSON string.</param>
+        /// <returns>An List&lt;object&gt;, a Dictionary&lt;string, object&gt;, a double, an integer,a string, null, true, or false</returns>
+        public static object Deserialize(string json) {
+            // save the string for debug information
+            if (json == null) {
+                return null;
+            }
+
+            return Parser.Parse(json);
+        }
+
+        sealed class Parser : IDisposable {
+            const string WORD_BREAK = "{}[],:\"";
+
+            public static bool IsWordBreak(char c) {
+                return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1;
+            }
+
+            enum TOKEN {
+                NONE,
+                CURLY_OPEN,
+                CURLY_CLOSE,
+                SQUARED_OPEN,
+                SQUARED_CLOSE,
+                COLON,
+                COMMA,
+                STRING,
+                NUMBER,
+                TRUE,
+                FALSE,
+                NULL
+            };
+
+            StringReader json;
+
+            Parser(string jsonString) {
+                json = new StringReader(jsonString);
+            }
+
+            public static object Parse(string jsonString) {
+                using (var instance = new Parser(jsonString)) {
+                    return instance.ParseValue();
+                }
+            }
+
+            public void Dispose() {
+                json.Dispose();
+                json = null;
+            }
+
+            Dictionary<string, object> ParseObject() {
+                Dictionary<string, object> table = new Dictionary<string, object>();
+
+                // ditch opening brace
+                json.Read();
+
+                // {
+                while (true) {
+                    switch (NextToken) {
+                    case TOKEN.NONE:
+                        return null;
+                    case TOKEN.COMMA:
+                        continue;
+                    case TOKEN.CURLY_CLOSE:
+                        return table;
+                    default:
+                        // name
+                        string name = ParseString();
+                        if (name == null) {
+                            return null;
+                        }
+
+                        // :
+                        if (NextToken != TOKEN.COLON) {
+                            return null;
+                        }
+                        // ditch the colon
+                        json.Read();
+
+                        // value
+                        table[name] = ParseValue();
+                        break;
+                    }
+                }
+            }
+
+            List<object> ParseArray() {
+                List<object> array = new List<object>();
+
+                // ditch opening bracket
+                json.Read();
+
+                // [
+                var parsing = true;
+                while (parsing) {
+                    TOKEN nextToken = NextToken;
+
+                    switch (nextToken) {
+                    case TOKEN.NONE:
+                        return null;
+                    case TOKEN.COMMA:
+                        continue;
+                    case TOKEN.SQUARED_CLOSE:
+                        parsing = false;
+                        break;
+                    default:
+                        object value = ParseByToken(nextToken);
+
+                        array.Add(value);
+                        break;
+                    }
+                }
+
+                return array;
+            }
+
+            object ParseValue() {
+                TOKEN nextToken = NextToken;
+                return ParseByToken(nextToken);
+            }
+
+            object ParseByToken(TOKEN token) {
+                switch (token) {
+                case TOKEN.STRING:
+                    return ParseString();
+                case TOKEN.NUMBER:
+                    return ParseNumber();
+                case TOKEN.CURLY_OPEN:
+                    return ParseObject();
+                case TOKEN.SQUARED_OPEN:
+                    return ParseArray();
+                case TOKEN.TRUE:
+                    return true;
+                case TOKEN.FALSE:
+                    return false;
+                case TOKEN.NULL:
+                    return null;
+                default:
+                    return null;
+                }
+            }
+
+            string ParseString() {
+                StringBuilder s = new StringBuilder();
+                char c;
+
+                // ditch opening quote
+                json.Read();
+
+                bool parsing = true;
+                while (parsing) {
+
+                    if (json.Peek() == -1) {
+                        parsing = false;
+                        break;
+                    }
+
+                    c = NextChar;
+                    switch (c) {
+                    case '"':
+                        parsing = false;
+                        break;
+                    case '\\':
+                        if (json.Peek() == -1) {
+                            parsing = false;
+                            break;
+                        }
+
+                        c = NextChar;
+                        switch (c) {
+                        case '"':
+                        case '\\':
+                        case '/':
+                            s.Append(c);
+                            break;
+                        case 'b':
+                            s.Append('\b');
+                            break;
+                        case 'f':
+                            s.Append('\f');
+                            break;
+                        case 'n':
+                            s.Append('\n');
+                            break;
+                        case 'r':
+                            s.Append('\r');
+                            break;
+                        case 't':
+                            s.Append('\t');
+                            break;
+                        case 'u':
+                            var hex = new char[4];
+
+                            for (int i=0; i< 4; i++) {
+                                hex[i] = NextChar;
+                            }
+
+                            s.Append((char) Convert.ToInt32(new string(hex), 16));
+                            break;
+                        }
+                        break;
+                    default:
+                        s.Append(c);
+                        break;
+                    }
+                }
+
+                return s.ToString();
+            }
+
+            object ParseNumber() {
+                string number = NextWord;
+
+                if (number.IndexOf('.') == -1 && number.IndexOf('E') == -1 && number.IndexOf('e') == -1) {
+                    long parsedInt;
+                    Int64.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out parsedInt);
+                    return parsedInt;
+                }
+
+                double parsedDouble;
+                Double.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out parsedDouble);
+                return parsedDouble;
+            }
+
+            void EatWhitespace() {
+                while (Char.IsWhiteSpace(PeekChar)) {
+                    json.Read();
+
+                    if (json.Peek() == -1) {
+                        break;
+                    }
+                }
+            }
+
+            char PeekChar {
+                get {
+                    return Convert.ToChar(json.Peek());
+                }
+            }
+
+            char NextChar {
+                get {
+                    return Convert.ToChar(json.Read());
+                }
+            }
+
+            string NextWord {
+                get {
+                    StringBuilder word = new StringBuilder();
+
+                    while (!IsWordBreak(PeekChar)) {
+                        word.Append(NextChar);
+
+                        if (json.Peek() == -1) {
+                            break;
+                        }
+                    }
+
+                    return word.ToString();
+                }
+            }
+
+            TOKEN NextToken {
+                get {
+                    EatWhitespace();
+
+                    if (json.Peek() == -1) {
+                        return TOKEN.NONE;
+                    }
+
+                    switch (PeekChar) {
+                    case '{':
+                        return TOKEN.CURLY_OPEN;
+                    case '}':
+                        json.Read();
+                        return TOKEN.CURLY_CLOSE;
+                    case '[':
+                        return TOKEN.SQUARED_OPEN;
+                    case ']':
+                        json.Read();
+                        return TOKEN.SQUARED_CLOSE;
+                    case ',':
+                        json.Read();
+                        return TOKEN.COMMA;
+                    case '"':
+                        return TOKEN.STRING;
+                    case ':':
+                        return TOKEN.COLON;
+                    case '0':
+                    case '1':
+                    case '2':
+                    case '3':
+                    case '4':
+                    case '5':
+                    case '6':
+                    case '7':
+                    case '8':
+                    case '9':
+                    case '-':
+                        return TOKEN.NUMBER;
+                    }
+
+                    switch (NextWord) {
+                    case "false":
+                        return TOKEN.FALSE;
+                    case "true":
+                        return TOKEN.TRUE;
+                    case "null":
+                        return TOKEN.NULL;
+                    }
+
+                    return TOKEN.NONE;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
+        /// </summary>
+        /// <param name="json">A Dictionary&lt;string, object&gt; / List&lt;object&gt;</param>
+        /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
+        public static string Serialize(object obj) {
+            return Serializer.Serialize(obj);
+        }
+
+        sealed class Serializer {
+            StringBuilder builder;
+
+            Serializer() {
+                builder = new StringBuilder();
+            }
+
+            public static string Serialize(object obj) {
+                var instance = new Serializer();
+
+                instance.SerializeValue(obj);
+
+                return instance.builder.ToString();
+            }
+
+            void SerializeValue(object value) {
+                IList asList;
+                IDictionary asDict;
+                string asStr;
+
+                if (value == null) {
+                    builder.Append("null");
+                } else if ((asStr = value as string) != null) {
+                    SerializeString(asStr);
+                } else if (value is bool) {
+                    builder.Append((bool) value ? "true" : "false");
+                } else if ((asList = value as IList) != null) {
+                    SerializeArray(asList);
+                } else if ((asDict = value as IDictionary) != null) {
+                    SerializeObject(asDict);
+                } else if (value is char) {
+                    SerializeString(new string((char) value, 1));
+                } else {
+                    SerializeOther(value);
+                }
+            }
+
+            void SerializeObject(IDictionary obj) {
+                bool first = true;
+
+                builder.Append('{');
+
+                foreach (object e in obj.Keys) {
+                    if (!first) {
+                        builder.Append(',');
+                    }
+
+                    SerializeString(e.ToString());
+                    builder.Append(':');
+
+                    SerializeValue(obj[e]);
+
+                    first = false;
+                }
+
+                builder.Append('}');
+            }
+
+            void SerializeArray(IList anArray) {
+                builder.Append('[');
+
+                bool first = true;
+
+                for (int i=0; i<anArray.Count; i++) {
+                    object obj = anArray[i];
+                    if (!first) {
+                        builder.Append(',');
+                    }
+
+                    SerializeValue(obj);
+
+                    first = false;
+                }
+
+                builder.Append(']');
+            }
+
+            void SerializeString(string str) {
+                builder.Append('\"');
+
+                char[] charArray = str.ToCharArray();
+                for (int i=0; i<charArray.Length; i++) {
+                    char c = charArray[i];
+                    switch (c) {
+                    case '"':
+                        builder.Append("\\\"");
+                        break;
+                    case '\\':
+                        builder.Append("\\\\");
+                        break;
+                    case '\b':
+                        builder.Append("\\b");
+                        break;
+                    case '\f':
+                        builder.Append("\\f");
+                        break;
+                    case '\n':
+                        builder.Append("\\n");
+                        break;
+                    case '\r':
+                        builder.Append("\\r");
+                        break;
+                    case '\t':
+                        builder.Append("\\t");
+                        break;
+                    default:
+                        int codepoint = Convert.ToInt32(c);
+                        if ((codepoint >= 32) && (codepoint <= 126)) {
+                            builder.Append(c);
+                        } else {
+                            builder.Append("\\u");
+                            builder.Append(codepoint.ToString("x4"));
+                        }
+                        break;
+                    }
+                }
+
+                builder.Append('\"');
+            }
+
+            void SerializeOther(object value) {
+                // NOTE: decimals lose precision during serialization.
+                // They always have, I'm just letting you know.
+                // Previously floats and doubles lost precision too.
+                if (value is float) {
+                    builder.Append(((float) value).ToString("R", System.Globalization.CultureInfo.InvariantCulture));
+                } else if (value is int
+                    || value is uint
+                    || value is long
+                    || value is sbyte
+                    || value is byte
+                    || value is short
+                    || value is ushort
+                    || value is ulong) {
+                    builder.Append(value);
+                } else if (value is double
+                    || value is decimal) {
+                    builder.Append(Convert.ToDouble(value).ToString("R", System.Globalization.CultureInfo.InvariantCulture));
+                } else {
+                    SerializeString(value.ToString());
+                }
+            }
+        }
+    }
+}

+ 12 - 0
Assets/DuckHunter/DragonBones/Scripts/3rdParty/MiniJSON.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e02de845610292940894268c0db72a08
+timeCreated: 1475144513
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/DuckHunter/DragonBones/Scripts/animation.meta

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

+ 1050 - 0
Assets/DuckHunter/DragonBones/Scripts/animation/AnimationDB.cs

@@ -0,0 +1,1050 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System.Collections.Generic;
+
+namespace DragonBones
+{
+    /// <summary>
+    /// - The animation player is used to play the animation data and manage the animation states.
+    /// </summary>
+    /// <see cref="DragonBones.AnimationData"/>
+    /// <see cref="DragonBones.AnimationState"/>
+    /// <version>DragonBones 3.0</version>
+    /// <language>en_US</language>
+
+    /// <summary>
+    /// - 动画播放器用来播放动画数据和管理动画状态。
+    /// </summary>
+    /// <see cref="DragonBones.AnimationData"/>
+    /// <see cref="DragonBones.AnimationState"/>
+    /// <version>DragonBones 3.0</version>
+    /// <language>zh_CN</language>
+    public class AnimationDB : BaseObject
+    {
+        /// <summary>
+        /// - The play speed of all animations. [0: Stop, (0~1): Slow, 1: Normal, (1~N): Fast]
+        /// </summary>
+        /// <default>1.0</default>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 所有动画的播放速度。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放]
+        /// </summary>
+        /// <default>1.0</default>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public float timeScale;
+
+        private bool _lockUpdate;
+
+        // Update bones and slots cachedFrameIndices.
+        private bool _animationDirty;
+        private float _inheritTimeScale;
+        private readonly List<string> _animationNames = new List<string>();
+        private readonly List<AnimationState> _animationStates = new List<AnimationState>();
+        private readonly Dictionary<string, AnimationData> _animations = new Dictionary<string, AnimationData>();
+        private Armature _armature;
+        private AnimationConfig _animationConfig = null; // Initial value.
+        private AnimationState _lastAnimationState;
+        /// <private/>
+        protected override void _OnClear()
+        {
+            foreach (var animationState in this._animationStates)
+            {
+                animationState.ReturnToPool();
+            }
+
+            if (this._animationConfig != null)
+            {
+                this._animationConfig.ReturnToPool();
+            }
+
+            this.timeScale = 1.0f;
+
+            this._lockUpdate = false;
+
+            this._animationDirty = false;
+            this._inheritTimeScale = 1.0f;
+            this._animationNames.Clear();
+            this._animationStates.Clear();
+            this._animations.Clear();
+            this._armature = null; //
+            this._animationConfig = null; //
+            this._lastAnimationState = null;
+        }
+
+        private void _FadeOut(AnimationConfig animationConfig)
+        {
+            switch (animationConfig.fadeOutMode)
+            {
+                case AnimationFadeOutMode.SameLayer:
+                    foreach (var animationState in this._animationStates)
+                    {
+                        if (animationState._parent != null)
+                        {
+                            continue;
+                        }
+
+                        if (animationState.layer == animationConfig.layer)
+                        {
+                            animationState.FadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
+                        }
+                    }
+                    break;
+                case AnimationFadeOutMode.SameGroup:
+                    foreach (var animationState in this._animationStates)
+                    {
+                        if (animationState._parent != null)
+                        {
+                            continue;
+                        }
+
+                        if (animationState.group == animationConfig.group)
+                        {
+                            animationState.FadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
+                        }
+                    }
+                    break;
+                case AnimationFadeOutMode.SameLayerAndGroup:
+                    foreach (var animationState in this._animationStates)
+                    {
+                        if (animationState._parent != null)
+                        {
+                            continue;
+                        }
+
+                        if (animationState.layer == animationConfig.layer &&
+                            animationState.group == animationConfig.group)
+                        {
+                            animationState.FadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
+                        }
+                    }
+                    break;
+                case AnimationFadeOutMode.All:
+                    foreach (var animationState in this._animationStates)
+                    {
+                        if (animationState._parent != null)
+                        {
+                            continue;
+                        }
+
+                        animationState.FadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
+                    }
+                    break;
+                case AnimationFadeOutMode.None:
+                case AnimationFadeOutMode.Single:
+                default:
+                    break;
+            }
+        }
+        /// <internal/>
+        /// <private/>
+        internal void Init(Armature armature)
+        {
+            if (this._armature != null)
+            {
+                return;
+            }
+
+            this._armature = armature;
+            this._animationConfig = BaseObject.BorrowObject<AnimationConfig>();
+        }
+        /// <internal/>
+        /// <private/>
+        internal void AdvanceTime(float passedTime)
+        {
+            if (passedTime < 0.0f)
+            {
+                // Only animationState can reverse play.
+                passedTime = -passedTime;
+            }
+
+            if (this._armature.inheritAnimation && this._armature._parent != null)
+            {
+                // Inherit parent animation timeScale.
+                this._inheritTimeScale = this._armature._parent._armature.animation._inheritTimeScale * this.timeScale;
+            }
+            else
+            {
+                this._inheritTimeScale = this.timeScale;
+            }
+
+            if (this._inheritTimeScale != 1.0f)
+            {
+                passedTime *= this._inheritTimeScale;
+            }
+
+            var animationStateCount = this._animationStates.Count;
+            if (animationStateCount == 1)
+            {
+                var animationState = this._animationStates[0];
+                if (animationState._fadeState > 0 && animationState._subFadeState > 0)
+                {
+                    this._armature._dragonBones.BufferObject(animationState);
+                    this._animationStates.Clear();
+                    this._lastAnimationState = null;
+                }
+                else
+                {
+                    var animationData = animationState._animationData;
+                    var cacheFrameRate = animationData.cacheFrameRate;
+
+                    if (this._animationDirty && cacheFrameRate > 0.0f)
+                    {
+                        // Update cachedFrameIndices.
+                        this._animationDirty = false;
+                        foreach (var bone in this._armature.GetBones())
+                        {
+                            bone._cachedFrameIndices = animationData.GetBoneCachedFrameIndices(bone.name);
+                        }
+
+                        foreach (var slot in this._armature.GetSlots())
+                        {
+                            var rawDisplayDatas = slot.rawDisplayDatas;
+                            if (rawDisplayDatas != null && rawDisplayDatas.Count > 0)
+                            {
+                                var rawDsplayData = rawDisplayDatas[0];
+                                if (rawDsplayData != null)
+                                {
+                                    if (rawDsplayData.parent == this._armature.armatureData.defaultSkin)
+                                    {
+                                        slot._cachedFrameIndices = animationData.GetSlotCachedFrameIndices(slot.name);
+                                        continue;
+                                    }
+                                }
+                            }
+
+                            slot._cachedFrameIndices = null;
+                        }
+                    }
+
+                    animationState.AdvanceTime(passedTime, cacheFrameRate);
+                }
+            }
+            else if (animationStateCount > 1)
+            {
+                for (int i = 0, r = 0; i < animationStateCount; ++i)
+                {
+                    var animationState = this._animationStates[i];
+                    if (animationState._fadeState > 0 && animationState._subFadeState > 0)
+                    {
+                        r++;
+                        this._armature._dragonBones.BufferObject(animationState);
+                        this._animationDirty = true;
+                        if (this._lastAnimationState == animationState)
+                        {
+                            // Update last animation state.
+                            this._lastAnimationState = null;
+                        }
+                    }
+                    else
+                    {
+                        if (r > 0)
+                        {
+                            this._animationStates[i - r] = animationState;
+                        }
+
+                        animationState.AdvanceTime(passedTime, 0.0f);
+                    }
+
+                    if (i == animationStateCount - 1 && r > 0)
+                    {
+                        // Modify animation states size.
+                        this._animationStates.ResizeList(this._animationStates.Count - r);
+                        if (this._lastAnimationState == null && this._animationStates.Count > 0)
+                        {
+                            this._lastAnimationState = this._animationStates[this._animationStates.Count - 1];
+                        }
+                    }
+                }
+
+                this._armature._cacheFrameIndex = -1;
+            }
+            else
+            {
+                this._armature._cacheFrameIndex = -1;
+            }
+        }
+        /// <summary>
+        /// - Clear all animations states.
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 清除所有的动画状态。
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public void Reset()
+        {
+            foreach (var animationState in this._animationStates)
+            {
+                animationState.ReturnToPool();
+            }
+
+            this._animationDirty = false;
+            this._animationConfig.Clear();
+            this._animationStates.Clear();
+            this._lastAnimationState = null;
+        }
+        /// <summary>
+        /// - Pause a specific animation state.
+        /// </summary>
+        /// <param name="animationName">- The name of animation state. (If not set, it will pause all animations)</param>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 暂停指定动画状态的播放。
+        /// </summary>
+        /// <param name="animationName">- 动画状态名称。 (如果未设置,则暂停所有动画)</param>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public void Stop(string animationName = null)
+        {
+            if (animationName != null)
+            {
+                var animationState = this.GetState(animationName);
+                if (animationState != null)
+                {
+                    animationState.Stop();
+                }
+            }
+            else
+            {
+                foreach (var animationState in this._animationStates)
+                {
+                    animationState.Stop();
+                }
+            }
+        }
+        /// <summary>
+        /// - Play animation with a specific animation config.
+        /// The API is still in the experimental phase and may encounter bugs or stability or compatibility issues when used.
+        /// </summary>
+        /// <param name="animationConfig">- The animation config.</param>
+        /// <returns>The playing animation state.</returns>
+        /// <see cref="DragonBones.AnimationConfig"/>
+        /// <beta/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 通过指定的动画配置来播放动画。
+        /// 该 API 仍在实验阶段,使用时可能遭遇 bug 或稳定性或兼容性问题。
+        /// </summary>
+        /// <param name="animationConfig">- 动画配置。</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <see cref="DragonBones.AnimationConfig"/>
+        /// <beta/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public AnimationState PlayConfig(AnimationConfig animationConfig)
+        {
+            var animationName = animationConfig.animation;
+            if (!(this._animations.ContainsKey(animationName)))
+            {
+                Helper.Assert(false,
+                    "Non-existent animation.\n" +
+                    "DragonBones name: " + this._armature.armatureData.parent.name +
+                    "Armature name: " + this._armature.name +
+                    "Animation name: " + animationName
+                );
+
+                return null;
+            }
+
+            var animationData = this._animations[animationName];
+
+            if (animationConfig.fadeOutMode == AnimationFadeOutMode.Single)
+            {
+                foreach (var aniState in this._animationStates)
+                {
+                    if (aniState._animationData == animationData)
+                    {
+                        return aniState;
+                    }
+                }
+            }
+
+            if (this._animationStates.Count == 0)
+            {
+                animationConfig.fadeInTime = 0.0f;
+            }
+            else if (animationConfig.fadeInTime < 0.0f)
+            {
+                animationConfig.fadeInTime = animationData.fadeInTime;
+            }
+
+            if (animationConfig.fadeOutTime < 0.0f)
+            {
+                animationConfig.fadeOutTime = animationConfig.fadeInTime;
+            }
+
+            if (animationConfig.timeScale <= -100.0f)
+            {
+                animationConfig.timeScale = 1.0f / animationData.scale;
+            }
+
+            if (animationData.frameCount > 1)
+            {
+                if (animationConfig.position < 0.0f)
+                {
+                    animationConfig.position %= animationData.duration;
+                    animationConfig.position = animationData.duration - animationConfig.position;
+                }
+                else if (animationConfig.position == animationData.duration)
+                {
+                    animationConfig.position -= 0.000001f; // Play a little time before end.
+                }
+                else if (animationConfig.position > animationData.duration)
+                {
+                    animationConfig.position %= animationData.duration;
+                }
+
+                if (animationConfig.duration > 0.0f && animationConfig.position + animationConfig.duration > animationData.duration)
+                {
+                    animationConfig.duration = animationData.duration - animationConfig.position;
+                }
+
+                if (animationConfig.playTimes < 0)
+                {
+                    animationConfig.playTimes = (int)animationData.playTimes;
+                }
+            }
+            else
+            {
+                animationConfig.playTimes = 1;
+                animationConfig.position = 0.0f;
+                if (animationConfig.duration > 0.0)
+                {
+                    animationConfig.duration = 0.0f;
+                }
+            }
+
+            if (animationConfig.duration == 0.0f)
+            {
+                animationConfig.duration = -1.0f;
+            }
+
+            this._FadeOut(animationConfig);
+
+            var animationState = BaseObject.BorrowObject<AnimationState>();
+            animationState.Init(this._armature, animationData, animationConfig);
+            this._animationDirty = true;
+            this._armature._cacheFrameIndex = -1;
+
+            if (this._animationStates.Count > 0)
+            {
+                var added = false;
+                for (int i = 0, l = this._animationStates.Count; i < l; ++i)
+                {
+                    if (animationState.layer > this._animationStates[i].layer)
+                    {
+                        added = true;
+                        this._animationStates.Insert(i, animationState);
+                        break;
+                    }
+                    else if (i != l - 1 && animationState.layer > this._animationStates[i + 1].layer)
+                    {
+                        added = true;
+                        this._animationStates.Insert(i + 1, animationState);
+                        break;
+                    }
+                }
+
+                if (!added)
+                {
+                    this._animationStates.Add(animationState);
+                }
+            }
+            else
+            {
+                this._animationStates.Add(animationState);
+            }
+
+            // Child armature play same name animation.
+            foreach (var slot in this._armature.GetSlots())
+            {
+                var childArmature = slot.childArmature;
+                if (childArmature != null &&
+                    childArmature.inheritAnimation &&
+                    childArmature.animation.HasAnimation(animationName) &&
+                    childArmature.animation.GetState(animationName) == null)
+                {
+                    childArmature.animation.FadeIn(animationName); //
+                }
+            }
+
+            if (!this._lockUpdate)
+            {
+                if (animationConfig.fadeInTime <= 0.0f)
+                {
+                    // Blend animation state, update armature.
+                    this._armature.AdvanceTime(0.0f);
+                }
+            }
+
+            this._lastAnimationState = animationState;
+
+            return animationState;
+        }
+        /// <summary>
+        /// - Play a specific animation.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data. (If not set, The default animation will be played, or resume the animation playing from pause status, or replay the last playing animation)</param>
+        /// <param name="playTimes">- Playing repeat times. [-1: Use default value of the animation data, 0: No end loop playing, [1~N]: Repeat N times] (default: -1)</param>
+        /// <returns>The playing animation state.</returns>
+        /// <example>
+        /// TypeScript style, for reference only.
+        /// <pre>
+        ///     armature.animation.play("walk");
+        /// </pre>
+        /// </example>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 播放指定动画。
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。 (如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放之前播放的动画)</param>
+        /// <param name="playTimes">- 循环播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <example>
+        /// TypeScript 风格,仅供参考。
+        /// <pre>
+        ///     armature.animation.play("walk");
+        /// </pre>
+        /// </example>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public AnimationState Play(string animationName = null, int playTimes = -1)
+        {
+            this._animationConfig.Clear();
+            this._animationConfig.resetToPose = true;
+            this._animationConfig.playTimes = playTimes;
+            this._animationConfig.fadeInTime = 0.0f;
+            this._animationConfig.animation = animationName != null ? animationName : "";
+
+            if (animationName != null && animationName.Length > 0)
+            {
+                this.PlayConfig(this._animationConfig);
+            }
+            else if (this._lastAnimationState == null)
+            {
+                var defaultAnimation = this._armature.armatureData.defaultAnimation;
+                if (defaultAnimation != null)
+                {
+                    this._animationConfig.animation = defaultAnimation.name;
+                    this.PlayConfig(this._animationConfig);
+                }
+            }
+            else if (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted)
+            {
+                this._lastAnimationState.Play();
+            }
+            else
+            {
+                this._animationConfig.animation = this._lastAnimationState.name;
+                this.PlayConfig(this._animationConfig);
+            }
+
+            return this._lastAnimationState;
+        }
+        /// <summary>
+        /// - Fade in a specific animation.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <param name="fadeInTime">- The fade in time. [-1: Use the default value of animation data, [0~N]: The fade in time (In seconds)] (Default: -1)</param>
+        /// <param name="playTimes">- playing repeat times. [-1: Use the default value of animation data, 0: No end loop playing, [1~N]: Repeat N times] (Default: -1)</param>
+        /// <param name="layer">- The blending layer, the animation states in high level layer will get the blending weights with high priority, when the total blending weights are more than 1.0, there will be no more weights can be allocated to the other animation states. (Default: 0)</param>
+        /// <param name="group">- The blending group name, it is typically used to specify the substitution of multiple animation states blending. (Default: null)</param>
+        /// <param name="fadeOutMode">- The fade out mode, which is typically used to specify alternate mode of multiple animation states blending. (Default: AnimationFadeOutMode.SameLayerAndGroup)</param>
+        /// <returns>The playing animation state.</returns>
+        /// <example>
+        /// TypeScript style, for reference only.
+        /// <pre>
+        ///     armature.animation.fadeIn("walk", 0.3, 0, 0, "normalGroup").resetToPose = false;
+        ///     armature.animation.fadeIn("attack", 0.3, 1, 0, "attackGroup").resetToPose = false;
+        /// </pre>
+        /// </example>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 淡入播放指定的动画。
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <param name="fadeInTime">- 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间 (以秒为单位)] (默认: -1)</param>
+        /// <param name="playTimes">- 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)</param>
+        /// <param name="layer">- 混合图层,图层高的动画状态会优先获取混合权重,当混合权重分配总和超过 1.0 时,剩余的动画状态将不能再获得权重分配。 (默认: 0)</param>
+        /// <param name="group">- 混合组名称,该属性通常用来指定多个动画状态混合时的相互替换关系。 (默认: null)</param>
+        /// <param name="fadeOutMode">- 淡出模式,该属性通常用来指定多个动画状态混合时的相互替换模式。 (默认: AnimationFadeOutMode.SameLayerAndGroup)</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <example>
+        /// TypeScript 风格,仅供参考。
+        /// <pre>
+        ///     armature.animation.fadeIn("walk", 0.3, 0, 0, "normalGroup").resetToPose = false;
+        ///     armature.animation.fadeIn("attack", 0.3, 1, 0, "attackGroup").resetToPose = false;
+        /// </pre>
+        /// </example>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public AnimationState FadeIn(string animationName, float fadeInTime = -1.0f, int playTimes = -1,
+                                    int layer = 0, string group = null,
+                                    AnimationFadeOutMode fadeOutMode = AnimationFadeOutMode.SameLayerAndGroup)
+        {
+            this._animationConfig.Clear();
+            this._animationConfig.fadeOutMode = fadeOutMode;
+            this._animationConfig.playTimes = playTimes;
+            this._animationConfig.layer = layer;
+            this._animationConfig.fadeInTime = fadeInTime;
+            this._animationConfig.animation = animationName;
+            this._animationConfig.group = group != null ? group : "";
+
+            return this.PlayConfig(this._animationConfig);
+        }
+        /// <summary>
+        /// - Play a specific animation from the specific time.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <param name="time">- The start time point of playing. (In seconds)</param>
+        /// <param name="playTimes">- Playing repeat times. [-1: Use the default value of animation data, 0: No end loop playing, [1~N]: Repeat N times] (Default: -1)</param>
+        /// <returns>The played animation state.</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 从指定时间开始播放指定的动画。
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <param name="time">- 播放开始的时间。 (以秒为单位)</param>
+        /// <param name="playTimes">- 循环播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public AnimationState GotoAndPlayByTime(string animationName, float time = 0.0f, int playTimes = -1)
+        {
+            this._animationConfig.Clear();
+            this._animationConfig.resetToPose = true;
+            this._animationConfig.playTimes = playTimes;
+            this._animationConfig.position = time;
+            this._animationConfig.fadeInTime = 0.0f;
+            this._animationConfig.animation = animationName;
+
+            return this.PlayConfig(this._animationConfig);
+        }
+        /// <summary>
+        /// - Play a specific animation from the specific frame.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <param name="frame">- The start frame of playing.</param>
+        /// <param name="playTimes">- Playing repeat times. [-1: Use the default value of animation data, 0: No end loop playing, [1~N]: Repeat N times] (Default: -1)</param>
+        /// <returns>The played animation state.</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 从指定帧开始播放指定的动画。
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <param name="frame">- 播放开始的帧数。</param>
+        /// <param name="playTimes">- 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public AnimationState GotoAndPlayByFrame(string animationName, uint frame = 0, int playTimes = -1)
+        {
+            this._animationConfig.Clear();
+            this._animationConfig.resetToPose = true;
+            this._animationConfig.playTimes = playTimes;
+            this._animationConfig.fadeInTime = 0.0f;
+            this._animationConfig.animation = animationName;
+
+            var animationData = this._animations.ContainsKey(animationName) ? this._animations[animationName] : null;
+            if (animationData != null)
+            {
+                this._animationConfig.position = animationData.duration * frame / animationData.frameCount;
+            }
+
+            return this.PlayConfig(this._animationConfig);
+        }
+        /// <summary>
+        /// - Play a specific animation from the specific progress.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <param name="progress">- The start progress value of playing.</param>
+        /// <param name="playTimes">- Playing repeat times. [-1: Use the default value of animation data, 0: No end loop playing, [1~N]: Repeat N times] (Default: -1)</param>
+        /// <returns>The played animation state.</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 从指定进度开始播放指定的动画。
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <param name="progress">- 开始播放的进度。</param>
+        /// <param name="playTimes">- 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public AnimationState GotoAndPlayByProgress(string animationName, float progress = 0.0f, int playTimes = -1)
+        {
+            this._animationConfig.Clear();
+            this._animationConfig.resetToPose = true;
+            this._animationConfig.playTimes = playTimes;
+            this._animationConfig.fadeInTime = 0.0f;
+            this._animationConfig.animation = animationName;
+
+            var animationData = this._animations.ContainsKey(animationName) ? this._animations[animationName] : null;
+            if (animationData != null)
+            {
+                this._animationConfig.position = animationData.duration * (progress > 0.0f ? progress : 0.0f);
+            }
+
+            return this.PlayConfig(this._animationConfig);
+        }
+        /// <summary>
+        /// - Stop a specific animation at the specific time.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <param name="time">- The stop time. (In seconds)</param>
+        /// <returns>The played animation state.</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 在指定时间停止指定动画播放
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <param name="time">- 停止的时间。 (以秒为单位)</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public AnimationState GotoAndStopByTime(string animationName, float time = 0.0f)
+        {
+            var animationState = this.GotoAndPlayByTime(animationName, time, 1);
+            if (animationState != null)
+            {
+                animationState.Stop();
+            }
+
+            return animationState;
+        }
+        /// <summary>
+        /// - Stop a specific animation at the specific frame.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <param name="frame">- The stop frame.</param>
+        /// <returns>The played animation state.</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 在指定帧停止指定动画的播放
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <param name="frame">- 停止的帧数。</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public AnimationState GotoAndStopByFrame(string animationName, uint frame = 0)
+        {
+            var animationState = this.GotoAndPlayByFrame(animationName, frame, 1);
+            if (animationState != null)
+            {
+                animationState.Stop();
+            }
+
+            return animationState;
+        }
+        /// <summary>
+        /// - Stop a specific animation at the specific progress.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <param name="progress">- The stop progress value.</param>
+        /// <returns>The played animation state.</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 在指定的进度停止指定的动画播放。
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <param name="progress">- 停止进度。</param>
+        /// <returns>播放的动画状态。</returns>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public AnimationState GotoAndStopByProgress(string animationName, float progress = 0.0f)
+        {
+            var animationState = this.GotoAndPlayByProgress(animationName, progress, 1);
+            if (animationState != null)
+            {
+                animationState.Stop();
+            }
+
+            return animationState;
+        }
+        /// <summary>
+        /// - Get a specific animation state.
+        /// </summary>
+        /// <param name="animationName">- The name of animation state.</param>
+        /// <example>
+        /// TypeScript style, for reference only.
+        /// <pre>
+        ///     armature.animation.play("walk");
+        ///     let walkState = armature.animation.getState("walk");
+        ///     walkState.timeScale = 0.5;
+        /// </pre>
+        /// </example>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 获取指定的动画状态
+        /// </summary>
+        /// <param name="animationName">- 动画状态名称。</param>
+        /// <example>
+        /// TypeScript 风格,仅供参考。
+        /// <pre>
+        ///     armature.animation.play("walk");
+        ///     let walkState = armature.animation.getState("walk");
+        ///     walkState.timeScale = 0.5;
+        /// </pre>
+        /// </example>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public AnimationState GetState(string animationName)
+        {
+            var i = this._animationStates.Count;
+            while (i-- > 0)
+            {
+                var animationState = this._animationStates[i];
+                if (animationState.name == animationName)
+                {
+                    return animationState;
+                }
+            }
+
+            return null;
+        }
+        /// <summary>
+        /// - Check whether a specific animation data is included.
+        /// </summary>
+        /// <param name="animationName">- The name of animation data.</param>
+        /// <see cref="DragonBones.AnimationData"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 检查是否包含指定的动画数据
+        /// </summary>
+        /// <param name="animationName">- 动画数据名称。</param>
+        /// <see cref="DragonBones.AnimationData"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public bool HasAnimation(string animationName)
+        {
+            return this._animations.ContainsKey(animationName);
+        }
+        /// <summary>
+        /// - Get all the animation states.
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 获取所有的动画状态
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>zh_CN</language>
+        public List<AnimationState> GetStates()
+        {
+            return this._animationStates;
+        }
+        /// <summary>
+        /// - Check whether there is an animation state is playing
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 检查是否有动画状态正在播放
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public bool isPlaying
+        {
+            get
+            {
+                foreach (var animationState in this._animationStates)
+                {
+                    if (animationState.isPlaying)
+                    {
+                        return true;
+                    }
+                }
+
+                return false;
+            }
+        }
+        /// <summary>
+        /// - Check whether all the animation states' playing were finished.
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 检查是否所有的动画状态均已播放完毕。
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public bool isCompleted
+        {
+            get
+            {
+                foreach (var animationState in this._animationStates)
+                {
+                    if (!animationState.isCompleted)
+                    {
+                        return false;
+                    }
+                }
+
+                return this._animationStates.Count > 0;
+            }
+        }
+        /// <summary>
+        /// - The name of the last playing animation state.
+        /// </summary>
+        /// <see cref="lastAnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 上一个播放的动画状态名称
+        /// </summary>
+        /// <see cref="lastAnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public string lastAnimationName
+        {
+            get { return this._lastAnimationState != null ? this._lastAnimationState.name : ""; }
+        }
+        /// <summary>
+        /// - The name of all animation data
+        /// </summary>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 所有动画数据的名称
+        /// </summary>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public List<string> animationNames
+        {
+            get { return this._animationNames; }
+        }
+        /// <summary>
+        /// - All animation data.
+        /// </summary>
+        /// <version>DragonBones 4.5</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 所有的动画数据。
+        /// </summary>
+        /// <version>DragonBones 4.5</version>
+        /// <language>zh_CN</language>
+        public Dictionary<string, AnimationData> animations
+        {
+            get { return this._animations; }
+            set
+            {
+                if (this._animations == value)
+                {
+                    return;
+                }
+
+                this._animationNames.Clear();
+
+                this._animations.Clear();
+
+                foreach (var k in value)
+                {
+                    this._animationNames.Add(k.Key);
+                    this._animations[k.Key] = value[k.Key];
+                }
+            }
+        }
+        /// <summary>
+        /// - An AnimationConfig instance that can be used quickly.
+        /// </summary>
+        /// <see cref="DragonBones.AnimationConfig"/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 一个可以快速使用的动画配置实例。
+        /// </summary>
+        /// <see cref="DragonBones.AnimationConfig"/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public AnimationConfig animationConfig
+        {
+            get
+            {
+                this._animationConfig.Clear();
+                return this._animationConfig;
+            }
+        }
+        /// <summary>
+        /// - The last playing animation state
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 上一个播放的动画状态
+        /// </summary>
+        /// <see cref="DragonBones.AnimationState"/>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public AnimationState lastAnimationState
+        {
+            get { return this._lastAnimationState; }
+        }
+    }
+}

+ 11 - 0
Assets/DuckHunter/DragonBones/Scripts/animation/AnimationDB.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ec5e1bf6a36a4c947a90d072cd910d8e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1500 - 0
Assets/DuckHunter/DragonBones/Scripts/animation/AnimationState.cs

@@ -0,0 +1,1500 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System;
+using System.Collections.Generic;
+
+namespace DragonBones
+{
+    /// <summary>
+    /// - The animation state is generated when the animation data is played.
+    /// </summary>
+    /// <see cref="DragonBones.Animation"/>
+    /// <see cref="DragonBones.AnimationData"/>
+    /// <version>DragonBones 3.0</version>
+    /// <language>en_US</language>
+
+    /// <summary>
+    /// - 动画状态由播放动画数据时产生。
+    /// </summary>
+    /// <see cref="DragonBones.Animation"/>
+    /// <see cref="DragonBones.AnimationData"/>
+    /// <version>DragonBones 3.0</version>
+    /// <language>zh_CN</language>
+    public class AnimationState : BaseObject
+    {
+        /// <private/>
+        public bool actionEnabled;
+        /// <private/>
+        public bool additiveBlending;
+        /// <summary>
+        /// - Whether the animation state has control over the display object properties of the slots.
+        /// Sometimes blend a animation state does not want it to control the display object properties of the slots,
+        /// especially if other animation state are controlling the display object properties of the slots.
+        /// </summary>
+        /// <default>true</default>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 动画状态是否对插槽的显示对象属性有控制权。
+        /// 有时混合一个动画状态并不希望其控制插槽的显示对象属性,
+        /// 尤其是其他动画状态正在控制这些插槽的显示对象属性时。
+        /// </summary>
+        /// <default>true</default>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public bool displayControl;
+        /// <summary>
+        /// - Whether to reset the objects without animation to the armature pose when the animation state is start to play.
+        /// This property should usually be set to false when blend multiple animation states.
+        /// </summary>
+        /// <default>true</default>
+        /// <version>DragonBones 5.1</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 开始播放动画状态时是否将没有动画的对象重置为骨架初始值。
+        /// 通常在混合多个动画状态时应该将该属性设置为 false。
+        /// </summary>
+        /// <default>true</default>
+        /// <version>DragonBones 5.1</version>
+        /// <language>zh_CN</language>
+        public bool resetToPose;
+        /// <summary>
+        /// - The play times. [0: Loop play, [1~N]: Play N times]
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次]
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public int playTimes;
+        /// <summary>
+        /// - The blend layer.
+        /// High layer animation state will get the blend weight first.
+        /// When the blend weight is assigned more than 1, the remaining animation states will no longer get the weight assigned.
+        /// </summary>
+        /// <readonly/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 混合图层。
+        /// 图层高的动画状态会优先获取混合权重。
+        /// 当混合权重分配超过 1 时,剩余的动画状态将不再获得权重分配。
+        /// </summary>
+        /// <readonly/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public int layer;
+        /// <summary>
+        /// - The play speed.
+        /// The value is an overlay relationship with {@link dragonBones.Animation#timeScale}.
+        /// [(-N~0): Reverse play, 0: Stop play, (0~1): Slow play, 1: Normal play, (1~N): Fast play]
+        /// </summary>
+        /// <default>1.0</default>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 播放速度。
+        /// 该值与 {@link dragonBones.Animation#timeScale} 是叠加关系。
+        /// [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放]
+        /// </summary>
+        /// <default>1.0</default>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public float timeScale;
+        /// <summary>
+        /// - The blend weight.
+        /// </summary>
+        /// <default>1.0</default>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 混合权重。
+        /// </summary>
+        /// <default>1.0</default>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public float weight;
+        /// <summary>
+        /// - The auto fade out time when the animation state play completed.
+        /// [-1: Do not fade out automatically, [0~N]: The fade out time] (In seconds)
+        /// </summary>
+        /// <default>-1.0</default>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 动画状态播放完成后的自动淡出时间。
+        /// [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位)
+        /// </summary>
+        /// <default>-1.0</default>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public float autoFadeOutTime;
+        /// <private/>
+        public float fadeTotalTime;
+        /// <summary>
+        /// - The name of the animation state. (Can be different from the name of the animation data)
+        /// </summary>
+        /// <readonly/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 动画状态名称。 (可以不同于动画数据)
+        /// </summary>
+        /// <readonly/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public string name;
+        /// <summary>
+        /// - The blend group name of the animation state.
+        /// This property is typically used to specify the substitution of multiple animation states blend.
+        /// </summary>
+        /// <readonly/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 混合组名称。
+        /// 该属性通常用来指定多个动画状态混合时的相互替换关系。
+        /// </summary>
+        /// <readonly/>
+        /// <version>DragonBones 5.0</version>
+        /// <language>zh_CN</language>
+        public string group;
+
+        private int _timelineDirty;
+        /// <summary>
+        /// - xx: Play Enabled, Fade Play Enabled
+        /// </summary>
+        /// <internal/>
+        /// <private/>
+        internal int _playheadState;
+        /// <summary>
+        /// -1: Fade in, 0: Fade complete, 1: Fade out;
+        /// </summary>
+        /// <internal/>
+        /// <private/>
+        internal int _fadeState;
+        /// <summary>
+        /// -1: Fade start, 0: Fading, 1: Fade complete;
+        /// </summary>
+        /// <internal/>
+        /// <private/>
+        internal int _subFadeState;
+        /// <internal/>
+        /// <private/>
+        internal float _position;
+        /// <internal/>
+        /// <private/>
+        internal float _duration;
+        private float _fadeTime;
+        private float _time;
+        /// <internal/>
+        /// <private/>
+        internal float _fadeProgress;
+        /// <internal/>
+        /// <private/>
+        private float _weightResult;
+        /// <internal/>
+        /// <private/>
+        internal readonly BlendState _blendState = new BlendState();
+        private readonly List<string> _boneMask = new List<string>();
+        private readonly List<BoneTimelineState> _boneTimelines = new List<BoneTimelineState>();
+        private readonly List<SlotTimelineState> _slotTimelines = new List<SlotTimelineState>();
+        private readonly List<ConstraintTimelineState> _constraintTimelines = new List<ConstraintTimelineState>();
+        private readonly List<TimelineState> _poseTimelines = new List<TimelineState>();
+        private readonly Dictionary<string, BonePose> _bonePoses = new Dictionary<string, BonePose>();
+        /// <internal/>
+        /// <private/>
+        public AnimationData _animationData;
+        private Armature _armature;
+        /// <internal/>
+        /// <private/>
+        internal ActionTimelineState _actionTimeline = null; // Initial value.
+        private ZOrderTimelineState _zOrderTimeline = null; // Initial value.
+        /// <internal/>
+        /// <private/>
+        public AnimationState _parent = null; // Initial value.
+        /// <private/>
+        protected override void _OnClear()
+        {
+            foreach (var timeline in this._boneTimelines)
+            {
+                timeline.ReturnToPool();
+            }
+
+            foreach (var timeline in this._slotTimelines)
+            {
+                timeline.ReturnToPool();
+            }
+
+            foreach (var timeline in this._constraintTimelines)
+            {
+                timeline.ReturnToPool();
+            }
+
+            foreach(var timeline in this._poseTimelines)
+            {
+                timeline.ReturnToPool();
+            }
+
+            foreach (var bonePose in this._bonePoses.Values)
+            {
+                bonePose.ReturnToPool();
+            }
+
+            if (this._actionTimeline != null)
+            {
+                this._actionTimeline.ReturnToPool();
+            }
+
+            if (this._zOrderTimeline != null)
+            {
+                this._zOrderTimeline.ReturnToPool();
+            }
+
+            this.actionEnabled = false;
+            this.additiveBlending = false;
+            this.displayControl = false;
+            this.resetToPose = false;
+            this.playTimes = 1;
+            this.layer = 0;
+
+            this.timeScale = 1.0f;
+            this.weight = 1.0f;
+            this.autoFadeOutTime = 0.0f;
+            this.fadeTotalTime = 0.0f;
+            this.name = string.Empty;
+            this.group = string.Empty;
+
+            this._timelineDirty = 2;
+            this._playheadState = 0;
+            this._fadeState = -1;
+            this._subFadeState = -1;
+            this._position = 0.0f;
+            this._duration = 0.0f;
+            this._fadeTime = 0.0f;
+            this._time = 0.0f;
+            this._fadeProgress = 0.0f;
+            this._weightResult = 0.0f;
+            this._blendState.Clear();
+            this._boneMask.Clear();
+            this._boneTimelines.Clear();
+            this._slotTimelines.Clear();
+            this._constraintTimelines.Clear();
+            this._poseTimelines.Clear();
+            this._bonePoses.Clear();
+            this._animationData = null; //
+            this._armature = null; //
+            this._actionTimeline = null; //
+            this._zOrderTimeline = null;
+            this._parent = null;
+        }
+
+        private void _UpdateTimelines()
+        {
+            { // Update constraint timelines.
+                foreach (var constraint in this._armature._constraints)
+                {
+                    var timelineDatas = this._animationData.GetConstraintTimelines(constraint.name);
+
+                    if (timelineDatas != null)
+                    {
+                        foreach (var timelineData in timelineDatas)
+                        {
+                            switch (timelineData.type)
+                            {
+                                case TimelineType.IKConstraint:
+                                    {
+                                        var timeline = BaseObject.BorrowObject<IKConstraintTimelineState>();
+                                        timeline.constraint = constraint;
+                                        timeline.Init(this._armature, this, timelineData);
+                                        this._constraintTimelines.Add(timeline);
+                                        break;
+                                    }
+
+                                default:
+                                    break;
+                            }
+                        }
+                    }
+                    else if (this.resetToPose)
+                    { // Pose timeline.
+                        var timeline = BaseObject.BorrowObject<IKConstraintTimelineState>();
+                        timeline.constraint = constraint;
+                        timeline.Init(this._armature, this, null);
+                        this._constraintTimelines.Add(timeline);
+                        this._poseTimelines.Add(timeline);
+                    }
+                }
+            }
+        }
+
+        private void _UpdateBoneAndSlotTimelines()
+        {
+            { // Update bone timelines.
+                Dictionary<string, List<BoneTimelineState>> boneTimelines = new Dictionary<string, List<BoneTimelineState>>();
+
+                foreach (var timeline in this._boneTimelines)
+                {
+                    // Create bone timelines map.
+                    var timelineName = timeline.bone.name;
+                    if (!(boneTimelines.ContainsKey(timelineName)))
+                    {
+                        boneTimelines[timelineName] = new List<BoneTimelineState>();
+                    }
+
+                    boneTimelines[timelineName].Add(timeline);
+                }
+
+                foreach (var bone in this._armature.GetBones())
+                {
+                    var timelineName = bone.name;
+                    if (!this.ContainsBoneMask(timelineName))
+                    {
+                        continue;
+                    }
+
+                    var timelineDatas = this._animationData.GetBoneTimelines(timelineName);
+                    if (boneTimelines.ContainsKey(timelineName))
+                    {
+                        // Remove bone timeline from map.
+                        boneTimelines.Remove(timelineName);
+                    }
+                    else
+                    {
+                        // Create new bone timeline.
+                        var bonePose = this._bonePoses.ContainsKey(timelineName) ? this._bonePoses[timelineName] : (this._bonePoses[timelineName] = BaseObject.BorrowObject<BonePose>());
+                        if (timelineDatas != null)
+                        {
+                            foreach (var timelineData in timelineDatas)
+                            {
+                                switch (timelineData.type)
+                                {
+                                    case TimelineType.BoneAll:
+                                        {
+                                            var timeline = BaseObject.BorrowObject<BoneAllTimelineState>();
+                                            timeline.bone = bone;
+                                            timeline.bonePose = bonePose;
+                                            timeline.Init(this._armature, this, timelineData);
+                                            this._boneTimelines.Add(timeline);
+                                            break;
+                                        }
+                                    case TimelineType.BoneTranslate:
+                                        {
+                                            var timeline = BaseObject.BorrowObject<BoneTranslateTimelineState>();
+                                            timeline.bone = bone;
+                                            timeline.bonePose = bonePose;
+                                            timeline.Init(this._armature, this, timelineData);
+                                            this._boneTimelines.Add(timeline);
+                                            break;
+                                        }
+                                    case TimelineType.BoneRotate:
+                                        {
+                                            var timeline = BaseObject.BorrowObject<BoneRotateTimelineState>();
+                                            timeline.bone = bone;
+                                            timeline.bonePose = bonePose;
+                                            timeline.Init(this._armature, this, timelineData);
+                                            this._boneTimelines.Add(timeline);
+                                            break;
+                                        }
+                                    case TimelineType.BoneScale:
+                                        {
+                                            var timeline = BaseObject.BorrowObject<BoneScaleTimelineState>();
+                                            timeline.bone = bone;
+                                            timeline.bonePose = bonePose;
+                                            timeline.Init(this._armature, this, timelineData);
+                                            this._boneTimelines.Add(timeline);
+                                            break;
+                                        }
+
+                                    default:
+                                        break;
+                                }
+                            }
+                        }
+                        else if (this.resetToPose)
+                        { // Pose timeline.
+                            var timeline = BaseObject.BorrowObject<BoneAllTimelineState>();
+                            timeline.bone = bone;
+                            timeline.bonePose = bonePose;
+                            timeline.Init(this._armature, this, null);
+                            this._boneTimelines.Add(timeline);
+                            this._poseTimelines.Add(timeline);
+                        }
+                    }
+                }
+
+                foreach (var timelines in boneTimelines.Values)
+                {
+                    // Remove bone timelines.
+                    foreach (var timeline in timelines)
+                    {
+                        this._boneTimelines.Remove(timeline);
+                        timeline.ReturnToPool();
+                    }
+                }
+            }
+
+            { // Update slot timelines.
+                Dictionary<string, List<SlotTimelineState>> slotTimelines = new Dictionary<string, List<SlotTimelineState>>();
+                List<int> ffdFlags = new List<int>();
+
+                foreach (var timeline in this._slotTimelines)
+                {
+                    // Create slot timelines map.
+                    var timelineName = timeline.slot.name;
+                    if (!(slotTimelines.ContainsKey(timelineName)))
+                    {
+                        slotTimelines[timelineName] = new List<SlotTimelineState>();
+                    }
+
+                    slotTimelines[timelineName].Add(timeline);
+                }
+
+                foreach (var slot in this._armature.GetSlots())
+                {
+                    var boneName = slot.parent.name;
+                    if (!this.ContainsBoneMask(boneName))
+                    {
+                        continue;
+                    }
+
+                    var timelineName = slot.name;
+                    var timelineDatas = this._animationData.GetSlotTimelines(timelineName);
+
+                    if (slotTimelines.ContainsKey(timelineName))
+                    {
+                        // Remove slot timeline from map.
+                        slotTimelines.Remove(timelineName);
+                    }
+                    else
+                    {
+                        // Create new slot timeline.
+                        var displayIndexFlag = false;
+                        var colorFlag = false;
+                        ffdFlags.Clear();
+
+                        if (timelineDatas != null)
+                        {
+                            foreach (var timelineData in timelineDatas)
+                            {
+                                switch (timelineData.type)
+                                {
+                                    case TimelineType.SlotDisplay:
+                                        {
+                                            var timeline = BaseObject.BorrowObject<SlotDislayTimelineState>();
+                                            timeline.slot = slot;
+                                            timeline.Init(this._armature, this, timelineData);
+                                            this._slotTimelines.Add(timeline);
+                                            displayIndexFlag = true;
+                                            break;
+                                        }
+                                    case TimelineType.SlotColor:
+                                        {
+                                            var timeline = BaseObject.BorrowObject<SlotColorTimelineState>();
+                                            timeline.slot = slot;
+                                            timeline.Init(this._armature, this, timelineData);
+                                            this._slotTimelines.Add(timeline);
+                                            colorFlag = true;
+                                            break;
+                                        }
+                                    case TimelineType.SlotDeform:
+                                        {
+                                            var timeline = BaseObject.BorrowObject<DeformTimelineState>();
+                                            timeline.slot = slot;
+                                            timeline.Init(this._armature, this, timelineData);
+                                            this._slotTimelines.Add(timeline);
+                                            ffdFlags.Add((int)timeline.vertexOffset);
+                                            break;
+                                        }
+
+                                    default:
+                                        break;
+                                }
+                            }
+                        }
+
+                        if (this.resetToPose)
+                        {
+                            // Pose timeline.
+                            if (!displayIndexFlag)
+                            {
+                                var timeline = BaseObject.BorrowObject<SlotDislayTimelineState>();
+                                timeline.slot = slot;
+                                timeline.Init(this._armature, this, null);
+                                this._slotTimelines.Add(timeline);
+                                this._poseTimelines.Add(timeline);
+                            }
+
+                            if (!colorFlag)
+                            {
+                                var timeline = BaseObject.BorrowObject<SlotColorTimelineState>();
+                                timeline.slot = slot;
+                                timeline.Init(this._armature, this, null);
+                                this._slotTimelines.Add(timeline);
+                                this._poseTimelines.Add(timeline);
+                            }
+
+                            if (slot.rawDisplayDatas != null)
+                            {
+                                foreach (var displayData in slot.rawDisplayDatas)
+                                {
+                                    if (displayData != null && displayData.type == DisplayType.Mesh)
+                                    {
+                                        var meshOffset = (displayData as MeshDisplayData).vertices.offset;
+                                        if (!ffdFlags.Contains(meshOffset))
+                                        {
+                                            var timeline = BaseObject.BorrowObject<DeformTimelineState>();
+                                            timeline.vertexOffset = meshOffset; //
+                                            timeline.slot = slot;
+                                            timeline.Init(this._armature, this, null);
+                                            this._slotTimelines.Add(timeline);
+                                            this._poseTimelines.Add(timeline);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                foreach (var timelines in slotTimelines.Values)
+                {
+                    // Remove slot timelines.
+                    foreach (var timeline in timelines)
+                    {
+                        this._slotTimelines.Remove(timeline);
+                        timeline.ReturnToPool();
+                    }
+                }
+            }
+
+            // {
+            //     // Update constraint timelines.
+            //     Dictionary<string, List<ConstraintTimelineState>> constraintTimelines = new Dictionary<string, List<ConstraintTimelineState>>();
+            //     foreach (var timeline in this._constraintTimelines)
+            //     { // Create constraint timelines map.
+            //         var timelineName = timeline.constraint.name;
+            //         if (!(constraintTimelines.ContainsKey(timelineName)))
+            //         {
+            //             constraintTimelines[timelineName] = new List<ConstraintTimelineState>();
+            //         }
+
+            //         constraintTimelines[timelineName].Add(timeline);
+            //     }
+
+            //     foreach (var constraint in this._armature._constraints)
+            //     {
+            //         var timelineName = constraint.name;
+            //         var timelineDatas = this._animationData.GetConstraintTimelines(timelineName);
+
+            //         if (constraintTimelines.ContainsKey(timelineName))
+            //         {
+            //             // Remove constraint timeline from map.
+            //             constraintTimelines.Remove(timelineName);
+            //         }
+            //         else
+            //         {
+            //             // Create new constraint timeline.
+            //             if (timelineDatas != null)
+            //             {
+            //                 foreach (var timelineData in timelineDatas)
+            //                 {
+            //                     switch (timelineData.type)
+            //                     {
+            //                         case TimelineType.IKConstraint:
+            //                             {
+            //                                 var timeline = BaseObject.BorrowObject<IKConstraintTimelineState>();
+            //                                 timeline.constraint = constraint;
+            //                                 timeline.Init(this._armature, this, timelineData);
+            //                                 this._constraintTimelines.Add(timeline);
+            //                                 break;
+            //                             }
+
+            //                         default:
+            //                             break;
+            //                     }
+            //                 }
+            //             }
+            //             else if (this.resetToPose)
+            //             {
+            //                 // Pose timeline.
+            //                 var timeline = BaseObject.BorrowObject<IKConstraintTimelineState>();
+            //                 timeline.constraint = constraint;
+            //                 timeline.Init(this._armature, this, null);
+            //                 this._constraintTimelines.Add(timeline);
+            //                 this._poseTimelines.Add(timeline);
+            //             }
+            //         }
+            //     }
+
+            //     foreach (var timelines in constraintTimelines.Values)
+            //     { // Remove constraint timelines.
+            //         foreach (var timeline in timelines)
+            //         {
+            //             this._constraintTimelines.Remove(timeline);
+            //             timeline.ReturnToPool();
+            //         }
+            //     }
+            // }
+        }
+
+        private void _AdvanceFadeTime(float passedTime)
+        {
+            var isFadeOut = this._fadeState > 0;
+
+            if (this._subFadeState < 0)
+            {
+                // Fade start event.
+                this._subFadeState = 0;
+
+                var eventType = isFadeOut ? EventObject.FADE_OUT : EventObject.FADE_IN;
+                if (this._armature.eventDispatcher.HasDBEventListener(eventType))
+                {
+                    var eventObject = BaseObject.BorrowObject<EventObject>();
+                    eventObject.type = eventType;
+                    eventObject.armature = this._armature;
+                    eventObject.animationState = this;
+                    this._armature._dragonBones.BufferEvent(eventObject);
+                }
+            }
+
+            if (passedTime < 0.0f)
+            {
+                passedTime = -passedTime;
+            }
+
+            this._fadeTime += passedTime;
+
+            if (this._fadeTime >= this.fadeTotalTime)
+            {
+                // Fade complete.
+                this._subFadeState = 1;
+                this._fadeProgress = isFadeOut ? 0.0f : 1.0f;
+            }
+            else if (this._fadeTime > 0.0f)
+            {
+                // Fading.
+                this._fadeProgress = isFadeOut ? (1.0f - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime);
+            }
+            else
+            {
+                // Before fade.
+                this._fadeProgress = isFadeOut ? 1.0f : 0.0f;
+            }
+
+            if (this._subFadeState > 0)
+            {
+                // Fade complete event.
+                if (!isFadeOut)
+                {
+                    this._playheadState |= 1; // x1
+                    this._fadeState = 0;
+                }
+
+                var eventType = isFadeOut ? EventObject.FADE_OUT_COMPLETE : EventObject.FADE_IN_COMPLETE;
+                if (this._armature.eventDispatcher.HasDBEventListener(eventType))
+                {
+                    var eventObject = BaseObject.BorrowObject<EventObject>();
+                    eventObject.type = eventType;
+                    eventObject.armature = this._armature;
+                    eventObject.animationState = this;
+                    this._armature._dragonBones.BufferEvent(eventObject);
+                }
+            }
+        }
+
+        /// <internal/>
+        /// <private/>
+        internal void Init(Armature armature, AnimationData animationData, AnimationConfig animationConfig)
+        {
+            if (this._armature != null)
+            {
+                return;
+            }
+
+            this._armature = armature;
+
+            this._animationData = animationData;
+            this.resetToPose = animationConfig.resetToPose;
+            this.additiveBlending = animationConfig.additiveBlending;
+            this.displayControl = animationConfig.displayControl;
+            this.actionEnabled = animationConfig.actionEnabled;
+            this.layer = animationConfig.layer;
+            this.playTimes = animationConfig.playTimes;
+            this.timeScale = animationConfig.timeScale;
+            this.fadeTotalTime = animationConfig.fadeInTime;
+            this.autoFadeOutTime = animationConfig.autoFadeOutTime;
+            this.weight = animationConfig.weight;
+            this.name = animationConfig.name.Length > 0 ? animationConfig.name : animationConfig.animation;
+            this.group = animationConfig.group;
+
+            if (animationConfig.pauseFadeIn)
+            {
+                this._playheadState = 2; // 10
+            }
+            else
+            {
+                this._playheadState = 3; // 11
+            }
+
+            if (animationConfig.duration < 0.0f)
+            {
+                this._position = 0.0f;
+                this._duration = this._animationData.duration;
+                if (animationConfig.position != 0.0f)
+                {
+                    if (this.timeScale >= 0.0f)
+                    {
+                        this._time = animationConfig.position;
+                    }
+                    else
+                    {
+                        this._time = animationConfig.position - this._duration;
+                    }
+                }
+                else
+                {
+                    this._time = 0.0f;
+                }
+            }
+            else
+            {
+                this._position = animationConfig.position;
+                this._duration = animationConfig.duration;
+                this._time = 0.0f;
+            }
+
+            if (this.timeScale < 0.0f && this._time == 0.0f)
+            {
+                this._time = -0.000001f; // Turn to end.
+            }
+
+            if (this.fadeTotalTime <= 0.0f)
+            {
+                this._fadeProgress = 0.999999f; // Make different.
+            }
+
+            if (animationConfig.boneMask.Count > 0)
+            {
+                this._boneMask.ResizeList(animationConfig.boneMask.Count);
+                for (int i = 0, l = this._boneMask.Count; i < l; ++i)
+                {
+                    this._boneMask[i] = animationConfig.boneMask[i];
+                }
+            }
+
+            this._actionTimeline = BaseObject.BorrowObject<ActionTimelineState>();
+            this._actionTimeline.Init(this._armature, this, this._animationData.actionTimeline);
+            this._actionTimeline.currentTime = this._time;
+            if (this._actionTimeline.currentTime < 0.0f)
+            {
+                this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime;
+            }
+
+            if (this._animationData.zOrderTimeline != null)
+            {
+                this._zOrderTimeline = BaseObject.BorrowObject<ZOrderTimelineState>();
+                this._zOrderTimeline.Init(this._armature, this, this._animationData.zOrderTimeline);
+            }
+        }
+        /// <internal/>
+        /// <private/>
+        internal void AdvanceTime(float passedTime, float cacheFrameRate)
+        {
+            this._blendState.dirty = true;
+
+            // Update fade time.
+            if (this._fadeState != 0 || this._subFadeState != 0)
+            {
+                this._AdvanceFadeTime(passedTime);
+            }
+
+            // Update time.
+            if (this._playheadState == 3)
+            {
+                // 11
+                if (this.timeScale != 1.0f)
+                {
+                    passedTime *= this.timeScale;
+                }
+
+                this._time += passedTime;
+            }
+
+            // Update timeline.
+            if (this._timelineDirty != 0)
+            {
+                if (this._timelineDirty == 2)
+                {
+                    this._UpdateTimelines();
+                }
+
+                this._timelineDirty = 0;
+                this._UpdateBoneAndSlotTimelines();
+            }
+
+            if (this.weight == 0.0f)
+            {
+                return;
+            }
+
+            var isCacheEnabled = this._fadeState == 0 && cacheFrameRate > 0.0f;
+            var isUpdateTimeline = true;
+            var isUpdateBoneTimeline = true;
+            var time = this._time;
+            this._weightResult = this.weight * this._fadeProgress;
+
+            if (this._parent != null)
+            {
+                this._weightResult *= this._parent._weightResult / this._parent._fadeProgress;
+            }
+
+            if (this._actionTimeline.playState <= 0)
+            {
+                // Update main timeline.
+                this._actionTimeline.Update(time);
+            }
+
+            if (isCacheEnabled)
+            {
+                // Cache time internval.
+                var internval = cacheFrameRate * 2.0f;
+                this._actionTimeline.currentTime = (float)Math.Floor(this._actionTimeline.currentTime * internval) / internval;
+            }
+
+            if (this._zOrderTimeline != null && this._zOrderTimeline.playState <= 0)
+            {
+                // Update zOrder timeline.
+                this._zOrderTimeline.Update(time);
+            }
+
+            if (isCacheEnabled)
+            {
+                // Update cache.
+                var cacheFrameIndex = (int)Math.Floor(this._actionTimeline.currentTime * cacheFrameRate); // uint
+                if (this._armature._cacheFrameIndex == cacheFrameIndex)
+                {
+                    // Same cache.
+                    isUpdateTimeline = false;
+                    isUpdateBoneTimeline = false;
+                }
+                else
+                {
+                    this._armature._cacheFrameIndex = cacheFrameIndex;
+                    if (this._animationData.cachedFrames[cacheFrameIndex])
+                    {
+                        // Cached.
+                        isUpdateBoneTimeline = false;
+                    }
+                    else
+                    {
+                        // Cache.
+                        this._animationData.cachedFrames[cacheFrameIndex] = true;
+                    }
+                }
+            }
+
+            if (isUpdateTimeline)
+            {
+                if (isUpdateBoneTimeline)
+                {
+                    for (int i = 0, l = this._boneTimelines.Count; i < l; ++i)
+                    {
+                        var timeline = this._boneTimelines[i];
+
+                        if (timeline.playState <= 0)
+                        {
+                            timeline.Update(time);
+                        }
+
+                        if (i == l - 1 || timeline.bone != this._boneTimelines[i + 1].bone)
+                        {
+                            var state = timeline.bone._blendState.Update(this._weightResult, this.layer);
+                            if (state != 0)
+                            {
+                                timeline.Blend(state);
+                            }
+                        }
+                    }
+                }
+
+                if (this.displayControl)
+                {
+                    for (int i = 0, l = this._slotTimelines.Count; i < l; ++i)
+                    {
+                        var timeline = this._slotTimelines[i];
+                        var displayController = timeline.slot.displayController;
+
+                        if (
+                            displayController == null ||
+                            displayController == this.name ||
+                            displayController == this.group
+                        )
+                        {
+                            if (timeline.playState <= 0)
+                            {
+                                timeline.Update(time);
+                            }
+                        }
+                    }
+                }
+
+                for (int i = 0, l = this._constraintTimelines.Count; i < l; ++i)
+                {
+                    var timeline = this._constraintTimelines[i];
+                    if (timeline.playState <= 0)
+                    {
+                        timeline.Update(time);
+                    }
+                }
+            }
+
+            if (this._fadeState == 0)
+            {
+                if (this._subFadeState > 0)
+                {
+                    this._subFadeState = 0;
+
+                    if (this._poseTimelines.Count > 0)
+                    {
+                        foreach (var timeline in this._poseTimelines)
+                        {
+                            if (timeline is BoneTimelineState)
+                            {
+                                this._boneTimelines.Remove(timeline as BoneTimelineState);
+                            }
+                            else if (timeline is SlotTimelineState)
+                            {
+                                this._slotTimelines.Remove(timeline as SlotTimelineState);
+                            }
+                            else if (timeline is ConstraintTimelineState)
+                            {
+                                this._constraintTimelines.Remove(timeline as ConstraintTimelineState);
+                            }
+
+                            timeline.ReturnToPool();
+                        }
+
+                        this._poseTimelines.Clear();
+                    }
+                }
+
+                if (this._actionTimeline.playState > 0)
+                {
+                    if (this.autoFadeOutTime >= 0.0f)
+                    {
+                        // Auto fade out.
+                        this.FadeOut(this.autoFadeOutTime);
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// - Continue play.
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 继续播放。
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public void Play()
+        {
+            this._playheadState = 3; // 11
+        }
+        /// <summary>
+        /// - Stop play.
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 暂停播放。
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public void Stop()
+        {
+            this._playheadState &= 1; // 0x
+        }
+        /// <summary>
+        /// - Fade out the animation state.
+        /// </summary>
+        /// <param name="fadeOutTime">- The fade out time. (In seconds)</param>
+        /// <param name="pausePlayhead">- Whether to pause the animation playing when fade out.</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 淡出动画状态。
+        /// </summary>
+        /// <param name="fadeOutTime">- 淡出时间。 (以秒为单位)</param>
+        /// <param name="pausePlayhead">- 淡出时是否暂停播放。</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public void FadeOut(float fadeOutTime, bool pausePlayhead = true)
+        {
+            if (fadeOutTime < 0.0f)
+            {
+                fadeOutTime = 0.0f;
+            }
+
+            if (pausePlayhead)
+            {
+                this._playheadState &= 2; // x0
+            }
+
+            if (this._fadeState > 0)
+            {
+                if (fadeOutTime > this.fadeTotalTime - this._fadeTime)
+                {
+                    // If the animation is already in fade out, the new fade out will be ignored.
+                    return;
+                }
+            }
+            else
+            {
+                this._fadeState = 1;
+                this._subFadeState = -1;
+
+                if (fadeOutTime <= 0.0f || this._fadeProgress <= 0.0f)
+                {
+                    this._fadeProgress = 0.000001f; // Modify fade progress to different value.
+                }
+
+                foreach (var timeline in this._boneTimelines)
+                {
+                    timeline.FadeOut();
+                }
+
+                foreach (var timeline in this._slotTimelines)
+                {
+                    timeline.FadeOut();
+                }
+
+                foreach (var timeline in this._constraintTimelines)
+                {
+                    timeline.FadeOut();
+                }
+            }
+
+            this.displayControl = false; //
+            this.fadeTotalTime = this._fadeProgress > 0.000001f ? fadeOutTime / this._fadeProgress : 0.0f;
+            this._fadeTime = this.fadeTotalTime * (1.0f - this._fadeProgress);
+        }
+
+        /// <summary>
+        /// - Check if a specific bone mask is included.
+        /// </summary>
+        /// <param name="boneName">- The bone name.</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 检查是否包含特定骨骼遮罩。
+        /// </summary>
+        /// <param name="boneName">- 骨骼名称。</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public bool ContainsBoneMask(string boneName)
+        {
+            return this._boneMask.Count == 0 || this._boneMask.IndexOf(boneName) >= 0;
+        }
+        /// <summary>
+        /// - Add a specific bone mask.
+        /// </summary>
+        /// <param name="boneName">- The bone name.</param>
+        /// <param name="recursive">- Whether or not to add a mask to the bone's sub-bone.</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 添加特定的骨骼遮罩。
+        /// </summary>
+        /// <param name="boneName">- 骨骼名称。</param>
+        /// <param name="recursive">- 是否为该骨骼的子骨骼添加遮罩。</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public void AddBoneMask(string boneName, bool recursive = true)
+        {
+            var currentBone = this._armature.GetBone(boneName);
+            if (currentBone == null)
+            {
+                return;
+            }
+
+            if (this._boneMask.IndexOf(boneName) < 0)
+            {
+                // Add mixing
+                this._boneMask.Add(boneName);
+            }
+
+            if (recursive)
+            {
+                // Add recursive mixing.
+                foreach (var bone in this._armature.GetBones())
+                {
+                    if (this._boneMask.IndexOf(bone.name) < 0 && currentBone.Contains(bone))
+                    {
+                        this._boneMask.Add(bone.name);
+                    }
+                }
+            }
+
+            this._timelineDirty = 1;
+        }
+        /// <summary>
+        /// - Remove the mask of a specific bone.
+        /// </summary>
+        /// <param name="boneName">- The bone name.</param>
+        /// <param name="recursive">- Whether to remove the bone's sub-bone mask.</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 删除特定骨骼的遮罩。
+        /// </summary>
+        /// <param name="boneName">- 骨骼名称。</param>
+        /// <param name="recursive">- 是否删除该骨骼的子骨骼遮罩。</param>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public void RemoveBoneMask(string boneName, bool recursive = true)
+        {
+            if (this._boneMask.Contains(boneName))
+            {
+                this._boneMask.Remove(boneName);
+            }
+
+            if (recursive)
+            {
+                var currentBone = this._armature.GetBone(boneName);
+                if (currentBone != null)
+                {
+                    var bones = this._armature.GetBones();
+                    if (this._boneMask.Count > 0)
+                    {
+                        // Remove recursive mixing.
+                        foreach (var bone in bones)
+                        {
+                            if (this._boneMask.Contains(bone.name) && currentBone.Contains(bone))
+                            {
+                                this._boneMask.Remove(bone.name);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        // Add unrecursive mixing.
+                        foreach (var bone in bones)
+                        {
+                            if (bone == currentBone)
+                            {
+                                continue;
+                            }
+
+                            if (!currentBone.Contains(bone))
+                            {
+                                this._boneMask.Add(bone.name);
+                            }
+                        }
+                    }
+                }
+            }
+
+            this._timelineDirty = 1;
+        }
+        /// <summary>
+        /// - Remove all bone masks.
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 删除所有骨骼遮罩。
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public void RemoveAllBoneMask()
+        {
+            this._boneMask.Clear();
+            this._timelineDirty = 1;
+        }
+        /// <summary>
+        /// - Whether the animation state is fading in.
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 是否正在淡入。
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>zh_CN</language>
+        public bool isFadeIn
+        {
+            get { return this._fadeState < 0; }
+        }
+        /// <summary>
+        /// - Whether the animation state is fading out.
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 是否正在淡出。
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>zh_CN</language>
+        public bool isFadeOut
+        {
+            get { return this._fadeState > 0; }
+        }
+        /// <summary>
+        /// - Whether the animation state is fade completed.
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 是否淡入或淡出完毕。
+        /// </summary>
+        /// <version>DragonBones 5.1</version>
+        /// <language>zh_CN</language>
+        public bool isFadeComplete
+        {
+            get { return this._fadeState == 0; }
+        }
+        /// <summary>
+        /// - Whether the animation state is playing.
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 是否正在播放。
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public bool isPlaying
+        {
+            get { return (this._playheadState & 2) != 0 && this._actionTimeline.playState <= 0; }
+        }
+        /// <summary>
+        /// - Whether the animation state is play completed.
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 是否播放完毕。
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public bool isCompleted
+        {
+            get { return this._actionTimeline.playState > 0; }
+        }
+        /// <summary>
+        /// - The times has been played.
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 已经循环播放的次数。
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public int currentPlayTimes
+        {
+            get { return this._actionTimeline.currentPlayTimes; }
+        }
+
+        /// <summary>
+        /// - The total time. (In seconds)
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 总播放时间。 (以秒为单位)
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public float totalTime
+        {
+            get { return this._duration; }
+        }
+        /// <summary>
+        /// - The time is currently playing. (In seconds)
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>en_US</language>
+
+        /// <summary>
+        /// - 当前播放的时间。 (以秒为单位)
+        /// </summary>
+        /// <version>DragonBones 3.0</version>
+        /// <language>zh_CN</language>
+        public float currentTime
+        {
+            get { return this._actionTimeline.currentTime; }
+            set
+            {
+                var currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0);
+                if (value < 0.0f || this._duration < value)
+                {
+                    value = (value % this._duration) + currentPlayTimes * this._duration;
+                    if (value < 0.0f)
+                    {
+                        value += this._duration;
+                    }
+                }
+
+                if (this.playTimes > 0 && currentPlayTimes == this.playTimes - 1 && value == this._duration)
+                {
+                    value = this._duration - 0.000001f;
+                }
+
+                if (this._time == value)
+                {
+                    return;
+                }
+
+                this._time = value;
+                this._actionTimeline.SetCurrentTime(this._time);
+
+                if (this._zOrderTimeline != null)
+                {
+                    this._zOrderTimeline.playState = -1;
+                }
+
+                foreach (var timeline in this._boneTimelines)
+                {
+                    timeline.playState = -1;
+                }
+
+                foreach (var timeline in this._slotTimelines)
+                {
+                    timeline.playState = -1;
+                }
+            }
+        }
+    }
+
+    /// <internal/>
+    /// <private/>
+    internal class BonePose : BaseObject
+    {
+        public readonly TransformDB current = new TransformDB();
+        public readonly TransformDB delta = new TransformDB();
+        public readonly TransformDB result = new TransformDB();
+
+        protected override void _OnClear()
+        {
+            this.current.Identity();
+            this.delta.Identity();
+            this.result.Identity();
+        }
+    }
+
+    /// <internal/>
+    /// <private/>
+    internal class BlendState
+    {
+        public bool dirty;
+        public int layer;
+        public float leftWeight;
+        public float layerWeight;
+        public float blendWeight;
+
+        /// <summary>
+        /// -1: First blending, 0: No blending, 1: Blending.
+        /// </summary>
+        public int Update(float weight, int p_layer)
+        {
+            if (this.dirty)
+            {
+                if (this.leftWeight > 0.0f)
+                {
+                    if (this.layer != p_layer)
+                    {
+                        if (this.layerWeight >= this.leftWeight)
+                        {
+                            this.leftWeight = 0.0f;
+
+                            return 0;
+                        }
+                        else
+                        {
+                            this.layer = p_layer;
+                            this.leftWeight -= this.layerWeight;
+                            this.layerWeight = 0.0f;
+                        }
+                    }
+                }
+                else
+                {
+                    return 0;
+                }
+
+                weight *= this.leftWeight;
+                this.layerWeight += weight;
+                this.blendWeight = weight;
+
+                return 2;
+            }
+
+            this.dirty = true;
+            this.layer = p_layer;
+            this.layerWeight = weight;
+            this.leftWeight = 1.0f;
+            this.blendWeight = weight;
+
+            return 1;
+        }
+
+        public void Clear()
+        {
+            this.dirty = false;
+            this.layer = 0;
+            this.leftWeight = 0.0f;
+            this.layerWeight = 0.0f;
+            this.blendWeight = 0.0f;
+        }
+    }
+}

+ 12 - 0
Assets/DuckHunter/DragonBones/Scripts/animation/AnimationState.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d99cb712d67e39845b749a7cad79704b
+timeCreated: 1475133206
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 474 - 0
Assets/DuckHunter/DragonBones/Scripts/animation/BaseTimelineState.cs

@@ -0,0 +1,474 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2017 DragonBones team and other contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System;
+using System.Collections.Generic;
+
+namespace DragonBones
+{
+    /// <internal/>
+    /// <private/>
+    internal enum TweenState
+    {
+        None,
+        Once,
+        Always
+    }
+    /// <internal/>
+    /// <private/>
+    internal abstract class TimelineState : BaseObject
+    {
+        public int playState; // -1: start, 0: play, 1: complete;
+        public int currentPlayTimes;
+        public float currentTime;
+
+        protected TweenState _tweenState;
+        protected uint _frameRate;
+        protected int _frameValueOffset;
+        protected uint _frameCount;
+        protected uint _frameOffset;
+        protected int _frameIndex;
+        protected float _frameRateR;
+        protected float _position;
+        protected float _duration;
+        protected float _timeScale;
+        protected float _timeOffset;
+        protected DragonBonesData _dragonBonesData;
+        protected AnimationData _animationData;
+        protected TimelineData _timelineData;
+        protected Armature _armature;
+        protected AnimationState _animationState;
+        protected TimelineState _actionTimeline;
+
+        protected short[] _frameArray;
+        protected short[] _frameIntArray;
+        protected float[] _frameFloatArray;
+        protected ushort[] _timelineArray;
+        protected List<uint> _frameIndices;
+
+        protected override void _OnClear()
+        {
+            this.playState = -1;
+            this.currentPlayTimes = -1;
+            this.currentTime = -1.0f;
+
+            this._tweenState = TweenState.None;
+            this._frameRate = 0;
+            this._frameValueOffset = 0;
+            this._frameCount = 0;
+            this._frameOffset = 0;
+            this._frameIndex = -1;
+            this._frameRateR = 0.0f;
+            this._position = 0.0f;
+            this._duration = 0.0f;
+            this._timeScale = 1.0f;
+            this._timeOffset = 0.0f;
+            this._dragonBonesData = null; //
+            this._animationData = null; //
+            this._timelineData = null; //
+            this._armature = null; //
+            this._animationState = null; //
+            this._actionTimeline = null; //
+            this._frameArray = null; //
+            this._frameIntArray = null; //
+            this._frameFloatArray = null; //
+            this._timelineArray = null; //
+            this._frameIndices = null; //
+        }
+
+        protected abstract void _OnArriveAtFrame();
+        protected abstract void _OnUpdateFrame();
+
+        protected bool _SetCurrentTime(float passedTime)
+        {
+            var prevState = this.playState;
+            var prevPlayTimes = this.currentPlayTimes;
+            var prevTime = this.currentTime;
+
+            if (this._actionTimeline != null && this._frameCount <= 1)
+            {
+                // No frame or only one frame.
+                this.playState = this._actionTimeline.playState >= 0 ? 1 : -1;
+                this.currentPlayTimes = 1;
+                this.currentTime = this._actionTimeline.currentTime;
+            }
+            else if (this._actionTimeline == null || this._timeScale != 1.0f || this._timeOffset != 0.0f)
+            {
+                var playTimes = this._animationState.playTimes;
+                var totalTime = playTimes * this._duration;
+
+                passedTime *= this._timeScale;
+                if (this._timeOffset != 0.0f)
+                {
+                    passedTime += this._timeOffset * this._animationData.duration;
+                }
+
+                if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime))
+                {
+                    if (this.playState <= 0 && this._animationState._playheadState == 3)
+                    {
+                        this.playState = 1;
+                    }
+
+                    this.currentPlayTimes = playTimes;
+                    if (passedTime < 0.0f)
+                    {
+                        this.currentTime = 0.0f;
+                    }
+                    else
+                    {
+                        this.currentTime = this._duration + 0.000001f; // Precision problem
+                    }
+                }
+                else
+                {
+                    if (this.playState != 0 && this._animationState._playheadState == 3)
+                    {
+                        this.playState = 0;
+                    }
+
+                    if (passedTime < 0.0f)
+                    {
+                        passedTime = -passedTime;
+                        this.currentPlayTimes = (int)(passedTime / this._duration);
+                        this.currentTime = this._duration - (passedTime % this._duration);
+                    }
+                    else
+                    {
+                        this.currentPlayTimes = (int)(passedTime / this._duration);
+                        this.currentTime = passedTime % this._duration;
+                    }
+                }
+
+                this.currentTime += this._position;
+            }
+            else
+            {
+                // Multi frames.
+                this.playState = this._actionTimeline.playState;
+                this.currentPlayTimes = this._actionTimeline.currentPlayTimes;
+                this.currentTime = this._actionTimeline.currentTime;
+            }
+
+            if (this.currentPlayTimes == prevPlayTimes && this.currentTime == prevTime)
+            {
+                return false;
+            }
+
+            // Clear frame flag when timeline start or loopComplete.
+            if ((prevState < 0 && this.playState != prevState) || (this.playState <= 0 && this.currentPlayTimes != prevPlayTimes))
+            {
+                this._frameIndex = -1;
+            }
+
+            return true;
+        }
+
+        public virtual void Init(Armature armature, AnimationState animationState, TimelineData timelineData)
+        {
+            this._armature = armature;
+            this._animationState = animationState;
+            this._timelineData = timelineData;
+            this._actionTimeline = this._animationState._actionTimeline;
+
+            if (this == this._actionTimeline)
+            {
+                this._actionTimeline = null; //
+            }
+
+            this._frameRate = this._armature.armatureData.frameRate;
+            this._frameRateR = 1.0f / this._frameRate;
+            this._position = this._animationState._position;
+            this._duration = this._animationState._duration;
+            this._dragonBonesData = this._armature.armatureData.parent;
+            this._animationData = this._animationState._animationData;
+
+            if (this._timelineData != null)
+            {
+                this._frameIntArray = this._dragonBonesData.frameIntArray;
+                this._frameFloatArray = this._dragonBonesData.frameFloatArray;
+                this._frameArray = this._dragonBonesData.frameArray;
+                this._timelineArray = this._dragonBonesData.timelineArray;
+                this._frameIndices = this._dragonBonesData.frameIndices;
+
+                this._frameCount = this._timelineArray[this._timelineData.offset + (int)BinaryOffset.TimelineKeyFrameCount];
+                this._frameValueOffset = this._timelineArray[this._timelineData.offset + (int)BinaryOffset.TimelineFrameValueOffset];
+                var timelineScale = this._timelineArray[this._timelineData.offset + (int)BinaryOffset.TimelineScale];
+                this._timeScale = 100.0f / (timelineScale == 0 ? 100.0f : timelineScale);
+                this._timeOffset = this._timelineArray[this._timelineData.offset + (int)BinaryOffset.TimelineOffset] * 0.01f;
+            }
+        }
+
+        public virtual void FadeOut()
+        {
+
+        }
+
+        public virtual void Update(float passedTime)
+        {
+            if (this._SetCurrentTime(passedTime))
+            {
+                if (this._frameCount > 1)
+                {
+                    int timelineFrameIndex = (int)Math.Floor(this.currentTime * this._frameRate); // uint
+                    var frameIndex = this._frameIndices[(int)(this._timelineData as TimelineData).frameIndicesOffset + timelineFrameIndex];
+                    if (this._frameIndex != frameIndex)
+                    {
+                        this._frameIndex = (int)frameIndex;
+                        this._frameOffset = this._animationData.frameOffset + this._timelineArray[(this._timelineData as TimelineData).offset + (int)BinaryOffset.TimelineFrameOffset + this._frameIndex];
+
+                        this._OnArriveAtFrame();
+                    }
+                }
+                else if (this._frameIndex < 0)
+                {
+                    this._frameIndex = 0;
+                    if (this._timelineData != null)
+                    {
+                        // May be pose timeline.
+                        this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + (int)BinaryOffset.TimelineFrameOffset];
+                    }
+
+                    this._OnArriveAtFrame();
+                }
+
+                if (this._tweenState != TweenState.None)
+                {
+                    this._OnUpdateFrame();
+                }
+            }
+        }
+    }
+
+    /// <internal/>
+    /// <private/>
+    internal abstract class TweenTimelineState : TimelineState
+    {
+        private static float _GetEasingValue(TweenType tweenType, float progress, float easing)
+        {
+            var value = progress;
+
+            switch (tweenType)
+            {
+                case TweenType.QuadIn:
+                    value = (float)Math.Pow(progress, 2.0f);
+                    break;
+
+                case TweenType.QuadOut:
+                    value = 1.0f - (float)Math.Pow(1.0f - progress, 2.0f);
+                    break;
+
+                case TweenType.QuadInOut:
+                    value = 0.5f * (1.0f - (float)Math.Cos(progress * Math.PI));
+                    break;
+            }
+
+            return (value - progress) * easing + progress;
+        }
+
+        private static float _GetEasingCurveValue(float progress, short[] samples, int count, int offset)
+        {
+            if (progress <= 0.0f)
+            {
+                return 0.0f;
+            }
+            else if (progress >= 1.0f)
+            {
+                return 1.0f;
+            }
+
+            var segmentCount = count + 1; // + 2 - 1
+            var valueIndex = (int)Math.Floor(progress * segmentCount);
+            var fromValue = valueIndex == 0 ? 0.0f : samples[offset + valueIndex - 1];
+
+            var toValue = (valueIndex == segmentCount - 1) ? 10000.0f : samples[offset + valueIndex];
+
+            return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001f;
+        }
+
+        protected TweenType _tweenType;
+        protected int _curveCount;
+        protected float _framePosition;
+        protected float _frameDurationR;
+        protected float _tweenProgress;
+        protected float _tweenEasing;
+
+        protected override void _OnClear()
+        {
+            base._OnClear();
+
+            this._tweenType = TweenType.None;
+            this._curveCount = 0;
+            this._framePosition = 0.0f;
+            this._frameDurationR = 0.0f;
+            this._tweenProgress = 0.0f;
+            this._tweenEasing = 0.0f;
+        }
+
+        protected override void _OnArriveAtFrame()
+        {
+            if (this._frameCount > 1 &&
+                (this._frameIndex != this._frameCount - 1 ||
+                this._animationState.playTimes == 0 ||
+                this._animationState.currentPlayTimes < this._animationState.playTimes - 1))
+            {
+                this._tweenType = (TweenType)this._frameArray[this._frameOffset + (int)BinaryOffset.FrameTweenType]; // TODO recode ture tween type.
+                this._tweenState = this._tweenType == TweenType.None ? TweenState.Once : TweenState.Always;
+
+                if (this._tweenType == TweenType.Curve)
+                {
+                    this._curveCount = this._frameArray[this._frameOffset + (int)BinaryOffset.FrameTweenEasingOrCurveSampleCount];
+                }
+                else if (this._tweenType != TweenType.None && this._tweenType != TweenType.Line)
+                {
+                    this._tweenEasing = this._frameArray[this._frameOffset + (int)BinaryOffset.FrameTweenEasingOrCurveSampleCount] * 0.01f;
+                }
+
+                this._framePosition = this._frameArray[this._frameOffset] * this._frameRateR;
+                if (this._frameIndex == this._frameCount - 1)
+                {
+                    this._frameDurationR = 1.0f / (this._animationData.duration - this._framePosition);
+                }
+                else
+                {
+                    var nextFrameOffset = this._animationData.frameOffset + this._timelineArray[(this._timelineData as TimelineData).offset + (int)BinaryOffset.TimelineFrameOffset + this._frameIndex + 1];
+                    var frameDuration = this._frameArray[nextFrameOffset] * this._frameRateR - this._framePosition;
+
+                    if (frameDuration > 0.0f)
+                    {
+                        this._frameDurationR = 1.0f / frameDuration;
+                    }
+                    else
+                    {
+                        this._frameDurationR = 0.0f;
+                    }
+                }
+            }
+            else
+            {
+                this._tweenState = TweenState.Once;
+            }
+        }
+
+        protected override void _OnUpdateFrame()
+        {
+            if (this._tweenState == TweenState.Always)
+            {
+                this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR;
+                if (this._tweenType == TweenType.Curve)
+                {
+                    this._tweenProgress = TweenTimelineState._GetEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, (int)this._frameOffset + (int)BinaryOffset.FrameCurveSamples);
+                }
+                else if (this._tweenType != TweenType.Line)
+                {
+                    this._tweenProgress = TweenTimelineState._GetEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing);
+                }
+            }
+            else
+            {
+                this._tweenProgress = 0.0f;
+            }
+        }
+    }
+    /// <internal/>
+    /// <private/>
+    internal abstract class BoneTimelineState : TweenTimelineState
+    {
+        public Bone bone;
+        public BonePose bonePose;
+
+        protected override void _OnClear()
+        {
+            base._OnClear();
+
+            this.bone = null; //
+            this.bonePose = null; //
+        }
+
+        public void Blend(int state)
+        {
+            var blendWeight = this.bone._blendState.blendWeight;
+            var animationPose = this.bone.animationPose;
+            var result = this.bonePose.result;
+
+            if (state == 2)
+            {
+                animationPose.x += result.x * blendWeight;
+                animationPose.y += result.y * blendWeight;
+                animationPose.rotation += result.rotation * blendWeight;
+                animationPose.skew += result.skew * blendWeight;
+                animationPose.scaleX += (result.scaleX - 1.0f) * blendWeight;
+                animationPose.scaleY += (result.scaleY - 1.0f) * blendWeight;
+            }
+            else if (blendWeight != 1.0f)
+            {
+                animationPose.x = result.x * blendWeight;
+                animationPose.y = result.y * blendWeight;
+                animationPose.rotation = result.rotation * blendWeight;
+                animationPose.skew = result.skew * blendWeight;
+                animationPose.scaleX = (result.scaleX - 1.0f) * blendWeight + 1.0f;
+                animationPose.scaleY = (result.scaleY - 1.0f) * blendWeight + 1.0f;
+            }
+            else
+            {
+                animationPose.x = result.x;
+                animationPose.y = result.y;
+                animationPose.rotation = result.rotation;
+                animationPose.skew = result.skew;
+                animationPose.scaleX = result.scaleX;
+                animationPose.scaleY = result.scaleY;
+            }
+
+            if (this._animationState._fadeState != 0 || this._animationState._subFadeState != 0)
+            {
+                this.bone._transformDirty = true;
+            }
+        }
+    }
+    /// <internal/>
+    /// <private/>
+    internal abstract class SlotTimelineState : TweenTimelineState
+    {
+        public Slot slot;
+
+        protected override void _OnClear()
+        {
+            base._OnClear();
+
+            this.slot = null; //
+        }
+    }
+
+    /// <internal/>
+    /// <private/>
+    internal abstract class ConstraintTimelineState : TweenTimelineState
+    {
+        public Constraint constraint;
+
+        protected override void _OnClear()
+        {
+            base._OnClear();
+
+            this.constraint = null; //
+        }
+    }
+}

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio