Преглед изворни кода

Merge branch 'master' of http://192.168.123.2:3000/fort23/XY001

# Conflicts:
#	UserSettings/Layouts/CurrentMaximizeLayout.dwlt   resolved by origin/master(远端) version
liao пре 5 месеци
родитељ
комит
293af978f6
100 измењених фајлова са 7045 додато и 544 уклоњено
  1. 198 104
      Assembly-CSharp.csproj
  2. 8 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01.meta
  3. 50 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_AnimationMatricesTexture_Snakelet.asset
  4. 8 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_AnimationMatricesTexture_Snakelet.asset.meta
  5. 218 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_GpuEcsAnimator.prefab
  6. 7 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_GpuEcsAnimator.prefab.meta
  7. 148 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Material_Snakelet.mat
  8. 8 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Material_Snakelet.mat.meta
  9. 358 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Mesh_Snakelet.mesh
  10. 8 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Mesh_Snakelet.mesh.meta
  11. 133 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Material.mat
  12. 8 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Material.mat.meta
  13. 1588 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Shader Graph.shadergraph
  14. 10 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Shader Graph.shadergraph.meta
  15. 55 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/NewUnlitShader.shader
  16. 9 0
      Assets/Art/ArtHero/BakedAssets_Guaiwu01/NewUnlitShader.shader.meta
  17. 150 1
      Assets/Art/ArtHero/Guaiwu01.prefab
  18. 203 0
      Assets/Art/ArtHero/Guaiwu01_gpu.prefab
  19. 7 0
      Assets/Art/ArtHero/Guaiwu01_gpu.prefab.meta
  20. 4 4
      Assets/Art/ArtHero/Hero01.prefab
  21. 165 209
      Assets/Art/ArtHero/Hero03.prefab
  22. 246 0
      Assets/Art/ArtHero/New Animator Controller.controller
  23. 8 0
      Assets/Art/ArtHero/New Animator Controller.controller.meta
  24. 135 5
      Assets/Art/HeroTimeLine/Hero01.playable
  25. BIN
      Assets/Art/VFX/Epic Toon FX/Textures/fireball.png
  26. 161 0
      Assets/Art/VFX/Epic Toon FX/Textures/fireball.png.meta
  27. BIN
      Assets/Art/VFX/Epic Toon FX/Textures/fireball2.png
  28. 161 0
      Assets/Art/VFX/Epic Toon FX/Textures/fireball2.png.meta
  29. 3 1
      Assets/Art/VFX/FXPrefabs/fx_hero01_dg_bo.prefab
  30. 212 158
      Assets/Art/VFX/FXPrefabs/fx_hero03_sk.prefab
  31. 132 0
      Assets/Art/VFX/Materials/fx_fireball_ad.mat
  32. 8 0
      Assets/Art/VFX/Materials/fx_fireball_ad.mat.meta
  33. 132 0
      Assets/Art/VFX/Materials/fx_fireball_al.mat
  34. 8 0
      Assets/Art/VFX/Materials/fx_fireball_al.mat.meta
  35. 132 0
      Assets/Art/VFX/Materials/fx_jg_ad.mat
  36. 8 0
      Assets/Art/VFX/Materials/fx_jg_ad.mat.meta
  37. 132 0
      Assets/Art/VFX/Materials/fx_jg_al.mat
  38. 8 0
      Assets/Art/VFX/Materials/fx_jg_al.mat.meta
  39. 62 62
      Assets/Art/test01.scene
  40. 8 0
      Assets/GPUECSAnimationBaker.meta
  41. 8 0
      Assets/GPUECSAnimationBaker/Engine.meta
  42. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem.meta
  43. 37 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshBehaviour.cs
  44. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshBehaviour.cs.meta
  45. 24 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshComponents.cs
  46. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshComponents.cs.meta
  47. 40 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshSystem.cs
  48. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshSystem.cs.meta
  49. 18 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimationData.cs
  50. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimationData.cs.meta
  51. 41 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorAspect.cs
  52. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorAspect.cs.meta
  53. 123 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorBehaviour.cs
  54. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorBehaviour.cs.meta
  55. 69 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorComponents.cs
  56. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorComponents.cs.meta
  57. 30 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorControlComponents.cs
  58. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorControlComponents.cs.meta
  59. 26 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorInitializerBehaviour.cs
  60. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorInitializerBehaviour.cs.meta
  61. 313 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorSystem.cs
  62. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorSystem.cs.meta
  63. 12 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentAnchorData.cs
  64. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentAnchorData.cs.meta
  65. 37 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentBehaviour.cs
  66. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentBehaviour.cs.meta
  67. 10 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentComponents.cs
  68. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentComponents.cs.meta
  69. 25 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentInitializerBehaviour.cs
  70. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentInitializerBehaviour.cs.meta
  71. 43 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentSystem.cs
  72. 3 0
      Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentSystem.cs.meta
  73. 3 0
      Assets/GPUECSAnimationBaker/Engine/Baker.meta
  74. 832 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakeServices.cs
  75. 3 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakeServices.cs.meta
  76. 31 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerBehaviour.cs
  77. 11 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerBehaviour.cs.meta
  78. 79 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerEditor.cs
  79. 3 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerEditor.cs.meta
  80. 22 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerMenu.cs
  81. 3 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerMenu.cs.meta
  82. 12 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationEventBakerBehaviour.cs
  83. 3 0
      Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationEventBakerBehaviour.cs.meta
  84. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data.meta
  85. 25 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationData.cs
  86. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationData.cs.meta
  87. 94 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationDataDrawer.cs
  88. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationDataDrawer.cs.meta
  89. 10 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationMatricesTexture.cs
  90. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationMatricesTexture.cs.meta
  91. 8 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationTypes.cs
  92. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimationTypes.cs.meta
  93. 15 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameter.cs
  94. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameter.cs.meta
  95. 41 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterDrawer.cs
  96. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterDrawer.cs.meta
  97. 9 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterTypes.cs
  98. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterTypes.cs.meta
  99. 11 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorState.cs
  100. 3 0
      Assets/GPUECSAnimationBaker/Engine/Data/AnimatorState.cs.meta

+ 198 - 104
Assembly-CSharp.csproj

@@ -43,6 +43,18 @@
   <ItemGroup>
     <Analyzer Include="D:\tuanJieEditor\2022.3.38t2\Editor\Data\Tools\Unity.SourceGenerators\Unity.SourceGenerators.dll" />
     <Analyzer Include="D:\tuanJieEditor\2022.3.38t2\Editor\Data\Tools\Unity.SourceGenerators\Unity.Properties.SourceGenerator.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.SystemGenerator.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.SystemGenerator.SystemAPI.QueryBuilder.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.SystemGenerator.SystemAPI.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.Analyzer.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.SystemGenerator.LambdaJobs.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.SystemGenerator.Common.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.SystemGenerator.SystemAPI.Query.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.Analyzer.CodeFixes.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.AspectGenerator.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.Common.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.SystemGenerator.EntityQueryBulkOperations.dll" />
+    <Analyzer Include="D:\unityProject\XY001\Library\PackageCache\com.unity.entities@1.0.16\Unity.Entities\SourceGenerators\Unity.Entities.SourceGen.JobEntityGenerator.dll" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Assets\TextMesh Pro\Examples &amp; Extras\Scripts\TMP_TextEventHandler.cs" />
@@ -151,6 +163,7 @@
     <None Include="Assets\Art\UIAssets\TextrueJson\rim.txt" />
     <None Include="Assets\Art\UIAssets\TextrueJson\MonsterSkillIcon.txt" />
     <None Include="Assets\Art\UIAssets\TextrueJson\huodewupin.txt" />
+    <None Include="Assets\Art\VFX\Resources\AddMoveTurbDissolve.shader" />
     <None Include="Assets\Art\UIAssets\TextrueJson\yw.txt" />
     <None Include="Assets\Art\UIAssets\TextrueJson\yingxiongtouxiang.txt" />
     <None Include="Assets\Art\UIAssets\TextrueJson\c3m1.txt" />
@@ -234,6 +247,7 @@
     <None Include="Assets\Art\UIAssets\TextrueJson\buzhenjiemian.txt" />
     <None Include="Assets\StreamingAssets\assetConfig.txt" />
     <None Include="Assets\Res\Config\LanguageDEConfig.json" />
+    <None Include="Assets\Art\ArtHero\BakedAssets_Guaiwu01\NewUnlitShader.shader" />
     <None Include="Assets\Art\UIAssets\TextrueJson\zhandou.txt" />
     <None Include="Assets\Art\UIAssets\TextrueJson\js.txt" />
     <None Include="Assets\Art\UIAssets\TextrueJson\haoyou.txt" />
@@ -527,7 +541,7 @@
       <HintPath>D:\unityProject\XY001\Library\PackageCache\com.qq.weixin.minigame@3d141a9620\Runtime\Plugins\wx-perf.dll</HintPath>
     </Reference>
     <Reference Include="Unity.Collections.LowLevel.ILSupport">
-      <HintPath>D:\unityProject\XY001\Library\PackageCache\com.unity.collections@1.2.4\Unity.Collections.LowLevel.ILSupport\Unity.Collections.LowLevel.ILSupport.dll</HintPath>
+      <HintPath>D:\unityProject\XY001\Library\PackageCache\com.unity.collections@2.1.4\Unity.Collections.LowLevel.ILSupport\Unity.Collections.LowLevel.ILSupport.dll</HintPath>
     </Reference>
     <Reference Include="Unity.FontABTool">
       <HintPath>D:\unityProject\XY001\Library\PackageCache\com.qq.weixin.minigame@3d141a9620\Runtime\Plugins\Unity.FontABTool.dll</HintPath>
@@ -538,6 +552,9 @@
     <Reference Include="EPPlus">
       <HintPath>D:\unityProject\XY001\Assets\Scripts\ThirdParty\EPP\EPPlus.dll</HintPath>
     </Reference>
+    <Reference Include="Mono.Cecil">
+      <HintPath>D:\unityProject\XY001\Library\PackageCache\com.unity.nuget.mono-cecil@1.11.4\Mono.Cecil.dll</HintPath>
+    </Reference>
     <Reference Include="Unity.VisualScripting.Antlr3.Runtime">
       <HintPath>D:\unityProject\XY001\Library\PackageCache\com.unity.visualscripting@1.9.4\Runtime\VisualScripting.Flow\Dependencies\NCalc\Unity.VisualScripting.Antlr3.Runtime.dll</HintPath>
     </Reference>
@@ -907,35 +924,26 @@
     <Reference Include="System.Xml.Serialization">
       <HintPath>D:\tuanJieEditor\2022.3.38t2\Editor\Data\NetStandard\compat\2.1.0\shims\netfx\System.Xml.Serialization.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.2D.IK.Runtime">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.IK.Runtime.dll</HintPath>
-    </Reference>
-    <Reference Include="Unity.RenderPipelines.Core.Runtime">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Core.Runtime.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.Burst.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Burst.Editor.dll</HintPath>
     </Reference>
     <Reference Include="Unity.2D.Common.Path.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Common.Path.Editor.dll</HintPath>
     </Reference>
+    <Reference Include="Unity.ScriptableBuildPipeline">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.ScriptableBuildPipeline.dll</HintPath>
+    </Reference>
     <Reference Include="Wx">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Wx.dll</HintPath>
     </Reference>
     <Reference Include="WxEditor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\WxEditor.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.2D.PixelPerfect.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.PixelPerfect.Editor.dll</HintPath>
-    </Reference>
-    <Reference Include="Unity.Rider.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Rider.Editor.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.2D.Aseprite.Common">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Aseprite.Common.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.2D.Sprite.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Sprite.Editor.dll</HintPath>
+    <Reference Include="Unity.Entities.Build">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.Build.dll</HintPath>
     </Reference>
     <Reference Include="Unity.RenderPipelines.Universal.Config.Runtime">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Config.Runtime.dll</HintPath>
@@ -946,14 +954,8 @@
     <Reference Include="Unity.RenderPipelines.Core.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Core.Editor.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.VisualScripting.Flow">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.Flow.dll</HintPath>
-    </Reference>
-    <Reference Include="Unity.Mathematics.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Mathematics.Editor.dll</HintPath>
-    </Reference>
-    <Reference Include="Unity.2D.Tilemap.Extras.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Tilemap.Extras.Editor.dll</HintPath>
+    <Reference Include="Unity.Entities.UI.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.UI.Editor.dll</HintPath>
     </Reference>
     <Reference Include="Unity.RenderPipelines.Core.ShaderLibrary">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Core.ShaderLibrary.dll</HintPath>
@@ -961,8 +963,8 @@
     <Reference Include="Unity.Collections">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Collections.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.2D.SpriteShape.Runtime">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.SpriteShape.Runtime.dll</HintPath>
+    <Reference Include="Unity.Entities.Hybrid.HybridComponents">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.Hybrid.HybridComponents.dll</HintPath>
     </Reference>
     <Reference Include="Unity.2D.PixelPerfect">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.PixelPerfect.dll</HintPath>
@@ -970,6 +972,9 @@
     <Reference Include="PPv2URPConverters">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\PPv2URPConverters.dll</HintPath>
     </Reference>
+    <Reference Include="Unity.Deformations">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Deformations.dll</HintPath>
+    </Reference>
     <Reference Include="Unity.TextMeshPro">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.TextMeshPro.dll</HintPath>
     </Reference>
@@ -979,21 +984,114 @@
     <Reference Include="Unity.RenderPipelines.Universal.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Editor.dll</HintPath>
     </Reference>
+    <Reference Include="Unity.Mathematics.Extensions.Hybrid">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Mathematics.Extensions.Hybrid.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.RenderPipelines.Universal.Runtime">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Runtime.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Burst">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Burst.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEditor.UI">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\UnityEditor.UI.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.Animation.Runtime">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Animation.Runtime.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.VisualScripting.Flow.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.Flow.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.RenderPipeline.Universal.ShaderLibrary">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipeline.Universal.ShaderLibrary.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Serialization.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Serialization.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Transforms">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Transforms.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Serialization">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Serialization.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Scenes.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Scenes.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Entities.UI">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.UI.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Entities.Editor.Properties">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.Editor.Properties.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.RenderPipelines.Universal.Shaders">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Shaders.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Searcher.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Searcher.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.VisualScripting.State">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.State.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Scenes">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Scenes.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.SpriteShape.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.SpriteShape.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.ScriptableBuildPipeline.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.ScriptableBuildPipeline.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.IK.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.IK.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.IK.Runtime">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.IK.Runtime.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.RenderPipelines.Core.Runtime">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Core.Runtime.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Entities">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.PixelPerfect.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.PixelPerfect.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Rider.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Rider.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.Sprite.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Sprite.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Entities.Hybrid">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.Hybrid.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.VisualScripting.Flow">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.Flow.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Mathematics.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Mathematics.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.Tilemap.Extras.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Tilemap.Extras.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.2D.SpriteShape.Runtime">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.SpriteShape.Runtime.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Collections.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Collections.Editor.dll</HintPath>
+    </Reference>
+    <Reference Include="Unity.Profiling.Core">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Profiling.Core.dll</HintPath>
+    </Reference>
     <Reference Include="Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll</HintPath>
     </Reference>
     <Reference Include="PsdPlugin">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\PsdPlugin.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.RenderPipelines.Universal.Runtime">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Runtime.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.PlasticSCM.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.PlasticSCM.Editor.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.Burst">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Burst.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.Timeline.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Timeline.Editor.dll</HintPath>
     </Reference>
@@ -1003,15 +1101,9 @@
     <Reference Include="Unity.ShaderGraph.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.ShaderGraph.Editor.dll</HintPath>
     </Reference>
-    <Reference Include="UnityEditor.UI">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\UnityEditor.UI.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.VisualScripting.Core">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.Core.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.2D.Animation.Runtime">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Animation.Runtime.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.2D.Tilemap.Extras">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Tilemap.Extras.dll</HintPath>
     </Reference>
@@ -1021,24 +1113,27 @@
     <Reference Include="UnityEngine.UI">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\UnityEngine.UI.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.VisualScripting.Flow.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.Flow.Editor.dll</HintPath>
+    <Reference Include="Unity.Entities.Graphics">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.Graphics.dll</HintPath>
     </Reference>
     <Reference Include="Unity.InternalAPIEngineBridge.001">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.InternalAPIEngineBridge.001.dll</HintPath>
     </Reference>
+    <Reference Include="Unity.Transforms.Hybrid">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Transforms.Hybrid.dll</HintPath>
+    </Reference>
     <Reference Include="Unity.2D.Common.Runtime">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Common.Runtime.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.RenderPipeline.Universal.ShaderLibrary">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipeline.Universal.ShaderLibrary.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.Timeline">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Timeline.dll</HintPath>
     </Reference>
     <Reference Include="Unity.VisualScripting.SettingsProvider.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.SettingsProvider.Editor.dll</HintPath>
     </Reference>
+    <Reference Include="Unity.Entities.Graphics.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.Graphics.Editor.dll</HintPath>
+    </Reference>
     <Reference Include="Unity.InternalAPIEditorBridge.001">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.InternalAPIEditorBridge.001.dll</HintPath>
     </Reference>
@@ -1054,56 +1149,27 @@
     <Reference Include="Unity.2D.Common.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Common.Editor.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.RenderPipelines.Universal.Shaders">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.RenderPipelines.Universal.Shaders.dll</HintPath>
-    </Reference>
     <Reference Include="Unity.TextMeshPro.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.TextMeshPro.Editor.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.Searcher.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Searcher.Editor.dll</HintPath>
-    </Reference>
-    <Reference Include="Unity.VisualScripting.State">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.VisualScripting.State.dll</HintPath>
+    <Reference Include="Unity.Mathematics.Extensions">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Mathematics.Extensions.dll</HintPath>
     </Reference>
     <Reference Include="Unity.2D.Tilemap.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Tilemap.Editor.dll</HintPath>
     </Reference>
+    <Reference Include="Unity.Entities.Editor">
+      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.Entities.Editor.dll</HintPath>
+    </Reference>
     <Reference Include="Unity.2D.Animation.Editor">
       <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.Animation.Editor.dll</HintPath>
     </Reference>
-    <Reference Include="Unity.2D.IK.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.IK.Editor.dll</HintPath>
-    </Reference>
-    <Reference Include="Unity.2D.SpriteShape.Editor">
-      <HintPath>D:\unityProject\XY001\Library\ScriptAssemblies\Unity.2D.SpriteShape.Editor.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="UniRx.csproj">
-      <Project>{56f5be7b-33d9-e2a8-e913-507fd486ed71}</Project>
-      <Name>UniRx</Name>
-    </ProjectReference>
     <ProjectReference Include="Kybernetik.Animancer.FSM.csproj">
       <Project>{0ed4af61-7c5b-31d3-6459-8a6239a57f9a}</Project>
       <Name>Kybernetik.Animancer.FSM</Name>
     </ProjectReference>
-    <ProjectReference Include="Fort23.Core.csproj">
-      <Project>{445e7699-1039-047b-4806-470bcc01c6b3}</Project>
-      <Name>Fort23.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="NewAssembly.csproj">
-      <Project>{ef8f7edb-e142-c812-09c9-1efd42e75660}</Project>
-      <Name>NewAssembly</Name>
-    </ProjectReference>
-    <ProjectReference Include="Unity.AI.Navigation.csproj">
-      <Project>{6ec9c639-b54b-a18e-c822-0caa72f912e9}</Project>
-      <Name>Unity.AI.Navigation</Name>
-    </ProjectReference>
-    <ProjectReference Include="Kybernetik.Animancer.Editor.csproj">
-      <Project>{7ff57b24-3cdc-f1f3-965d-b7f88f25eba7}</Project>
-      <Name>Kybernetik.Animancer.Editor</Name>
-    </ProjectReference>
     <ProjectReference Include="StompyRobot.SRF.csproj">
       <Project>{6850a903-38e5-319b-70e9-1bbebfabf730}</Project>
       <Name>StompyRobot.SRF</Name>
@@ -1128,30 +1194,10 @@
       <Project>{fc3937b9-998a-f022-8329-db40273a9d7b}</Project>
       <Name>ThirdParty</Name>
     </ProjectReference>
-    <ProjectReference Include="Fort23.GameLogic.csproj">
-      <Project>{aa8b3008-7748-fe09-d0e8-e77da33c4943}</Project>
-      <Name>Fort23.GameLogic</Name>
-    </ProjectReference>
     <ProjectReference Include="Coffee.SoftMaskForUGUI.csproj">
       <Project>{1760b1d6-ee73-6a95-4a17-24bc21f6e8f8}</Project>
       <Name>Coffee.SoftMaskForUGUI</Name>
     </ProjectReference>
-    <ProjectReference Include="CodeStage.AFPSCounter.Editor.csproj">
-      <Project>{b2cf76b8-ee1d-c452-8c93-3c88f47c785b}</Project>
-      <Name>CodeStage.AFPSCounter.Editor</Name>
-    </ProjectReference>
-    <ProjectReference Include="Unity.AI.Navigation.Samples.csproj">
-      <Project>{c2199000-def0-facf-890c-7b0559fa37a3}</Project>
-      <Name>Unity.AI.Navigation.Samples</Name>
-    </ProjectReference>
-    <ProjectReference Include="Unity.AI.Navigation.Editor.ConversionSystem.csproj">
-      <Project>{f6528f8b-dbb4-84ed-ee55-12bcabff9780}</Project>
-      <Name>Unity.AI.Navigation.Editor.ConversionSystem</Name>
-    </ProjectReference>
-    <ProjectReference Include="CoreEditor.csproj">
-      <Project>{f10734e3-11fb-7644-3560-693b65970297}</Project>
-      <Name>CoreEditor</Name>
-    </ProjectReference>
     <ProjectReference Include="XNode.csproj">
       <Project>{27ef691a-f071-a1b3-5e1b-0e594da865c5}</Project>
       <Name>XNode</Name>
@@ -1168,6 +1214,10 @@
       <Project>{5f5b9cfa-a408-6622-a470-75aea4790283}</Project>
       <Name>GameTimeLine</Name>
     </ProjectReference>
+    <ProjectReference Include="GPUECSAnimationBakerSamples.csproj">
+      <Project>{df9a96d3-a901-392d-ea8d-d5bce0d75985}</Project>
+      <Name>GPUECSAnimationBakerSamples</Name>
+    </ProjectReference>
     <ProjectReference Include="Unity.AI.Navigation.Samples.Initialization.Editor.csproj">
       <Project>{220ede78-a995-1459-7c1e-d90e5cad0c9c}</Project>
       <Name>Unity.AI.Navigation.Samples.Initialization.Editor</Name>
@@ -1176,6 +1226,58 @@
       <Project>{4bd3b4ad-3b2c-a228-df65-5c58f3aacf30}</Project>
       <Name>StompyRobot.SRDebugger.Editor</Name>
     </ProjectReference>
+    <ProjectReference Include="CodeStage.AFPSCounter.Runtime.csproj">
+      <Project>{e69dd175-3705-64b7-6de3-d7bad627f6f5}</Project>
+      <Name>CodeStage.AFPSCounter.Runtime</Name>
+    </ProjectReference>
+    <ProjectReference Include="DownloadSystem.csproj">
+      <Project>{bcbcbf0b-c587-3257-d934-4f5bafbff086}</Project>
+      <Name>DownloadSystem</Name>
+    </ProjectReference>
+    <ProjectReference Include="UniRx.csproj">
+      <Project>{56f5be7b-33d9-e2a8-e913-507fd486ed71}</Project>
+      <Name>UniRx</Name>
+    </ProjectReference>
+    <ProjectReference Include="Fort23.Core.csproj">
+      <Project>{445e7699-1039-047b-4806-470bcc01c6b3}</Project>
+      <Name>Fort23.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="NewAssembly.csproj">
+      <Project>{ef8f7edb-e142-c812-09c9-1efd42e75660}</Project>
+      <Name>NewAssembly</Name>
+    </ProjectReference>
+    <ProjectReference Include="Unity.AI.Navigation.csproj">
+      <Project>{6ec9c639-b54b-a18e-c822-0caa72f912e9}</Project>
+      <Name>Unity.AI.Navigation</Name>
+    </ProjectReference>
+    <ProjectReference Include="Kybernetik.Animancer.Editor.csproj">
+      <Project>{7ff57b24-3cdc-f1f3-965d-b7f88f25eba7}</Project>
+      <Name>Kybernetik.Animancer.Editor</Name>
+    </ProjectReference>
+    <ProjectReference Include="GPUECSAnimationBakerEngine.csproj">
+      <Project>{4e427888-6063-b2e4-7133-1f5331d2804d}</Project>
+      <Name>GPUECSAnimationBakerEngine</Name>
+    </ProjectReference>
+    <ProjectReference Include="Fort23.GameLogic.csproj">
+      <Project>{aa8b3008-7748-fe09-d0e8-e77da33c4943}</Project>
+      <Name>Fort23.GameLogic</Name>
+    </ProjectReference>
+    <ProjectReference Include="CodeStage.AFPSCounter.Editor.csproj">
+      <Project>{b2cf76b8-ee1d-c452-8c93-3c88f47c785b}</Project>
+      <Name>CodeStage.AFPSCounter.Editor</Name>
+    </ProjectReference>
+    <ProjectReference Include="Unity.AI.Navigation.Samples.csproj">
+      <Project>{c2199000-def0-facf-890c-7b0559fa37a3}</Project>
+      <Name>Unity.AI.Navigation.Samples</Name>
+    </ProjectReference>
+    <ProjectReference Include="Unity.AI.Navigation.Editor.ConversionSystem.csproj">
+      <Project>{f6528f8b-dbb4-84ed-ee55-12bcabff9780}</Project>
+      <Name>Unity.AI.Navigation.Editor.ConversionSystem</Name>
+    </ProjectReference>
+    <ProjectReference Include="CoreEditor.csproj">
+      <Project>{f10734e3-11fb-7644-3560-693b65970297}</Project>
+      <Name>CoreEditor</Name>
+    </ProjectReference>
     <ProjectReference Include="Fort23.Mono.csproj">
       <Project>{8922979a-7100-3ac2-8b6d-b37f70a05dc5}</Project>
       <Name>Fort23.Mono</Name>
@@ -1192,10 +1294,6 @@
       <Project>{37f1f42e-8ca9-390b-4277-426936703ada}</Project>
       <Name>Fort23.GameData</Name>
     </ProjectReference>
-    <ProjectReference Include="CodeStage.AFPSCounter.Runtime.csproj">
-      <Project>{e69dd175-3705-64b7-6de3-d7bad627f6f5}</Project>
-      <Name>CodeStage.AFPSCounter.Runtime</Name>
-    </ProjectReference>
     <ProjectReference Include="Kybernetik.Animancer.csproj">
       <Project>{efb3aa66-4279-eaf4-280d-79e6d8ad1f40}</Project>
       <Name>Kybernetik.Animancer</Name>
@@ -1208,10 +1306,6 @@
       <Project>{82e3b869-9260-65b9-ff66-1cff0654fc3d}</Project>
       <Name>EnhancedHierarchyEditor</Name>
     </ProjectReference>
-    <ProjectReference Include="DownloadSystem.csproj">
-      <Project>{bcbcbf0b-c587-3257-d934-4f5bafbff086}</Project>
-      <Name>DownloadSystem</Name>
-    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

+ 8 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: WX4XtXykVXmkqdVKlQj7ZOQKWKGRvi+ktnhD2cgLpL/k5/1tX4LQohE=
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

Разлика између датотеке није приказан због своје велике величине
+ 50 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_AnimationMatricesTexture_Snakelet.asset


+ 8 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_AnimationMatricesTexture_Snakelet.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: DX9KsCyvAn+kYEeApSYYT6G+80XFBT2Kh8wH+1NzoYSc8oT57PCKSjs=
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2800000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 218 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_GpuEcsAnimator.prefab

@@ -0,0 +1,218 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &4573799512793257522
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 7
+  m_Component:
+  - component: {fileID: 7914018815068294423}
+  - component: {fileID: 2587504306462188448}
+  m_Layer: 0
+  m_HasEditorInfo: 1
+  m_Name: Guaiwu01_GpuEcsAnimator
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &7914018815068294423
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4573799512793257522}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 8476578454633010118}
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2587504306462188448
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4573799512793257522}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6dbd5b1412c14f19ba40d2188c5cd8c1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  totalNbrOfFrames: 222
+  nbrOfAttachmentAnchors: 0
+  animations:
+  - startFrameIndex: 0
+    nbrOfFramesPerSample: 61
+    nbrOfInBetweenSamples: 1
+    blendTimeCorrection: 1
+    startEventOccurenceId: 0
+    nbrOfEventOccurenceIds: 0
+    loop: 1
+    animationID: idle
+    stateName: idle
+  - startFrameIndex: 61
+    nbrOfFramesPerSample: 26
+    nbrOfInBetweenSamples: 1
+    blendTimeCorrection: 1
+    startEventOccurenceId: 0
+    nbrOfEventOccurenceIds: 0
+    loop: 0
+    animationID: BiteAttack
+    stateName: Bite Attack
+  - startFrameIndex: 87
+    nbrOfFramesPerSample: 31
+    nbrOfInBetweenSamples: 1
+    blendTimeCorrection: 1
+    startEventOccurenceId: 0
+    nbrOfEventOccurenceIds: 0
+    loop: 0
+    animationID: CastSpell
+    stateName: Cast Spell
+  - startFrameIndex: 118
+    nbrOfFramesPerSample: 41
+    nbrOfInBetweenSamples: 1
+    blendTimeCorrection: 1
+    startEventOccurenceId: 0
+    nbrOfEventOccurenceIds: 0
+    loop: 0
+    animationID: Die
+    stateName: Die
+  - startFrameIndex: 159
+    nbrOfFramesPerSample: 26
+    nbrOfInBetweenSamples: 1
+    blendTimeCorrection: 1
+    startEventOccurenceId: 0
+    nbrOfEventOccurenceIds: 0
+    loop: 0
+    animationID: Spawn
+    stateName: Spawn
+  - startFrameIndex: 185
+    nbrOfFramesPerSample: 11
+    nbrOfInBetweenSamples: 1
+    blendTimeCorrection: 1
+    startEventOccurenceId: 0
+    nbrOfEventOccurenceIds: 0
+    loop: 1
+    animationID: Underground
+    stateName: Underground
+  - startFrameIndex: 196
+    nbrOfFramesPerSample: 26
+    nbrOfInBetweenSamples: 1
+    blendTimeCorrection: 1
+    startEventOccurenceId: 0
+    nbrOfEventOccurenceIds: 0
+    loop: 1
+    animationID: run
+    stateName: run
+  animationEventOccurences: []
+  transformUsageFlags: 2
+  attachmentAnchorData: {fileID: 0}
+--- !u!1 &5949725885898124089
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 7
+  m_Component:
+  - component: {fileID: 8476578454633010118}
+  - component: {fileID: 5516422998436364662}
+  - component: {fileID: 540543588441176530}
+  - component: {fileID: 2359220822075819078}
+  m_Layer: 0
+  m_HasEditorInfo: 1
+  m_Name: Snakelet
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8476578454633010118
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5949725885898124089}
+  serializedVersion: 2
+  m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071068}
+  m_LocalPosition: {x: 3.7880957e-10, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 7914018815068294423}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &5516422998436364662
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5949725885898124089}
+  m_Mesh: {fileID: 4300000, guid: 71d66b7ab83b4be4296f04077623d138, type: 2}
+--- !u!23 &540543588441176530
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5949725885898124089}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_virtualGeometry: 0
+  m_virtualGeometryShadow: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: b8213b7c35d096447a65ba2e1db69416, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &2359220822075819078
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5949725885898124089}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: b927b9dfd6f248378c3364a809fda80f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  animator: {fileID: 2587504306462188448}
+  transformUsageFlags: 1

+ 7 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_GpuEcsAnimator.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: Wnge5i6tUCmAKNcV9bLHiE7BtLHEZ8HYrLU99/x6HzcoPqSSAvfs4Nk=
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 148 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Material_Snakelet.mat

@@ -0,0 +1,148 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Guaiwu01_Material_Snakelet
+  m_Shader: {fileID: -6465566751694194690, guid: de8b10515e8c7b6419b7a2e25ccbf055, type: 3}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 2
+  m_EnableInstancingVariants: 1
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AnimatedBoneMatrices:
+        m_Texture: {fileID: 2800000, guid: 25e562a4fef855446bd8af0f1c29e74a, type: 2}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _Base:
+        m_Texture: {fileID: 2800000, guid: 5b35f2382631bdf47ab344060737b580, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BaseMap:
+        m_Texture: {fileID: 2800000, guid: 8016c10e702af7d47ad02b98dee125c1, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 2800000, guid: a56254110c469a549acaf09f64f72258, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 8016c10e702af7d47ad02b98dee125c1, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _Normal:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnableAnimation: 1
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 1
+    - _Glossiness: 0
+    - _GlossyReflections: 1
+    - _Metallic: 0
+    - _Mode: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.02
+    - _QueueControl: 0
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 0
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _UVSec: 0
+    - _WorkflowMode: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 1, g: 1, b: 1, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 1, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
+  m_BuildTextureStacks: []
+--- !u!114 &4753996462854978707
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 7

+ 8 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Material_Snakelet.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: CXwcsSn/UnqH9aXilS+aTtYtgHToM4J/PntElikKghNSiphEy0aws+4=
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

Разлика између датотеке није приказан због своје велике величине
+ 358 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Mesh_Snakelet.mesh


+ 8 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/Guaiwu01_Mesh_Snakelet.mesh.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: CHtLsyz/VCpareuEfuQq7jGPcpjDkRjbsfMT3cGcLO2cQv0B3fTvTyU=
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 4300000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 133 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Material.mat

@@ -0,0 +1,133 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!114 &-1186038624752907090
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 7
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: New Material
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap:
+    RenderType: Opaque
+  disabledShaderPasses: []
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _WorkflowMode: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 1, g: 1, b: 1, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Material.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: XXIdtCn/VCit5o9+JEjCetlxuUU4qh2j1N/oFJ3EZUN7EQSR5hwRBng=
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1588 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Shader Graph.shadergraph

@@ -0,0 +1,1588 @@
+{
+    "m_SGVersion": 3,
+    "m_Type": "UnityEditor.ShaderGraph.GraphData",
+    "m_ObjectId": "fa7993d93ccf4044bac2fb086770b3fb",
+    "m_Properties": [
+        {
+            "m_Id": "0bc96dd897d94edc96ddb00dcfbfaf1e"
+        },
+        {
+            "m_Id": "7f50ff8bfc3b4312a279acbfc4f9bafe"
+        },
+        {
+            "m_Id": "7b76ffb2a6774006904e9279387b80b7"
+        },
+        {
+            "m_Id": "7c761b4aac614b64a412e13a97cab1cb"
+        }
+    ],
+    "m_Keywords": [],
+    "m_Dropdowns": [],
+    "m_CategoryData": [
+        {
+            "m_Id": "1736c8e266a245cca36387761bf399f5"
+        }
+    ],
+    "m_Nodes": [
+        {
+            "m_Id": "8dd49db3602246378ea79d952a2e384f"
+        },
+        {
+            "m_Id": "d7d48737659842829eefa67312b1d8a7"
+        },
+        {
+            "m_Id": "5075f32d2dc144909238e77320ce6662"
+        },
+        {
+            "m_Id": "b82a3950ce0142238cd8b51c86476494"
+        },
+        {
+            "m_Id": "97cfdafb50104cbe8e6dcee1f01c856a"
+        },
+        {
+            "m_Id": "ab38f92eb3884e5e9802f1628e73ac35"
+        },
+        {
+            "m_Id": "48481bc2415941059277170f6485273d"
+        },
+        {
+            "m_Id": "1852962867a541b8a186420590e9ff39"
+        },
+        {
+            "m_Id": "9e203e5ea4744693811643946573ea37"
+        },
+        {
+            "m_Id": "88bb864915b3428d87ae5d723d0cae19"
+        },
+        {
+            "m_Id": "4e9aba4aa4194d49bd9cda445f8b6fc9"
+        },
+        {
+            "m_Id": "c83ec0d26835443b9eff99acf8ebaa4b"
+        },
+        {
+            "m_Id": "d64fb3cad1fa4931bb6557c86e95ae25"
+        },
+        {
+            "m_Id": "686a1bf8142149c9978c83a9d4729ba4"
+        },
+        {
+            "m_Id": "498aa1b3aefb47c794c2cc86b30b9dca"
+        }
+    ],
+    "m_GroupDatas": [],
+    "m_StickyNoteDatas": [],
+    "m_Edges": [
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "498aa1b3aefb47c794c2cc86b30b9dca"
+                },
+                "m_SlotId": 0
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "686a1bf8142149c9978c83a9d4729ba4"
+                },
+                "m_SlotId": 1
+            }
+        },
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "4e9aba4aa4194d49bd9cda445f8b6fc9"
+                },
+                "m_SlotId": 0
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "88bb864915b3428d87ae5d723d0cae19"
+                },
+                "m_SlotId": -1805703276
+            }
+        },
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "686a1bf8142149c9978c83a9d4729ba4"
+                },
+                "m_SlotId": 0
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "b82a3950ce0142238cd8b51c86476494"
+                },
+                "m_SlotId": 0
+            }
+        },
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "88bb864915b3428d87ae5d723d0cae19"
+                },
+                "m_SlotId": 1
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "8dd49db3602246378ea79d952a2e384f"
+                },
+                "m_SlotId": 0
+            }
+        },
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "88bb864915b3428d87ae5d723d0cae19"
+                },
+                "m_SlotId": 2
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "d7d48737659842829eefa67312b1d8a7"
+                },
+                "m_SlotId": 0
+            }
+        },
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "88bb864915b3428d87ae5d723d0cae19"
+                },
+                "m_SlotId": 3
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "5075f32d2dc144909238e77320ce6662"
+                },
+                "m_SlotId": 0
+            }
+        },
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "c83ec0d26835443b9eff99acf8ebaa4b"
+                },
+                "m_SlotId": 0
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "88bb864915b3428d87ae5d723d0cae19"
+                },
+                "m_SlotId": -1310402938
+            }
+        },
+        {
+            "m_OutputSlot": {
+                "m_Node": {
+                    "m_Id": "d64fb3cad1fa4931bb6557c86e95ae25"
+                },
+                "m_SlotId": 0
+            },
+            "m_InputSlot": {
+                "m_Node": {
+                    "m_Id": "88bb864915b3428d87ae5d723d0cae19"
+                },
+                "m_SlotId": -1422710115
+            }
+        }
+    ],
+    "m_VertexContext": {
+        "m_Position": {
+            "x": 0.0,
+            "y": 0.0
+        },
+        "m_Blocks": [
+            {
+                "m_Id": "8dd49db3602246378ea79d952a2e384f"
+            },
+            {
+                "m_Id": "d7d48737659842829eefa67312b1d8a7"
+            },
+            {
+                "m_Id": "5075f32d2dc144909238e77320ce6662"
+            }
+        ]
+    },
+    "m_FragmentContext": {
+        "m_Position": {
+            "x": 0.0,
+            "y": 200.0
+        },
+        "m_Blocks": [
+            {
+                "m_Id": "b82a3950ce0142238cd8b51c86476494"
+            },
+            {
+                "m_Id": "97cfdafb50104cbe8e6dcee1f01c856a"
+            },
+            {
+                "m_Id": "ab38f92eb3884e5e9802f1628e73ac35"
+            },
+            {
+                "m_Id": "48481bc2415941059277170f6485273d"
+            },
+            {
+                "m_Id": "1852962867a541b8a186420590e9ff39"
+            },
+            {
+                "m_Id": "9e203e5ea4744693811643946573ea37"
+            }
+        ]
+    },
+    "m_PreviewData": {
+        "serializedMesh": {
+            "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}",
+            "m_Guid": ""
+        },
+        "preventRotation": false
+    },
+    "m_Path": "Shader Graphs",
+    "m_GraphPrecision": 1,
+    "m_PreviewMode": 2,
+    "m_OutputNode": {
+        "m_Id": ""
+    },
+    "m_SubDatas": [],
+    "m_ActiveTargets": [
+        {
+            "m_Id": "b9bc470419b7473cb04e2228f003f447"
+        }
+    ]
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "002b74f591a748349288ee5a4341366c",
+    "m_Id": 0,
+    "m_DisplayName": "Ambient Occlusion",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Occlusion",
+    "m_StageCapability": 2,
+    "m_Value": 1.0,
+    "m_DefaultValue": 1.0,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "0056b5744ab842b0b7c56dd87e63a264",
+    "m_Id": 0,
+    "m_DisplayName": "Metallic",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Metallic",
+    "m_StageCapability": 2,
+    "m_Value": 0.0,
+    "m_DefaultValue": 0.0,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty",
+    "m_ObjectId": "0bc96dd897d94edc96ddb00dcfbfaf1e",
+    "m_Guid": {
+        "m_GuidSerialized": "e13e76c4-7dd1-4024-b195-fa7661b00c3e"
+    },
+    "m_Name": "Base",
+    "m_DefaultRefNameVersion": 1,
+    "m_RefNameGeneratedByDisplayName": "Base",
+    "m_DefaultReferenceName": "_Base",
+    "m_OverrideReferenceName": "",
+    "m_GeneratePropertyBlock": true,
+    "m_UseCustomSlotLabel": false,
+    "m_CustomSlotLabel": "",
+    "m_DismissedVersion": 0,
+    "m_Precision": 0,
+    "overrideHLSLDeclaration": false,
+    "hlslDeclarationOverride": 0,
+    "m_Hidden": false,
+    "m_Priority": 10,
+    "m_Value": {
+        "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
+        "m_Guid": ""
+    },
+    "isMainTexture": false,
+    "useTilingAndOffset": false,
+    "m_Modifiable": true,
+    "m_DefaultType": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot",
+    "m_ObjectId": "0d378f0dcb504b61b41ce16cde9f6333",
+    "m_Id": 1,
+    "m_DisplayName": "Texture",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Texture",
+    "m_StageCapability": 3,
+    "m_BareResource": false,
+    "m_Texture": {
+        "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
+        "m_Guid": ""
+    },
+    "m_DefaultType": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot",
+    "m_ObjectId": "13eb5c9beb5d47008e325ac1ed62858b",
+    "m_Id": 1,
+    "m_DisplayName": "position",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "position",
+    "m_StageCapability": 3,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.CategoryData",
+    "m_ObjectId": "1736c8e266a245cca36387761bf399f5",
+    "m_Name": "",
+    "m_ChildObjectList": [
+        {
+            "m_Id": "7c761b4aac614b64a412e13a97cab1cb"
+        },
+        {
+            "m_Id": "7b76ffb2a6774006904e9279387b80b7"
+        },
+        {
+            "m_Id": "7f50ff8bfc3b4312a279acbfc4f9bafe"
+        },
+        {
+            "m_Id": "0bc96dd897d94edc96ddb00dcfbfaf1e"
+        }
+    ]
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "1852962867a541b8a186420590e9ff39",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "SurfaceDescription.Emission",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "652351f5ba58413f92e7eff1f80f3723"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "SurfaceDescription.Emission"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "19925741aae54687a64dbef3153a3143",
+    "m_Id": 0,
+    "m_DisplayName": "EnableAnimation",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Out",
+    "m_StageCapability": 3,
+    "m_Value": 0.0,
+    "m_DefaultValue": 0.0,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot",
+    "m_ObjectId": "1fdbd7c65fa54cf48f7979c97666ecdb",
+    "m_Id": 0,
+    "m_DisplayName": "Normal",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Normal",
+    "m_StageCapability": 1,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": [],
+    "m_Space": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Matrix4MaterialSlot",
+    "m_ObjectId": "2590eb1910ef43f0a52838d582a21165",
+    "m_Id": 0,
+    "m_DisplayName": "AnimationState",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Out",
+    "m_StageCapability": 3,
+    "m_Value": {
+        "e00": 1.0,
+        "e01": 0.0,
+        "e02": 0.0,
+        "e03": 0.0,
+        "e10": 0.0,
+        "e11": 1.0,
+        "e12": 0.0,
+        "e13": 0.0,
+        "e20": 0.0,
+        "e21": 0.0,
+        "e22": 1.0,
+        "e23": 0.0,
+        "e30": 0.0,
+        "e31": 0.0,
+        "e32": 0.0,
+        "e33": 1.0
+    },
+    "m_DefaultValue": {
+        "e00": 1.0,
+        "e01": 0.0,
+        "e02": 0.0,
+        "e03": 0.0,
+        "e10": 0.0,
+        "e11": 1.0,
+        "e12": 0.0,
+        "e13": 0.0,
+        "e20": 0.0,
+        "e21": 0.0,
+        "e22": 1.0,
+        "e23": 0.0,
+        "e30": 0.0,
+        "e31": 0.0,
+        "e32": 0.0,
+        "e33": 1.0
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot",
+    "m_ObjectId": "2fd2f054aa784f189fba127a20057429",
+    "m_Id": 2,
+    "m_DisplayName": "UV",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "UV",
+    "m_StageCapability": 3,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0
+    },
+    "m_Labels": [],
+    "m_Channel": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot",
+    "m_ObjectId": "316e424f5a3143eeae0e80395eb5c263",
+    "m_Id": 0,
+    "m_DisplayName": "RGBA",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "RGBA",
+    "m_StageCapability": 2,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0,
+        "w": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0,
+        "w": 0.0
+    },
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot",
+    "m_ObjectId": "389cf6252851422aa9970102289a3726",
+    "m_Id": 0,
+    "m_DisplayName": "Position",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Position",
+    "m_StageCapability": 1,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": [],
+    "m_Space": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "3d8caf601dd84f43aabaf66552c3a367",
+    "m_Id": -1422710115,
+    "m_DisplayName": "EnableAnimation",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "_EnableAnimation",
+    "m_StageCapability": 3,
+    "m_Value": 0.0,
+    "m_DefaultValue": 0.0,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot",
+    "m_ObjectId": "4823b7674d6f434e8e53c2ff0794b476",
+    "m_Id": 0,
+    "m_DisplayName": "AnimatedBoneMatrices",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Out",
+    "m_StageCapability": 3,
+    "m_BareResource": false
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "48481bc2415941059277170f6485273d",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "SurfaceDescription.Smoothness",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "5af9851298c24388b2b8158f38a35c36"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "SurfaceDescription.Smoothness"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.PropertyNode",
+    "m_ObjectId": "498aa1b3aefb47c794c2cc86b30b9dca",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "Property",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": -488.9999694824219,
+            "y": 280.0000305175781,
+            "width": 110.0,
+            "height": 34.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "7aea2ed2b8f2472590f4920bcf159f25"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_Property": {
+        "m_Id": "0bc96dd897d94edc96ddb00dcfbfaf1e"
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot",
+    "m_ObjectId": "4d6b00d2c8e04502915bd5fbb0b60466",
+    "m_Id": 2,
+    "m_DisplayName": "normal",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "normal",
+    "m_StageCapability": 3,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.PropertyNode",
+    "m_ObjectId": "4e9aba4aa4194d49bd9cda445f8b6fc9",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "Property",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": -539.0,
+            "y": 78.0000228881836,
+            "width": 160.0,
+            "height": 33.999977111816409
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "2590eb1910ef43f0a52838d582a21165"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_Property": {
+        "m_Id": "7f50ff8bfc3b4312a279acbfc4f9bafe"
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "5075f32d2dc144909238e77320ce6662",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "VertexDescription.Tangent",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "ba03cc2f78dc4a9aa3f05d7e9ab445ce"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "VertexDescription.Tangent"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "5af9851298c24388b2b8158f38a35c36",
+    "m_Id": 0,
+    "m_DisplayName": "Smoothness",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Smoothness",
+    "m_StageCapability": 2,
+    "m_Value": 0.5,
+    "m_DefaultValue": 0.5,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot",
+    "m_ObjectId": "652351f5ba58413f92e7eff1f80f3723",
+    "m_Id": 0,
+    "m_DisplayName": "Emission",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Emission",
+    "m_StageCapability": 2,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": [],
+    "m_ColorMode": 1,
+    "m_DefaultColor": {
+        "r": 0.0,
+        "g": 0.0,
+        "b": 0.0,
+        "a": 1.0
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode",
+    "m_ObjectId": "686a1bf8142149c9978c83a9d4729ba4",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "Sample Texture 2D",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": -316.9999694824219,
+            "y": 267.0,
+            "width": 183.0,
+            "height": 250.99993896484376
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "316e424f5a3143eeae0e80395eb5c263"
+        },
+        {
+            "m_Id": "c221c2b261344460bc2f946b8b1f53f7"
+        },
+        {
+            "m_Id": "d7e476fe82a44f4e9a868b764bb3de56"
+        },
+        {
+            "m_Id": "eea3c22eaf9d4ce8b2348b9c016ed34c"
+        },
+        {
+            "m_Id": "b9418799810d41f5af1e931fdd16ced0"
+        },
+        {
+            "m_Id": "0d378f0dcb504b61b41ce16cde9f6333"
+        },
+        {
+            "m_Id": "2fd2f054aa784f189fba127a20057429"
+        },
+        {
+            "m_Id": "68db95ca468d4facb4b8122d222ea05e"
+        }
+    ],
+    "synonyms": [
+        "tex2d"
+    ],
+    "m_Precision": 0,
+    "m_PreviewExpanded": false,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_TextureType": 0,
+    "m_NormalMapSpace": 0,
+    "m_EnableGlobalMipBias": true,
+    "m_MipSamplingMode": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot",
+    "m_ObjectId": "689481869dc24217a4094930f29af155",
+    "m_Id": 0,
+    "m_DisplayName": "Normal (Tangent Space)",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "NormalTS",
+    "m_StageCapability": 2,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": [],
+    "m_Space": 3
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot",
+    "m_ObjectId": "68db95ca468d4facb4b8122d222ea05e",
+    "m_Id": 3,
+    "m_DisplayName": "Sampler",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Sampler",
+    "m_StageCapability": 3,
+    "m_BareResource": false
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Matrix4MaterialSlot",
+    "m_ObjectId": "708aca92192c40eeab1aa64a4acf72e2",
+    "m_Id": -1805703276,
+    "m_DisplayName": "AnimationState",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "_AnimationState",
+    "m_StageCapability": 3,
+    "m_Value": {
+        "e00": 1.0,
+        "e01": 0.0,
+        "e02": 0.0,
+        "e03": 0.0,
+        "e10": 0.0,
+        "e11": 1.0,
+        "e12": 0.0,
+        "e13": 0.0,
+        "e20": 0.0,
+        "e21": 0.0,
+        "e22": 1.0,
+        "e23": 0.0,
+        "e30": 0.0,
+        "e31": 0.0,
+        "e32": 0.0,
+        "e33": 1.0
+    },
+    "m_DefaultValue": {
+        "e00": 1.0,
+        "e01": 0.0,
+        "e02": 0.0,
+        "e03": 0.0,
+        "e10": 0.0,
+        "e11": 1.0,
+        "e12": 0.0,
+        "e13": 0.0,
+        "e20": 0.0,
+        "e21": 0.0,
+        "e22": 1.0,
+        "e23": 0.0,
+        "e30": 0.0,
+        "e31": 0.0,
+        "e32": 0.0,
+        "e33": 1.0
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot",
+    "m_ObjectId": "7aea2ed2b8f2472590f4920bcf159f25",
+    "m_Id": 0,
+    "m_DisplayName": "Base",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Out",
+    "m_StageCapability": 3,
+    "m_BareResource": false
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty",
+    "m_ObjectId": "7b76ffb2a6774006904e9279387b80b7",
+    "m_Guid": {
+        "m_GuidSerialized": "16cb0c95-a07b-4532-b767-0222fa0ce89e"
+    },
+    "m_Name": "AnimatedBoneMatrices",
+    "m_DefaultRefNameVersion": 1,
+    "m_RefNameGeneratedByDisplayName": "AnimatedBoneMatrices",
+    "m_DefaultReferenceName": "_AnimatedBoneMatrices",
+    "m_OverrideReferenceName": "",
+    "m_GeneratePropertyBlock": true,
+    "m_UseCustomSlotLabel": false,
+    "m_CustomSlotLabel": "",
+    "m_DismissedVersion": 0,
+    "m_Precision": 0,
+    "overrideHLSLDeclaration": false,
+    "hlslDeclarationOverride": 2,
+    "m_Hidden": false,
+    "m_Priority": 10,
+    "m_Value": {
+        "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
+        "m_Guid": ""
+    },
+    "isMainTexture": false,
+    "useTilingAndOffset": false,
+    "m_Modifiable": true,
+    "m_DefaultType": 0
+}
+
+{
+    "m_SGVersion": 1,
+    "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty",
+    "m_ObjectId": "7c761b4aac614b64a412e13a97cab1cb",
+    "m_Guid": {
+        "m_GuidSerialized": "9605ca1d-9b2a-490e-9fb8-95fc4cefc4ac"
+    },
+    "m_Name": "EnableAnimation",
+    "m_DefaultRefNameVersion": 1,
+    "m_RefNameGeneratedByDisplayName": "EnableAnimation",
+    "m_DefaultReferenceName": "_EnableAnimation",
+    "m_OverrideReferenceName": "",
+    "m_GeneratePropertyBlock": true,
+    "m_UseCustomSlotLabel": false,
+    "m_CustomSlotLabel": "",
+    "m_DismissedVersion": 0,
+    "m_Precision": 0,
+    "overrideHLSLDeclaration": true,
+    "hlslDeclarationOverride": 3,
+    "m_Hidden": false,
+    "m_Priority": 10,
+    "m_Value": 0.0,
+    "m_FloatType": 0,
+    "m_RangeValues": {
+        "x": 0.0,
+        "y": 1.0
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot",
+    "m_ObjectId": "7d129590403d4d3dad0b7a809df3c090",
+    "m_Id": 0,
+    "m_DisplayName": "Base Color",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "BaseColor",
+    "m_StageCapability": 2,
+    "m_Value": {
+        "x": 0.5,
+        "y": 0.5,
+        "z": 0.5
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": [],
+    "m_ColorMode": 0,
+    "m_DefaultColor": {
+        "r": 0.5,
+        "g": 0.5,
+        "b": 0.5,
+        "a": 1.0
+    }
+}
+
+{
+    "m_SGVersion": 2,
+    "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalLitSubTarget",
+    "m_ObjectId": "7da9d70cd7d64fa49b36d112767b3731",
+    "m_WorkflowMode": 1,
+    "m_NormalDropOffSpace": 0,
+    "m_ClearCoat": false,
+    "m_BlendModePreserveSpecular": true
+}
+
+{
+    "m_SGVersion": 1,
+    "m_Type": "UnityEditor.ShaderGraph.Matrix4ShaderProperty",
+    "m_ObjectId": "7f50ff8bfc3b4312a279acbfc4f9bafe",
+    "m_Guid": {
+        "m_GuidSerialized": "1bf07701-4ef2-4ac5-9415-ff185dd83aa4"
+    },
+    "m_Name": "AnimationState",
+    "m_DefaultRefNameVersion": 1,
+    "m_RefNameGeneratedByDisplayName": "AnimationState",
+    "m_DefaultReferenceName": "_AnimationState",
+    "m_OverrideReferenceName": "",
+    "m_GeneratePropertyBlock": false,
+    "m_UseCustomSlotLabel": false,
+    "m_CustomSlotLabel": "",
+    "m_DismissedVersion": 0,
+    "m_Precision": 0,
+    "overrideHLSLDeclaration": true,
+    "hlslDeclarationOverride": 3,
+    "m_Hidden": false,
+    "m_Priority": 10,
+    "m_Value": {
+        "e00": 1.0,
+        "e01": 0.0,
+        "e02": 0.0,
+        "e03": 0.0,
+        "e10": 0.0,
+        "e11": 1.0,
+        "e12": 0.0,
+        "e13": 0.0,
+        "e20": 0.0,
+        "e21": 0.0,
+        "e22": 1.0,
+        "e23": 0.0,
+        "e30": 0.0,
+        "e31": 0.0,
+        "e32": 0.0,
+        "e33": 1.0
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot",
+    "m_ObjectId": "82787e55a37445b0bd6ceda6a0a2e829",
+    "m_Id": 3,
+    "m_DisplayName": "tangent",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "tangent",
+    "m_StageCapability": 3,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.SubGraphNode",
+    "m_ObjectId": "88bb864915b3428d87ae5d723d0cae19",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "GpuEcsAnimator",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": -371.0,
+            "y": -112.0,
+            "width": 273.0,
+            "height": 143.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "3d8caf601dd84f43aabaf66552c3a367"
+        },
+        {
+            "m_Id": "999f7bb4061441e080dc5c47bd98c302"
+        },
+        {
+            "m_Id": "708aca92192c40eeab1aa64a4acf72e2"
+        },
+        {
+            "m_Id": "13eb5c9beb5d47008e325ac1ed62858b"
+        },
+        {
+            "m_Id": "4d6b00d2c8e04502915bd5fbb0b60466"
+        },
+        {
+            "m_Id": "82787e55a37445b0bd6ceda6a0a2e829"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": false,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedSubGraph": "{\n    \"subGraph\": {\n        \"fileID\": -5475051401550479605,\n        \"guid\": \"7ab285417ae253147953173b02b67332\",\n        \"type\": 3\n    }\n}",
+    "m_PropertyGuids": [
+        "2fd9725d-bca6-4787-a864-b565314b6535",
+        "a2609a09-bfa0-4ed5-b15b-b1349ea8e069",
+        "a3a0d3de-db02-4585-b3bc-40c1fb933ab3",
+        "0ed558c8-a80e-4d2f-afcf-d33bf4151ad3"
+    ],
+    "m_PropertyIds": [
+        948887906,
+        -1310402938,
+        -1805703276,
+        -1422710115
+    ],
+    "m_Dropdowns": [],
+    "m_DropdownSelectedEntries": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "8dd49db3602246378ea79d952a2e384f",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "VertexDescription.Position",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "389cf6252851422aa9970102289a3726"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "VertexDescription.Position"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "97cfdafb50104cbe8e6dcee1f01c856a",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "SurfaceDescription.NormalTS",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "689481869dc24217a4094930f29af155"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "SurfaceDescription.NormalTS"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot",
+    "m_ObjectId": "999f7bb4061441e080dc5c47bd98c302",
+    "m_Id": -1310402938,
+    "m_DisplayName": "AnimatedBoneMatrices",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "_AnimatedBoneMatrices",
+    "m_StageCapability": 3,
+    "m_BareResource": false,
+    "m_Texture": {
+        "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}",
+        "m_Guid": ""
+    },
+    "m_DefaultType": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "9e203e5ea4744693811643946573ea37",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "SurfaceDescription.Occlusion",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "002b74f591a748349288ee5a4341366c"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "SurfaceDescription.Occlusion"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "ab38f92eb3884e5e9802f1628e73ac35",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "SurfaceDescription.Metallic",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "0056b5744ab842b0b7c56dd87e63a264"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "SurfaceDescription.Metallic"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "b82a3950ce0142238cd8b51c86476494",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "SurfaceDescription.BaseColor",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "7d129590403d4d3dad0b7a809df3c090"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "SurfaceDescription.BaseColor"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "b9418799810d41f5af1e931fdd16ced0",
+    "m_Id": 7,
+    "m_DisplayName": "A",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "A",
+    "m_StageCapability": 2,
+    "m_Value": 0.0,
+    "m_DefaultValue": 0.0,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 1,
+    "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget",
+    "m_ObjectId": "b9bc470419b7473cb04e2228f003f447",
+    "m_Datas": [],
+    "m_ActiveSubTarget": {
+        "m_Id": "7da9d70cd7d64fa49b36d112767b3731"
+    },
+    "m_AllowMaterialOverride": false,
+    "m_SurfaceType": 0,
+    "m_ZTestMode": 4,
+    "m_ZWriteControl": 0,
+    "m_AlphaMode": 0,
+    "m_RenderFace": 2,
+    "m_AlphaClip": false,
+    "m_CastShadows": true,
+    "m_ReceiveShadows": true,
+    "m_SupportsLODCrossFade": false,
+    "m_CustomEditorGUI": "",
+    "m_SupportVFX": false
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot",
+    "m_ObjectId": "ba03cc2f78dc4a9aa3f05d7e9ab445ce",
+    "m_Id": 0,
+    "m_DisplayName": "Tangent",
+    "m_SlotType": 0,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "Tangent",
+    "m_StageCapability": 1,
+    "m_Value": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_DefaultValue": {
+        "x": 0.0,
+        "y": 0.0,
+        "z": 0.0
+    },
+    "m_Labels": [],
+    "m_Space": 0
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "c221c2b261344460bc2f946b8b1f53f7",
+    "m_Id": 4,
+    "m_DisplayName": "R",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "R",
+    "m_StageCapability": 2,
+    "m_Value": 0.0,
+    "m_DefaultValue": 0.0,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.PropertyNode",
+    "m_ObjectId": "c83ec0d26835443b9eff99acf8ebaa4b",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "Property",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": -861.0000610351563,
+            "y": 112.0,
+            "width": 205.00006103515626,
+            "height": 34.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "4823b7674d6f434e8e53c2ff0794b476"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_Property": {
+        "m_Id": "7b76ffb2a6774006904e9279387b80b7"
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.PropertyNode",
+    "m_ObjectId": "d64fb3cad1fa4931bb6557c86e95ae25",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "Property",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": -736.521728515625,
+            "y": -5.217385292053223,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "19925741aae54687a64dbef3153a3143"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_Property": {
+        "m_Id": "7c761b4aac614b64a412e13a97cab1cb"
+    }
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.BlockNode",
+    "m_ObjectId": "d7d48737659842829eefa67312b1d8a7",
+    "m_Group": {
+        "m_Id": ""
+    },
+    "m_Name": "VertexDescription.Normal",
+    "m_DrawState": {
+        "m_Expanded": true,
+        "m_Position": {
+            "serializedVersion": "2",
+            "x": 0.0,
+            "y": 0.0,
+            "width": 0.0,
+            "height": 0.0
+        }
+    },
+    "m_Slots": [
+        {
+            "m_Id": "1fdbd7c65fa54cf48f7979c97666ecdb"
+        }
+    ],
+    "synonyms": [],
+    "m_Precision": 0,
+    "m_PreviewExpanded": true,
+    "m_DismissedVersion": 0,
+    "m_PreviewMode": 0,
+    "m_CustomColors": {
+        "m_SerializableColors": []
+    },
+    "m_SerializedDescriptor": "VertexDescription.Normal"
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "d7e476fe82a44f4e9a868b764bb3de56",
+    "m_Id": 5,
+    "m_DisplayName": "G",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "G",
+    "m_StageCapability": 2,
+    "m_Value": 0.0,
+    "m_DefaultValue": 0.0,
+    "m_Labels": []
+}
+
+{
+    "m_SGVersion": 0,
+    "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
+    "m_ObjectId": "eea3c22eaf9d4ce8b2348b9c016ed34c",
+    "m_Id": 6,
+    "m_DisplayName": "B",
+    "m_SlotType": 1,
+    "m_Hidden": false,
+    "m_ShaderOutputName": "B",
+    "m_StageCapability": 2,
+    "m_Value": 0.0,
+    "m_DefaultValue": 0.0,
+    "m_Labels": []
+}
+

+ 10 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/New Shader Graph.shadergraph.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: DHIZ5iP5AnL+SOrpDHK8NcLcfF2fvNYHaGiLNegqGay10YQCxKj+Ctg=
+ScriptedImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 2
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
+  script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3}

+ 55 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/NewUnlitShader.shader

@@ -0,0 +1,55 @@
+Shader "Custom/SimplestInstancedShader"
+{
+    Properties
+    {
+        _Color ("Color", Color) = (1, 1, 1, 1)
+    }
+
+    SubShader
+    {
+        Tags { "RenderType"="Opaque" }
+        LOD 100
+
+        Pass
+        {
+            CGPROGRAM
+            #pragma vertex vert
+            #pragma fragment frag
+            #pragma multi_compile_instancing
+            #include "UnityCG.cginc"
+
+            struct appdata
+            {
+                float4 vertex : POSITION;
+                UNITY_VERTEX_INPUT_INSTANCE_ID
+            };
+
+            struct v2f
+            {
+                float4 vertex : SV_POSITION;
+                UNITY_VERTEX_INPUT_INSTANCE_ID // use this to access instanced properties in the fragment shader.
+            };
+
+            UNITY_INSTANCING_BUFFER_START(Props)
+                UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
+            UNITY_INSTANCING_BUFFER_END(Props)
+
+            v2f vert(appdata v)
+            {
+                v2f o;
+
+                UNITY_SETUP_INSTANCE_ID(v);
+                UNITY_TRANSFER_INSTANCE_ID(v, o);
+                o.vertex = UnityObjectToClipPos(v.vertex);
+                return o;
+            }
+
+            fixed4 frag(v2f i) : SV_Target
+            {
+                UNITY_SETUP_INSTANCE_ID(i);
+                return UNITY_ACCESS_INSTANCED_PROP(Props, _Color);
+            }
+            ENDCG
+        }
+    }
+}

+ 9 - 0
Assets/Art/ArtHero/BakedAssets_Guaiwu01/NewUnlitShader.shader.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: Cy5Kt3yvASn03BIUSebCNQ66VvBzKLMB9LTf9+NOANCYDwQxXn0UQ+k=
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 150 - 1
Assets/Art/ArtHero/Guaiwu01.prefab

@@ -1277,6 +1277,7 @@ GameObject:
   - component: {fileID: 3012581834444235609}
   - component: {fileID: 3937025198469130874}
   - component: {fileID: -2389684715378374559}
+  - component: {fileID: -8725904427751630163}
   m_Layer: 0
   m_HasEditorInfo: 1
   m_Name: Guaiwu01
@@ -1328,7 +1329,7 @@ Animator:
   m_GameObject: {fileID: 7636340872322017040}
   m_Enabled: 1
   m_Avatar: {fileID: 9000000, guid: 0b080fb945711ae47abb40495a599b9b, type: 3}
-  m_Controller: {fileID: 0}
+  m_Controller: {fileID: 9100000, guid: 965d15d735575274896b1aca47c37250, type: 2}
   m_CullingMode: 1
   m_UpdateMode: 0
   m_ApplyRootMotion: 0
@@ -1456,6 +1457,154 @@ BoxCollider:
   serializedVersion: 3
   m_Size: {x: 1, y: 1.5, z: 1}
   m_Center: {x: 0, y: 0.7, z: 0}
+--- !u!114 &-8725904427751630163
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7636340872322017040}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6e861cd728fd49b69e30e17bd76642da, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  bakerData:
+    animations:
+    - animationID: idle
+      animatorStateName: idle
+      animationType: 0
+      singleClipData:
+        animationClip: {fileID: 7400000, guid: 211c387469166a94a8231490d3329181, type: 3}
+      dualClipBlendData:
+        blendParameterName: 
+        clip1:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        clip2:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        nbrOfInBetweenSamples: 0
+      loop: 1
+      additionalAnimatorParameterValues: []
+      additionalAnimatorStatesPerLayer: []
+    - animationID: BiteAttack
+      animatorStateName: Bite Attack
+      animationType: 0
+      singleClipData:
+        animationClip: {fileID: 7400000, guid: 6914c74b218b2044ea2c463ae289d898, type: 3}
+      dualClipBlendData:
+        blendParameterName: 
+        clip1:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        clip2:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        nbrOfInBetweenSamples: 0
+      loop: 0
+      additionalAnimatorParameterValues: []
+      additionalAnimatorStatesPerLayer: []
+    - animationID: CastSpell
+      animatorStateName: Cast Spell
+      animationType: 0
+      singleClipData:
+        animationClip: {fileID: 7400000, guid: e40f0b936e6f87b49adffb816a83f69c, type: 3}
+      dualClipBlendData:
+        blendParameterName: 
+        clip1:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        clip2:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        nbrOfInBetweenSamples: 0
+      loop: 0
+      additionalAnimatorParameterValues: []
+      additionalAnimatorStatesPerLayer: []
+    - animationID: Die
+      animatorStateName: Die
+      animationType: 0
+      singleClipData:
+        animationClip: {fileID: 7400000, guid: c1694ad78d2b8ca4fa7d27c700415665, type: 3}
+      dualClipBlendData:
+        blendParameterName: 
+        clip1:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        clip2:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        nbrOfInBetweenSamples: 0
+      loop: 0
+      additionalAnimatorParameterValues: []
+      additionalAnimatorStatesPerLayer: []
+    - animationID: Spawn
+      animatorStateName: Spawn
+      animationType: 0
+      singleClipData:
+        animationClip: {fileID: 7400000, guid: 3851dd3b76e86f84ca990b222a770ff0, type: 3}
+      dualClipBlendData:
+        blendParameterName: 
+        clip1:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        clip2:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        nbrOfInBetweenSamples: 0
+      loop: 0
+      additionalAnimatorParameterValues: []
+      additionalAnimatorStatesPerLayer: []
+    - animationID: Underground
+      animatorStateName: Underground
+      animationType: 0
+      singleClipData:
+        animationClip: {fileID: 7400000, guid: 3c755deea655c7d4190f226792da5189, type: 3}
+      dualClipBlendData:
+        blendParameterName: 
+        clip1:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        clip2:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        nbrOfInBetweenSamples: 0
+      loop: 1
+      additionalAnimatorParameterValues: []
+      additionalAnimatorStatesPerLayer: []
+    - animationID: run
+      animatorStateName: run
+      animationType: 0
+      singleClipData:
+        animationClip: {fileID: 7400000, guid: e9e97ff4e8a989e47af733dafd080787, type: 3}
+      dualClipBlendData:
+        blendParameterName: 
+        clip1:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        clip2:
+          parameterValue: 0
+          animationClip: {fileID: 0}
+        nbrOfInBetweenSamples: 0
+      loop: 1
+      additionalAnimatorParameterValues: []
+      additionalAnimatorStatesPerLayer: []
+    generateAnimationIdsEnum: 0
+    animationIdsEnumName: 
+    usePredefinedAnimationEventIds: 0
+    predefinedAnimationEventIds: []
+    generateAnimationEventIdsEnum: 0
+    animationEventIdsEnumName: 
+    attachmentAnchors: []
+    generateAttachmentAnchorIdsEnum: 0
+    attachmentAnchorIdsEnumName: 
+    boneUsage:
+      numberOfBonesPerVertex: 6
+      boneUsagesPerLoD: []
+    transformUsageFlagsParent: 2
+    transformUsageFlagsChildren: 1
+  gpuEcsAnimator: {fileID: 4573799512793257522, guid: e21c403bf42561e47844837b065cd211, type: 3}
 --- !u!1 &7750704757169647667
 GameObject:
   m_ObjectHideFlags: 0

+ 203 - 0
Assets/Art/ArtHero/Guaiwu01_gpu.prefab

@@ -0,0 +1,203 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &1486648135052072193
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 7
+  m_Component:
+  - component: {fileID: 2254773846348706746}
+  - component: {fileID: 7626962916459775227}
+  - component: {fileID: 4408512263679554551}
+  - component: {fileID: 4770066491419026642}
+  m_Layer: 0
+  m_HasEditorInfo: 1
+  m_Name: Guaiwu01_gpu
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2254773846348706746
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1486648135052072193}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -1.93, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 8460209264768730837}
+  - {fileID: 1187023392652981393}
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!54 &7626962916459775227
+Rigidbody:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1486648135052072193}
+  serializedVersion: 4
+  m_Mass: 1
+  m_Drag: 0
+  m_AngularDrag: 0.05
+  m_CenterOfMass: {x: 0, y: 0, z: 0}
+  m_InertiaTensor: {x: 1, y: 1, z: 1}
+  m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ImplicitCom: 1
+  m_ImplicitTensor: 1
+  m_UseGravity: 1
+  m_IsKinematic: 1
+  m_Interpolate: 0
+  m_Constraints: 0
+  m_CollisionDetection: 0
+--- !u!195 &4408512263679554551
+NavMeshAgent:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1486648135052072193}
+  m_Enabled: 1
+  m_AgentTypeID: 0
+  m_Radius: 0.21
+  m_Speed: 3.5
+  m_Acceleration: 8
+  avoidancePriority: 50
+  m_AngularSpeed: 720
+  m_StoppingDistance: 0.5
+  m_AutoTraverseOffMeshLink: 1
+  m_AutoBraking: 0
+  m_AutoRepath: 1
+  m_Height: 0.8
+  m_BaseOffset: 0
+  m_WalkableMask: 4294967295
+  m_ObstacleAvoidanceType: 4
+--- !u!65 &4770066491419026642
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1486648135052072193}
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_IsTrigger: 0
+  m_ProvidesContacts: 0
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Size: {x: 1, y: 1.5, z: 1}
+  m_Center: {x: 0, y: 0.7, z: 0}
+--- !u!1 &6192587680073998837
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 7
+  m_Component:
+  - component: {fileID: 1187023392652981393}
+  m_Layer: 0
+  m_HasEditorInfo: 1
+  m_Name: hp
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1187023392652981393
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6192587680073998837}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0.887, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2254773846348706746}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1782455331161705410
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 2254773846348706746}
+    m_Modifications:
+    - target: {fileID: 4573799512793257522, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_Name
+      value: Guaiwu01_GpuEcsAnimator
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: e21c403bf42561e47844837b065cd211, type: 3}
+--- !u!4 &8460209264768730837 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 7914018815068294423, guid: e21c403bf42561e47844837b065cd211, type: 3}
+  m_PrefabInstance: {fileID: 1782455331161705410}
+  m_PrefabAsset: {fileID: 0}

+ 7 - 0
Assets/Art/ArtHero/Guaiwu01_gpu.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: Di5LvCj5B3t6RKd9eLEYXzioVXHRcz2fhe/vUl15Ngjy08SRuyhS9E8=
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 4 - 4
Assets/Art/ArtHero/Hero01.prefab

@@ -1317,7 +1317,7 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 8757718509614773201}
-  - {fileID: 5627414565518055934}
+  - {fileID: 7566020738624306134}
   - {fileID: 415251543991681821}
   - {fileID: 8736251462846803421}
   - {fileID: 8340789751788628656}
@@ -1742,7 +1742,7 @@ PlayableDirector:
     - be3e33a009c3ff24894e4ebe1ec8490d: {fileID: 2511492103188014007}
     - 2e6796201e865d04db2e7bf812135ea5: {fileID: 5992122126348811026}
     - e836fb53612872a49839c893989484ec: {fileID: 5992122126348811026}
-    - a6e39837ed40d02448563fb61242b8cf: {fileID: 5850122976263328200}
+    - a6e39837ed40d02448563fb61242b8cf: {fileID: 8631359410270532576}
     - 80c008be55c4b034eb34f61e14b1430b: {fileID: 7555816414614547790}
     - b8a4b80f4bfab4042bc03e8d9890d7b3: {fileID: 4663576026881546776}
     - 34a4ee039b2676d4b9b45b9d0abef84f: {fileID: 7555816414614547790}
@@ -2514,12 +2514,12 @@ PrefabInstance:
     m_AddedGameObjects: []
     m_AddedComponents: []
   m_SourcePrefab: {fileID: 100100000, guid: 26368eb523c2a4246a25272fb53fb446, type: 3}
---- !u!4 &5627414565518055934 stripped
+--- !u!4 &7566020738624306134 stripped
 Transform:
   m_CorrespondingSourceObject: {fileID: 2311685522153988095, guid: 26368eb523c2a4246a25272fb53fb446, type: 3}
   m_PrefabInstance: {fileID: 5254335697641694249}
   m_PrefabAsset: {fileID: 0}
---- !u!1 &5850122976263328200 stripped
+--- !u!1 &8631359410270532576 stripped
 GameObject:
   m_CorrespondingSourceObject: {fileID: 4549649224877217737, guid: 26368eb523c2a4246a25272fb53fb446, type: 3}
   m_PrefabInstance: {fileID: 5254335697641694249}

+ 165 - 209
Assets/Art/ArtHero/Hero03.prefab

@@ -25,8 +25,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 155026557486164222}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.004321334, y: 0.002589848, z: 0.88637555, w: -0.4629396}
-  m_LocalPosition: {x: 0.084993325, y: -0.00000055632756, z: 6.6904715e-10}
+  m_LocalRotation: {x: -0.0025581133, y: 0.0019262859, z: 0.88638145, w: -0.4629446}
+  m_LocalPosition: {x: 0.08499332, y: -0.0000005393973, z: 6.678476e-10}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -58,8 +58,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 358645465620005727}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.0026571923, y: 0.010807793, z: -0.03571127, w: 0.9993002}
-  m_LocalPosition: {x: 0.063433595, y: -0.00000008902263, z: -0.0000000019323867}
+  m_LocalRotation: {x: 0.0031691252, y: -0.0109567, z: 0.035716467, w: -0.9992969}
+  m_LocalPosition: {x: 0.06343357, y: -0.00000006710212, z: -0.0000000019126565}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
@@ -90,8 +90,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 545356394205153752}
   serializedVersion: 2
-  m_LocalRotation: {x: -3.3404168e-30, y: -7.565273e-29, z: 0.058328282, w: 0.99829745}
-  m_LocalPosition: {x: -0.19922544, y: -1.9984014e-17, z: 2.1316282e-16}
+  m_LocalRotation: {x: -0.12484894, y: -0.036703117, z: 0.3257498, w: 0.9364576}
+  m_LocalPosition: {x: -0.19922559, y: -0.000000011175853, z: 0.000000040978094}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -124,8 +124,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 609997485722507918}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.08780653, y: 0.0046826205, z: 0.053046897, w: 0.99471307}
-  m_LocalPosition: {x: -0.09894391, y: -0.01896602, z: 0.0033746792}
+  m_LocalRotation: {x: 0.023197768, y: 0.0045741196, z: 0.1585053, w: 0.987075}
+  m_LocalPosition: {x: -0.098943956, y: -0.018966056, z: 0.0033747146}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -170,8 +170,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 715525735111511119}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.062176824, y: 0.7043679, z: -0.062176824, w: 0.7043679}
-  m_LocalPosition: {x: -1.0845211e-17, y: 2.0566881e-16, z: 0.33355397}
+  m_LocalRotation: {x: 0.062176697, y: 0.70436776, z: -0.062177114, w: 0.704368}
+  m_LocalPosition: {x: 0.00000006239861, y: 0.00007387992, z: 0.3216499}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -205,8 +205,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1075714060649516451}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.011902718, y: 0.10369651, z: 0.070935935, w: 0.9920048}
-  m_LocalPosition: {x: 0.10173414, y: 0.000000103064025, z: 0.000000544563}
+  m_LocalRotation: {x: -0.19286357, y: 0.15193276, z: 0.5441367, w: 0.8022689}
+  m_LocalPosition: {x: 0.10173438, y: 0.000000061467226, z: 0.0000003129242}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -238,8 +238,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1190195156239246212}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.025034064, y: -0.06244233, z: 0.0012542871, w: 0.9977338}
-  m_LocalPosition: {x: -0.12562485, y: -0.012257216, z: -0.0020234145}
+  m_LocalRotation: {x: 0.05617446, y: -0.124310054, z: -0.11278829, w: 0.9842105}
+  m_LocalPosition: {x: -0.12588276, y: -0.012273421, z: -0.001883928}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -271,8 +271,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1226500602719084586}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.010048218, y: -0.040839504, z: -0.7855352, w: 0.6173861}
-  m_LocalPosition: {x: 0.052380603, y: -0.000000021094301, z: 0.00000059586444}
+  m_LocalRotation: {x: 0.022808418, y: -0.3182297, z: 0.6924705, w: -0.64706594}
+  m_LocalPosition: {x: 0.052380614, y: 0.00000000745054, z: 0.00000061466847}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -304,8 +304,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1504496144969346239}
   serializedVersion: 2
-  m_LocalRotation: {x: 5.082376e-17, y: -5.15409e-17, z: 0.042781048, w: 0.9990845}
-  m_LocalPosition: {x: -0.09346745, y: 8.8817837e-17, z: 6.418694e-17}
+  m_LocalRotation: {x: 0.095719665, y: -0.085076235, z: 0.12277816, w: 0.9841368}
+  m_LocalPosition: {x: -0.09346751, y: -0.000000030107906, z: 0.00000003715831}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -341,8 +341,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1534419836349419527}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.7093532, y: 0, z: 0, w: 0.7048532}
-  m_LocalPosition: {x: -0, y: 0, z: 0}
+  m_LocalRotation: {x: -0.7093532, y: -0, z: -0, w: 0.7048532}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -374,8 +374,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1639277669660500091}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.0000000105187725, y: 6.145883e-10, z: 0.058328282, w: 0.99829745}
-  m_LocalPosition: {x: 0.19922526, y: -1.1510433e-11, z: 2.5579537e-15}
+  m_LocalRotation: {x: -0.49129698, y: -0.05084298, z: 0.11727757, w: 0.86156154}
+  m_LocalPosition: {x: 0.19922604, y: 0.00000005215401, z: 0.00000032037488}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -407,8 +407,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1782607458629732122}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.025008949, y: -0.062441748, z: 0.0012532085, w: 0.9977345}
-  m_LocalPosition: {x: 0.12562445, y: 0.012257197, z: 0.002024065}
+  m_LocalRotation: {x: 0.072158486, y: -0.09957286, z: 0.009103192, w: 0.9923687}
+  m_LocalPosition: {x: 0.12595311, y: 0.01228251, z: 0.0019205133}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -440,8 +440,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1878194267986455543}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.026913026, y: 0.022706468, z: -0.0010662322, w: 0.99937934}
-  m_LocalPosition: {x: -0.13777272, y: 0.0059483806, z: 0.0027488763}
+  m_LocalRotation: {x: -0.0077894735, y: 0.032274228, z: 0.18150185, w: 0.98283005}
+  m_LocalPosition: {x: -0.13805245, y: 0.0059605157, z: 0.002754501}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -505,8 +505,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2135401289065116140}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.10418877, y: -0.7700337, z: -0.032202303, w: 0.6286141}
-  m_LocalPosition: {x: -0.01944315, y: -0.021992614, z: -0.062890135}
+  m_LocalRotation: {x: -0.104188815, y: 0.7700338, z: 0.032202303, w: -0.6286142}
+  m_LocalPosition: {x: -0.019443149, y: -0.021992657, z: -0.06289019}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -539,8 +539,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2270681781738034101}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.0009789666, y: 0.0023777457, z: -0.37869388, w: 0.9255184}
-  m_LocalPosition: {x: -0.078995824, y: -0.029177444, z: 0.005036025}
+  m_LocalRotation: {x: 0.027193878, y: -0.009150637, z: -0.37859073, w: 0.92511934}
+  m_LocalPosition: {x: -0.078995846, y: -0.029177487, z: 0.005036034}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -572,8 +572,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2286904958054991685}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.011902718, y: 0.10369651, z: 0.070935935, w: 0.9920048}
-  m_LocalPosition: {x: -0.10173372, y: 4.440892e-18, z: -1.4210854e-16}
+  m_LocalRotation: {x: 0.047435485, y: -0.1468385, z: 0.18350181, w: 0.9708324}
+  m_LocalPosition: {x: -0.10173412, y: -0.000000037252825, z: -0.000000022351712}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -611,7 +611,7 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2409008895403029140}
   serializedVersion: 2
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalRotation: {x: -0, y: 0.013756339, z: -0, w: 0.9999054}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
@@ -621,8 +621,9 @@ Transform:
   - {fileID: 8258860829733667266}
   - {fileID: 2469182456857218531}
   - {fileID: 3704018649951556546}
+  - {fileID: 5655396287469573766}
   m_Father: {fileID: 0}
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 1.576, z: 0}
 --- !u!95 &6073723472531861278
 Animator:
   serializedVersion: 5
@@ -682,7 +683,7 @@ PlayableDirector:
     - 700512f659d2a464bbc3462b672232e8: {fileID: 8771452655161073577}
     - 2c026a978a482e447b5162ac72a82006: {fileID: 8771452655161073577}
     - 409133c37d0ae71498d7e81d9e688b67: {fileID: 2647377009172443046}
-    - 3edb651f38011914c84d67518bb3b8d1: {fileID: 267511645236318593}
+    - 3edb651f38011914c84d67518bb3b8d1: {fileID: 4969632743126856923}
     - 171433121f07e474abd3a25264b07948: {fileID: 2647377009172443046}
 --- !u!195 &292476500467395602
 NavMeshAgent:
@@ -794,8 +795,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2528598237032351378}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.026913026, y: 0.022706468, z: -0.0010662322, w: 0.99937934}
-  m_LocalPosition: {x: 0.1377729, y: -0.0059484076, z: -0.0027491562}
+  m_LocalRotation: {x: -0.0013993438, y: -0.034507245, z: -0.17295508, w: -0.9843241}
+  m_LocalPosition: {x: 0.13813086, y: -0.0059637744, z: -0.002756414}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -827,8 +828,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2906501906043225029}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.012497515, y: -0.0024274308, z: -0.07109492, w: 0.99738836}
-  m_LocalPosition: {x: 0.045099515, y: -0.00000023024785, z: 0.000000114253595}
+  m_LocalRotation: {x: 0.055032723, y: -0.0018131624, z: 0.067074925, w: -0.9962275}
+  m_LocalPosition: {x: 0.045099527, y: -0.00000018440102, z: 0.000000094994036}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
@@ -859,8 +860,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2910585865160148966}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.012497515, y: -0.0024274308, z: -0.07109492, w: 0.99738836}
-  m_LocalPosition: {x: -0.045099992, y: 1.7763568e-17, z: -1.4210854e-16}
+  m_LocalRotation: {x: -0.05503388, y: 0.0018129589, z: -0.06707482, w: 0.9962274}
+  m_LocalPosition: {x: -0.045100037, y: 0.0000000083818135, z: -0.00000004470299}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
@@ -924,8 +925,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3125877858703068452}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.7066251, y: 0.02609513, z: -0.02609513, w: 0.7066251}
-  m_LocalPosition: {x: -0.13859957, y: -3.5527136e-17, z: -1.065814e-15}
+  m_LocalRotation: {x: 0.7602915, y: 0.22099262, z: 0.08799467, w: -0.6044636}
+  m_LocalPosition: {x: -0.13859996, y: 0.000000046566104, z: -0.00000025704492}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -959,8 +960,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3309158341790282709}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.7700337, y: 0.10418877, z: 0.6286141, w: 0.032202303}
-  m_LocalPosition: {x: -0.01944353, y: -0.021992618, z: 0.0628901}
+  m_LocalRotation: {x: -0.7700339, y: -0.10418882, z: -0.62861407, w: -0.032202397}
+  m_LocalPosition: {x: -0.0194436, y: -0.021992628, z: 0.062890135}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -995,11 +996,11 @@ Transform:
   m_GameObject: {fileID: 3469803256910190223}
   serializedVersion: 2
   m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 0.521, z: -0}
+  m_LocalPosition: {x: 0.016, y: 0.472, z: 1.338}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
-  m_Father: {fileID: 8818890844602526850}
+  m_Father: {fileID: 4976044481617295284}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &3691830334778796199
 MonoBehaviour:
@@ -1039,8 +1040,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3543443328607793455}
   serializedVersion: 2
-  m_LocalRotation: {x: 4.2292428e-17, y: 5.3793756e-17, z: -0.13413732, w: 0.9909628}
-  m_LocalPosition: {x: -0.107710324, y: 0.011222288, z: 6.8414275e-17}
+  m_LocalRotation: {x: -0.09218167, y: 0.0042400947, z: 0.0024622725, w: -0.99573016}
+  m_LocalPosition: {x: -0.107710406, y: 0.011222272, z: 0.00000002456366}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1072,8 +1073,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3586070473389716999}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.039633952, y: 0.13932489, z: 0.9894442, w: -0.004238037}
-  m_LocalPosition: {x: 0.02983256, y: 0.019493982, z: 0.094070405}
+  m_LocalRotation: {x: -0.09478579, y: 0.17332713, z: 0.9793771, w: 0.042356256}
+  m_LocalPosition: {x: 0.029832564, y: 0.019494053, z: 0.094070494}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1142,7 +1143,7 @@ Transform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
-  - {fileID: 1021631909623793211}
+  - {fileID: 5290702643498984289}
   - {fileID: 7580109770906483022}
   - {fileID: 6209431170170104005}
   - {fileID: 4341407037936790835}
@@ -1173,8 +1174,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3904125754861451375}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.0009789699, y: 0.0023777445, z: -0.3786951, w: 0.9255179}
-  m_LocalPosition: {x: 0.078995995, y: 0.029178, z: -0.00503602}
+  m_LocalRotation: {x: -0.027194206, y: 0.009150921, z: 0.3785919, w: -0.9251189}
+  m_LocalPosition: {x: 0.078996025, y: 0.029177979, z: -0.0050360207}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1245,7 +1246,6 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 4324799882122396229}
-  - {fileID: 5655396287469573766}
   m_Father: {fileID: 8929592774082398284}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &4045433316977005424
@@ -1273,8 +1273,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 4045433316977005424}
   serializedVersion: 2
-  m_LocalRotation: {x: 0, y: 0, z: 0.08751218, w: 0.9961635}
-  m_LocalPosition: {x: -0.07696576, y: -1.5099033e-16, z: 1.13396255e-17}
+  m_LocalRotation: {x: 0.21249422, y: -0.07437654, z: 0.17120671, w: -0.9591677}
+  m_LocalPosition: {x: -0.07696583, y: -0.000000034342502, z: 0.000000022351745}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1306,8 +1306,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 4959241942722930002}
   serializedVersion: 2
-  m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068}
-  m_LocalPosition: {x: 0.020222384, y: -0.10951788, z: -0.0015459505}
+  m_LocalRotation: {x: -0.00000005960453, y: -0.000000074505664, z: -0.7071068, w: -0.70710677}
+  m_LocalPosition: {x: 0.02022237, y: -0.10951794, z: -0.0015459987}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
@@ -1370,8 +1370,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 5503363864351227299}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.015122188, y: -0.03924476, z: -0.85717356, w: 0.5133076}
-  m_LocalPosition: {x: -0.052380655, y: -4.6629366e-17, z: 0}
+  m_LocalRotation: {x: -0.013516089, y: 0.35560983, z: -0.76256585, w: 0.5402337}
+  m_LocalPosition: {x: -0.05238067, y: -0.00000003911514, z: -0.000000033527343}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1403,8 +1403,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 5635810087156938466}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.004321334, y: 0.002589848, z: 0.88637555, w: -0.4629396}
-  m_LocalPosition: {x: -0.084993236, y: -2.842171e-16, z: -2.8366196e-16}
+  m_LocalRotation: {x: 0.0025579026, y: -0.0019258903, z: -0.8863815, w: 0.46294463}
+  m_LocalPosition: {x: -0.084993206, y: 0.000000009575062, z: 6.402781e-10}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1436,8 +1436,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 6074564902425780822}
   serializedVersion: 2
-  m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068}
-  m_LocalPosition: {x: -0.020222299, y: 0.109517895, z: 0.0015459999}
+  m_LocalRotation: {x: -0.000000074505735, y: -0.000000037252867, z: 0.7071067, w: 0.7071068}
+  m_LocalPosition: {x: -0.020222317, y: 0.109517954, z: 0.0015459936}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
@@ -1501,8 +1501,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 6173623496553702157}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.559414, y: -0.457008, z: -0.26324454, w: 0.6394545}
-  m_LocalPosition: {x: 0.062028997, y: -0.025731001, z: 0.046623457}
+  m_LocalRotation: {x: -0.5935301, y: 0.47071397, z: 0.23787057, w: -0.607921}
+  m_LocalPosition: {x: 0.062029, y: -0.025731014, z: 0.04662346}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1534,8 +1534,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 6483208113139106769}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.7066251, y: 0.02609513, z: -0.02609513, w: 0.7066251}
-  m_LocalPosition: {x: 0.13859951, y: 9.530944e-10, z: 1.563194e-15}
+  m_LocalRotation: {x: -0.72558624, y: 0.32698655, z: -0.55732185, w: 0.23663668}
+  m_LocalPosition: {x: 0.13859959, y: -0.00000024959414, z: 0.00000019371451}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1569,8 +1569,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 7120259631894195895}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.0026571923, y: 0.010807793, z: -0.03571127, w: 0.9993002}
-  m_LocalPosition: {x: -0.063433915, y: -4.2632563e-16, z: 2.7755574e-18}
+  m_LocalRotation: {x: -0.0031687913, y: 0.01095665, z: -0.035716403, w: 0.9992969}
+  m_LocalPosition: {x: -0.06343393, y: -0.000000024214037, z: -7.275855e-11}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
@@ -1601,8 +1601,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 7184351624922692600}
   serializedVersion: 2
-  m_LocalRotation: {x: -0.036186904, y: 0.039763007, z: -0.0027689135, w: 0.9985498}
-  m_LocalPosition: {x: 0.029832672, y: -0.0141515955, z: -0.09502096}
+  m_LocalRotation: {x: -0.013457063, y: 0.065565854, z: -0.17032228, w: 0.98311263}
+  m_LocalPosition: {x: 0.029832713, y: -0.014151618, z: -0.09502109}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1666,8 +1666,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 8243752894026716923}
   serializedVersion: 2
-  m_LocalRotation: {x: 0, y: 0, z: -0.04595571, w: 0.9989435}
-  m_LocalPosition: {x: -0.20523393, y: -3.5527136e-17, z: 1.09031954e-16}
+  m_LocalRotation: {x: -0, y: -0.000000029802273, z: 0.06849645, w: -0.99765146}
+  m_LocalPosition: {x: -0.20523423, y: -0.000000102445306, z: 0.00000013597291}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -1703,8 +1703,8 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 8251004861649732357}
   serializedVersion: 2
-  m_LocalRotation: {x: 0.5924439, y: -0.3929715, z: -0.22398683, w: 0.6666436}
-  m_LocalPosition: {x: -0.062028673, y: 0.025731737, z: -0.046623435}
+  m_LocalRotation: {x: -0.60024357, y: 0.39557883, z: 0.2193492, w: -0.6596295}
+  m_LocalPosition: {x: -0.062028646, y: 0.025731778, z: -0.046623528}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
@@ -2014,73 +2014,6 @@ Transform:
   m_CorrespondingSourceObject: {fileID: 1194161028318273696, guid: 21ca235158cf74b47a2d00ec67a52ac6, type: 3}
   m_PrefabInstance: {fileID: 978177573897254749}
   m_PrefabAsset: {fileID: 0}
---- !u!1001 &2653378091559099650
-PrefabInstance:
-  m_ObjectHideFlags: 0
-  serializedVersion: 2
-  m_Modification:
-    serializedVersion: 3
-    m_TransformParent: {fileID: 2469182456857218531}
-    m_Modifications:
-    - target: {fileID: 2838628120464477315, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_Name
-      value: fx_hero03_zd
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalPosition.x
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalPosition.y
-      value: 0.58
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalPosition.z
-      value: 0.906
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalRotation.w
-      value: 1
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalRotation.x
-      value: -0
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalRotation.y
-      value: -0
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalRotation.z
-      value: -0
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.x
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.y
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.z
-      value: 0
-      objectReference: {fileID: 0}
-    m_RemovedComponents: []
-    m_RemovedGameObjects: []
-    m_AddedGameObjects: []
-    m_AddedComponents: []
-  m_SourcePrefab: {fileID: 100100000, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
---- !u!1 &267511645236318593 stripped
-GameObject:
-  m_CorrespondingSourceObject: {fileID: 2838628120464477315, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-  m_PrefabInstance: {fileID: 2653378091559099650}
-  m_PrefabAsset: {fileID: 0}
---- !u!4 &1021631909623793211 stripped
-Transform:
-  m_CorrespondingSourceObject: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
-  m_PrefabInstance: {fileID: 2653378091559099650}
-  m_PrefabAsset: {fileID: 0}
 --- !u!1001 &2781829662300187375
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -2361,6 +2294,68 @@ Transform:
   m_CorrespondingSourceObject: {fileID: 4415065638478367031, guid: d7ccfcc7f85de9340911dcc8e2930834, type: 3}
   m_PrefabInstance: {fileID: 5437904765955644133}
   m_PrefabAsset: {fileID: 0}
+--- !u!1001 &6251099772509798018
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 2469182456857218531}
+    m_Modifications:
+    - target: {fileID: 530877514752568608, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_Name
+      value: fx_hero03_zd_hit
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0.182
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.74
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 1.89
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+--- !u!4 &7580109770906483022 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+  m_PrefabInstance: {fileID: 6251099772509798018}
+  m_PrefabAsset: {fileID: 0}
 --- !u!1001 &7132915300414587731
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -2460,47 +2455,47 @@ PrefabInstance:
     serializedVersion: 3
     m_TransformParent: {fileID: 2469182456857218531}
     m_Modifications:
-    - target: {fileID: 530877514752568608, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 2838628120464477315, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_Name
-      value: fx_hero03_zd_hit
+      value: fx_hero03_zd
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalPosition.x
-      value: 0.182
+      value: 0
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalPosition.y
-      value: 0.74
+      value: 0.58
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalPosition.z
-      value: 1.89
+      value: 0.906
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalRotation.w
       value: 1
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalRotation.x
       value: -0
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalRotation.y
       value: -0
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalRotation.z
       value: -0
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalEulerAnglesHint.x
       value: 0
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalEulerAnglesHint.y
       value: 0
       objectReference: {fileID: 0}
-    - target: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+    - target: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
       propertyPath: m_LocalEulerAnglesHint.z
       value: 0
       objectReference: {fileID: 0}
@@ -2508,10 +2503,15 @@ PrefabInstance:
     m_RemovedGameObjects: []
     m_AddedGameObjects: []
     m_AddedComponents: []
-  m_SourcePrefab: {fileID: 100100000, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
---- !u!4 &7580109770906483022 stripped
+  m_SourcePrefab: {fileID: 100100000, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
+--- !u!1 &4969632743126856923 stripped
+GameObject:
+  m_CorrespondingSourceObject: {fileID: 2838628120464477315, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
+  m_PrefabInstance: {fileID: 7175214533483542616}
+  m_PrefabAsset: {fileID: 0}
+--- !u!4 &5290702643498984289 stripped
 Transform:
-  m_CorrespondingSourceObject: {fileID: 766331252454752534, guid: 475446f8fe554fe4aa7265b53265729f, type: 3}
+  m_CorrespondingSourceObject: {fileID: 3098232039505894201, guid: ee24abc0e00535348ad3b4c5c38c9f34, type: 3}
   m_PrefabInstance: {fileID: 7175214533483542616}
   m_PrefabAsset: {fileID: 0}
 --- !u!1001 &7443162088143972238
@@ -2592,25 +2592,17 @@ PrefabInstance:
     serializedVersion: 3
     m_TransformParent: {fileID: 2469182456857218531}
     m_Modifications:
-    - target: {fileID: 1064939640433162620, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: randomSeed
-      value: 6054
-      objectReference: {fileID: 0}
-    - target: {fileID: 1064939640433162620, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: autoRandomSeed
-      value: 0
-      objectReference: {fileID: 0}
     - target: {fileID: 2345877856508813684, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
       propertyPath: m_LocalPosition.x
-      value: 0.025
+      value: 0.016
       objectReference: {fileID: 0}
     - target: {fileID: 2345877856508813684, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
       propertyPath: m_LocalPosition.y
-      value: 0.499
+      value: 0.472
       objectReference: {fileID: 0}
     - target: {fileID: 2345877856508813684, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
       propertyPath: m_LocalPosition.z
-      value: 1.013
+      value: 1.338
       objectReference: {fileID: 0}
     - target: {fileID: 2345877856508813684, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
       propertyPath: m_LocalRotation.w
@@ -2640,46 +2632,10 @@ PrefabInstance:
       propertyPath: m_LocalEulerAnglesHint.z
       value: 0
       objectReference: {fileID: 0}
-    - target: {fileID: 5206726521450854177, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: randomSeed
-      value: 6054
-      objectReference: {fileID: 0}
-    - target: {fileID: 5206726521450854177, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: autoRandomSeed
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 5268265382216720648, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: randomSeed
-      value: 6054
-      objectReference: {fileID: 0}
-    - target: {fileID: 5268265382216720648, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: autoRandomSeed
-      value: 0
-      objectReference: {fileID: 0}
     - target: {fileID: 5917502201312437783, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
       propertyPath: m_Name
       value: fx_hero03_sk
       objectReference: {fileID: 0}
-    - target: {fileID: 6014203449385061748, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: randomSeed
-      value: 6054
-      objectReference: {fileID: 0}
-    - target: {fileID: 6014203449385061748, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: autoRandomSeed
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 6569235484077252477, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: m_IsTrigger
-      value: 1
-      objectReference: {fileID: 0}
-    - target: {fileID: 7537391795600004029, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: randomSeed
-      value: 6054
-      objectReference: {fileID: 0}
-    - target: {fileID: 7537391795600004029, guid: eacedfcc89db0b942ba18663d44cdc6b, type: 3}
-      propertyPath: autoRandomSeed
-      value: 0
-      objectReference: {fileID: 0}
     m_RemovedComponents: []
     m_RemovedGameObjects: []
     m_AddedGameObjects: []

+ 246 - 0
Assets/Art/ArtHero/New Animator Controller.controller

@@ -0,0 +1,246 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1102 &-7552075266120333533
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Die
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: c1694ad78d2b8ca4fa7d27c700415665, type: 3}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1102 &-5010781657122618946
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Bite Attack
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: 6914c74b218b2044ea2c463ae289d898, type: 3}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1102 &-4137464293386390658
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Spawn
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: 3851dd3b76e86f84ca990b222a770ff0, type: 3}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1102 &-135049555308940568
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Underground
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: 3c755deea655c7d4190f226792da5189, type: 3}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!91 &9100000
+AnimatorController:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: New Animator Controller
+  serializedVersion: 5
+  m_AnimatorParameters: []
+  m_AnimatorLayers:
+  - serializedVersion: 5
+    m_Name: Base Layer
+    m_StateMachine: {fileID: 7813710424225025242}
+    m_Mask: {fileID: 0}
+    m_Motions: []
+    m_Behaviours: []
+    m_BlendingMode: 0
+    m_SyncedLayerIndex: -1
+    m_DefaultWeight: 0
+    m_IKPass: 0
+    m_SyncedLayerAffectsTiming: 0
+    m_Controller: {fileID: 9100000}
+--- !u!1102 &4998145492315884334
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: run
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: e9e97ff4e8a989e47af733dafd080787, type: 3}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1102 &5437703490706116676
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Cast Spell
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: e40f0b936e6f87b49adffb816a83f69c, type: 3}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1102 &5811431598696386155
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: idle
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 7400000, guid: 211c387469166a94a8231490d3329181, type: 3}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1107 &7813710424225025242
+AnimatorStateMachine:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Base Layer
+  m_ChildStates:
+  - serializedVersion: 1
+    m_State: {fileID: 5811431598696386155}
+    m_Position: {x: 186.07928, y: 220.7821, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -5010781657122618946}
+    m_Position: {x: 315.19397, y: 125.56003, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: 5437703490706116676}
+    m_Position: {x: 319.22882, y: 49.70514, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -7552075266120333533}
+    m_Position: {x: 320.84274, y: 3.7080383, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -4137464293386390658}
+    m_Position: {x: 430, y: 200, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -135049555308940568}
+    m_Position: {x: 430.40036, y: 285.14954, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: 4998145492315884334}
+    m_Position: {x: 289.8932, y: 340.21313, z: 0}
+  m_ChildStateMachines: []
+  m_AnyStateTransitions: []
+  m_EntryTransitions: []
+  m_StateMachineTransitions: {}
+  m_StateMachineBehaviours: []
+  m_AnyStatePosition: {x: 50, y: 20, z: 0}
+  m_EntryPosition: {x: 50, y: 120, z: 0}
+  m_ExitPosition: {x: 800, y: 120, z: 0}
+  m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
+  m_DefaultState: {fileID: 5811431598696386155}

+ 8 - 0
Assets/Art/ArtHero/New Animator Controller.controller.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: Bnwa4SuoB3x5bgcctfGr427vHtTYiTxwH5wggOOzhxz2ZIGgmY9+RRE=
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 9100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 135 - 5
Assets/Art/HeroTimeLine/Hero01.playable

@@ -238,14 +238,14 @@ MonoBehaviour:
   m_Muted: 0
   m_CustomPlayableFullTypename: 
   m_Curves: {fileID: 0}
-  m_Parent: {fileID: 2664366215323630651}
+  m_Parent: {fileID: 2400672521855009513}
   m_Children: []
   m_Clips:
   - m_Version: 1
-    m_Start: 0.45
+    m_Start: 0
     m_ClipIn: 0
     m_Asset: {fileID: -8423214705257055620}
-    m_Duration: 5
+    m_Duration: 0.6000000000000001
     m_TimeScale: 1
     m_ParentTrack: {fileID: -8755593072199740924}
     m_EaseInDuration: 0
@@ -1359,7 +1359,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 42b647dab9a3401faf84053d24574f10, type: 3}
   m_Name: TimeLineTriggerAsset(Clone)
   m_EditorClassIdentifier: 
-  targetEntityType: 2
+  targetEntityType: 1
   tineLineTrigerType: 0
   tineLineTrigerData: 
 --- !u!114 &-3180892921950177998
@@ -1677,6 +1677,18 @@ MonoBehaviour:
   m_OpenClipOffsetRotation: {x: 0, y: 0, z: 0, w: 1}
   m_Rotation: {x: 0, y: 0, z: 0, w: 1}
   m_ApplyOffsets: 0
+--- !u!114 &-683773772745552890
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  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: fde0d25a170598d46a0b9dc16b4527a5, type: 3}
+  m_Name: ActivationPlayableAsset
+  m_EditorClassIdentifier: 
 --- !u!114 &-548908215802609536
 MonoBehaviour:
   m_ObjectHideFlags: 1
@@ -1753,6 +1765,7 @@ MonoBehaviour:
   m_Version: 0
   m_Tracks:
   - {fileID: 2664366215323630651}
+  - {fileID: 2400672521855009513}
   - {fileID: -7018264418762285241}
   - {fileID: -4816001755073941460}
   - {fileID: 2406230606845025980}
@@ -1767,6 +1780,99 @@ MonoBehaviour:
     m_ScenePreview: 1
   m_DurationMode: 0
   m_MarkerTrack: {fileID: 0}
+--- !u!114 &494431125881669351
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  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: 21bf7f712d84d26478ebe6a299f21738, type: 3}
+  m_Name: Activation Track
+  m_EditorClassIdentifier: 
+  m_Version: 3
+  m_AnimClip: {fileID: 0}
+  m_Locked: 0
+  m_Muted: 0
+  m_CustomPlayableFullTypename: 
+  m_Curves: {fileID: 0}
+  m_Parent: {fileID: 2400672521855009513}
+  m_Children: []
+  m_Clips:
+  - m_Version: 1
+    m_Start: 0
+    m_ClipIn: 0
+    m_Asset: {fileID: -683773772745552890}
+    m_Duration: 0.6000000000000001
+    m_TimeScale: 1
+    m_ParentTrack: {fileID: 494431125881669351}
+    m_EaseInDuration: 0
+    m_EaseOutDuration: 0
+    m_BlendInDuration: 0
+    m_BlendOutDuration: 0
+    m_MixInCurve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      - serializedVersion: 3
+        time: 1
+        value: 1
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    m_MixOutCurve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 1
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      - serializedVersion: 3
+        time: 1
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    m_BlendInCurveMode: 0
+    m_BlendOutCurveMode: 0
+    m_ExposedParameterNames: []
+    m_AnimationCurves: {fileID: 0}
+    m_Recordable: 0
+    m_PostExtrapolationMode: 0
+    m_PreExtrapolationMode: 0
+    m_PostExtrapolationTime: 0
+    m_PreExtrapolationTime: 0
+    m_DisplayName: Active
+  m_Markers:
+    m_Objects: []
+  m_PostPlaybackState: 3
 --- !u!114 &515659726093480869
 MonoBehaviour:
   m_ObjectHideFlags: 1
@@ -2279,6 +2385,31 @@ MonoBehaviour:
   m_Rotation: {x: 0, y: 0, z: 0, w: 1}
   isRunPlay: 0
   layerId: 0
+--- !u!114 &2400672521855009513
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  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: d0fc6f5187a81dc47999eefade6f0935, type: 3}
+  m_Name: "sk1_fashe@\u6218\u6597\u8DD1 (1)"
+  m_EditorClassIdentifier: 
+  m_Version: 3
+  m_AnimClip: {fileID: 0}
+  m_Locked: 0
+  m_Muted: 1
+  m_CustomPlayableFullTypename: 
+  m_Curves: {fileID: 0}
+  m_Parent: {fileID: 11400000}
+  m_Children:
+  - {fileID: -8755593072199740924}
+  - {fileID: 494431125881669351}
+  m_Clips: []
+  m_Markers:
+    m_Objects: []
 --- !u!114 &2406230606845025980
 MonoBehaviour:
   m_ObjectHideFlags: 1
@@ -2367,7 +2498,6 @@ MonoBehaviour:
   - {fileID: 7363228939947702508}
   - {fileID: -7379477113019173770}
   - {fileID: 1169797055110047173}
-  - {fileID: -8755593072199740924}
   m_Clips: []
   m_Markers:
     m_Objects: []

BIN
Assets/Art/VFX/Epic Toon FX/Textures/fireball.png


+ 161 - 0
Assets/Art/VFX/Epic Toon FX/Textures/fireball.png.meta

@@ -0,0 +1,161 @@
+fileFormatVersion: 2
+guid: Dywfty//U3yYt2vZhgr87fcH9fl4hs913l1oCDqMt9aLMMSlEuZFnmk=
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 13
+  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
+    flipGreenChannel: 0
+  isReadable: 0
+  webStreaming: 0
+  priorityLevel: 0
+  uploadedMode: 2
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 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: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WeixinMiniGame
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/Art/VFX/Epic Toon FX/Textures/fireball2.png


+ 161 - 0
Assets/Art/VFX/Epic Toon FX/Textures/fireball2.png.meta

@@ -0,0 +1,161 @@
+fileFormatVersion: 2
+guid: Xn9LsSOsVHKT5U3hPblUJFUjn7askFFOHywK9MGUJ/vKvCXX9rcK8eE=
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 13
+  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
+    flipGreenChannel: 0
+  isReadable: 0
+  webStreaming: 0
+  priorityLevel: 0
+  uploadedMode: 2
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 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: 1
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WeixinMiniGame
+    maxTextureSize: 2048
+    maxPlaceholderSize: 32
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 3 - 1
Assets/Art/VFX/FXPrefabs/fx_hero01_dg_bo.prefab

@@ -19569,7 +19569,7 @@ BoxCollider:
     serializedVersion: 2
     m_Bits: 0
   m_LayerOverridePriority: 0
-  m_IsTrigger: 0
+  m_IsTrigger: 1
   m_ProvidesContacts: 0
   m_Enabled: 1
   serializedVersion: 3
@@ -19589,6 +19589,8 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   hitFxName: 
   isPenetrate: 1
+  isUseCustomTargetEndPos: 1
+  customTargetEndPosIndex: 0
   speed: 10
 --- !u!1 &9151788763995937268
 GameObject:

Разлика између датотеке није приказан због своје велике величине
+ 212 - 158
Assets/Art/VFX/FXPrefabs/fx_hero03_sk.prefab


+ 132 - 0
Assets/Art/VFX/Materials/fx_fireball_ad.mat

@@ -0,0 +1,132 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!114 &-4990259531896535678
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 7
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: fx_fireball_ad
+  m_Shader: {fileID: 10720, guid: 0000000000000000f000000000000000, type: 0}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: a5d4917923e9e12479634b5cb171af56, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _WorkflowMode: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 1, g: 1, b: 1, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/Art/VFX/Materials/fx_fireball_ad.mat.meta

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

+ 132 - 0
Assets/Art/VFX/Materials/fx_fireball_al.mat

@@ -0,0 +1,132 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!114 &-4990259531896535678
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 7
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: fx_fireball_al
+  m_Shader: {fileID: 10721, guid: 0000000000000000f000000000000000, type: 0}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 0f025b0787c16284097b1aa20259a314, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _WorkflowMode: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 1, g: 1, b: 1, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
Assets/Art/VFX/Materials/fx_fireball_al.mat.meta

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

+ 132 - 0
Assets/Art/VFX/Materials/fx_jg_ad.mat

@@ -0,0 +1,132 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: fx_jg_ad
+  m_Shader: {fileID: 10720, guid: 0000000000000000f000000000000000, type: 0}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 659421477e4740a40b52a27b332b7d79, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _WorkflowMode: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 1, g: 1, b: 1, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []
+--- !u!114 &3832314702198480080
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 7

+ 8 - 0
Assets/Art/VFX/Materials/fx_jg_ad.mat.meta

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

+ 132 - 0
Assets/Art/VFX/Materials/fx_jg_al.mat

@@ -0,0 +1,132 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: fx_jg_al
+  m_Shader: {fileID: 10721, guid: 0000000000000000f000000000000000, type: 0}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 659421477e4740a40b52a27b332b7d79, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _WorkflowMode: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 1, g: 1, b: 1, a: 1}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []
+--- !u!114 &3832314702198480080
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 7

+ 8 - 0
Assets/Art/VFX/Materials/fx_jg_al.mat.meta

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

+ 62 - 62
Assets/Art/test01.scene

@@ -11199,67 +11199,6 @@ Transform:
   - {fileID: 7691617071141288180}
   m_Father: {fileID: 2752559098519718065}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1001 &1448769865
-PrefabInstance:
-  m_ObjectHideFlags: 0
-  serializedVersion: 2
-  m_Modification:
-    serializedVersion: 3
-    m_TransformParent: {fileID: 0}
-    m_Modifications:
-    - target: {fileID: 2409008895403029140, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_Name
-      value: Hero03
-      objectReference: {fileID: 0}
-    - target: {fileID: 2409008895403029140, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_IsActive
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalPosition.x
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalPosition.y
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalPosition.z
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalRotation.w
-      value: 0.9999054
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalRotation.x
-      value: -0
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalRotation.y
-      value: 0.013756339
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalRotation.z
-      value: -0
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.x
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.y
-      value: 1.576
-      objectReference: {fileID: 0}
-    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.z
-      value: 0
-      objectReference: {fileID: 0}
-    m_RemovedComponents: []
-    m_RemovedGameObjects: []
-    m_AddedGameObjects: []
-    m_AddedComponents: []
-  m_SourcePrefab: {fileID: 100100000, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
 --- !u!1001 &1514857019
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -66731,6 +66670,63 @@ Transform:
   m_CorrespondingSourceObject: {fileID: 3870106881955914952, guid: affebe334ef0abb489462fe15cd94d9b, type: 3}
   m_PrefabInstance: {fileID: 4178166190408131380}
   m_PrefabAsset: {fileID: 0}
+--- !u!1001 &4199421664239053313
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 2409008895403029140, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_Name
+      value: Hero03
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 0.9999054
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0.013756339
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 1.576
+      objectReference: {fileID: 0}
+    - target: {fileID: 4976044481617295284, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: 079ba5a44a7f3764a845a18b1c151592, type: 3}
 --- !u!4 &4200722793173000716
 Transform:
   m_ObjectHideFlags: 0
@@ -78289,6 +78285,10 @@ PrefabInstance:
       propertyPath: m_Name
       value: Hero01 (1)
       objectReference: {fileID: 0}
+    - target: {fileID: 7596842400906533007, guid: ad281f95eddc5284d86b6f7f2aebdea4, type: 3}
+      propertyPath: m_IsActive
+      value: 0
+      objectReference: {fileID: 0}
     m_RemovedComponents: []
     m_RemovedGameObjects: []
     m_AddedGameObjects: []
@@ -90162,7 +90162,7 @@ SceneRoots:
   - {fileID: 2752559098519718065}
   - {fileID: 1514857019}
   - {fileID: 961739753}
-  - {fileID: 1448769865}
+  - {fileID: 4199421664239053313}
   - {fileID: 2048994048}
   - {fileID: 1748724061}
   - {fileID: 8920155009417642891}

+ 8 - 0
Assets/GPUECSAnimationBaker.meta

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

+ 8 - 0
Assets/GPUECSAnimationBaker/Engine.meta

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

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 124891a7ea58427880af54e98f143795
+timeCreated: 1678872127

+ 37 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshBehaviour.cs

@@ -0,0 +1,37 @@
+using Unity.Entities;
+using Unity.Mathematics;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public class GpuEcsAnimatedMeshBehaviour : MonoBehaviour
+    {
+        public GpuEcsAnimatorBehaviour animator;
+        public TransformUsageFlags transformUsageFlags = TransformUsageFlags.Renderable;
+    }
+    
+    public class GpuEcsAnimatedMeshBaker : Baker<GpuEcsAnimatedMeshBehaviour>
+    {
+        public override void Bake(GpuEcsAnimatedMeshBehaviour authoring)
+        {
+            Entity entity = GetEntity(authoring.transformUsageFlags);
+            AddComponent(entity, new GpuEcsAnimatedMeshComponent()
+            {
+                animatorEntity = GetEntity(authoring.animator.gameObject,
+                    authoring.animator.transformUsageFlags)
+            });
+            AddComponent(entity, new GpuEcsMaterialAnimationState()
+            {
+                Value = new float4x4(
+                    1f, 0, 0, 0, 
+                    0, 0, 0, 0, 
+                    0, 0, 0, 0,
+                    0, 0, 0, 0)
+            });
+            AddComponent(entity, new GpuEcsMaterialEnableAnimation()
+            {
+                Value = 1
+            });
+        }
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshBehaviour.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b927b9dfd6f248378c3364a809fda80f
+timeCreated: 1678872326

+ 24 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshComponents.cs

@@ -0,0 +1,24 @@
+using Unity.Entities;
+using Unity.Mathematics;
+using Unity.Rendering;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public struct GpuEcsAnimatedMeshComponent : IComponentData
+    {
+        public Entity animatorEntity;
+    }
+
+    [MaterialProperty("_AnimationState")]
+    public struct GpuEcsMaterialAnimationState : IComponentData
+    {
+        public float4x4 Value;
+    }
+
+    [MaterialProperty("_EnableAnimation")]
+    public struct GpuEcsMaterialEnableAnimation : IComponentData
+    {
+        public float Value;
+    }
+    
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshComponents.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: e6415d1f6b424b518f1027adf467f308
+timeCreated: 1678872217

+ 40 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshSystem.cs

@@ -0,0 +1,40 @@
+using Unity.Burst;
+using Unity.Collections;
+using Unity.Entities;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public partial struct GpuEcsAnimatedMeshSystem : ISystem
+    {
+        private ComponentLookup<GpuEcsAnimatorShaderDataComponent> gpuEcsAnimatorShaderDataLookup;
+            
+        [BurstCompile]
+        public void OnCreate(ref SystemState state)
+        {
+            gpuEcsAnimatorShaderDataLookup = state.GetComponentLookup<GpuEcsAnimatorShaderDataComponent>(isReadOnly: true);
+        }
+        
+        [BurstCompile]
+        public void OnUpdate(ref SystemState state)
+        {
+            gpuEcsAnimatorShaderDataLookup.Update(ref state);
+            state.Dependency = new GpuEcsAnimatedMeshJob()
+            {
+                gpuEcsAnimatorShaderDataLookup = gpuEcsAnimatorShaderDataLookup
+            }.ScheduleParallel(state.Dependency);
+        }
+        
+        [BurstCompile]
+        private partial struct GpuEcsAnimatedMeshJob : IJobEntity
+        {
+            [ReadOnly] public ComponentLookup<GpuEcsAnimatorShaderDataComponent> gpuEcsAnimatorShaderDataLookup;
+
+            public void Execute(ref GpuEcsMaterialAnimationState gpuEcsMaterialAnimationState,
+                in GpuEcsAnimatedMeshComponent gpuEcsAnimatedMesh)
+            {
+                GpuEcsAnimatorShaderDataComponent gpuEcsAnimatorShaderData = gpuEcsAnimatorShaderDataLookup[gpuEcsAnimatedMesh.animatorEntity];
+                gpuEcsMaterialAnimationState.Value = gpuEcsAnimatorShaderData.shaderData;
+            }
+        }        
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatedMeshSystem.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 09f4119292fd4cba8f97647ead766325
+timeCreated: 1678872951

+ 18 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimationData.cs

@@ -0,0 +1,18 @@
+using System;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    [Serializable]
+    public class GpuEcsAnimationData
+    {
+        public int startFrameIndex;
+        public int nbrOfFramesPerSample;
+        public int nbrOfInBetweenSamples;
+        public float blendTimeCorrection;
+        public int startEventOccurenceId;
+        public int nbrOfEventOccurenceIds;
+        public bool loop;
+        public string animationID;
+        public string stateName;
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimationData.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: cf4ba1c380704a3aa0f7345cc23f2921
+timeCreated: 1678894498

+ 41 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorAspect.cs

@@ -0,0 +1,41 @@
+using Unity.Entities;
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public readonly partial struct GpuEcsAnimatorAspect : IAspect
+    {
+        private readonly RefRW<GpuEcsAnimatorControlComponent> control;
+        private readonly RefRW<GpuEcsAnimatorControlStateComponent> controlState;
+
+        public void RunAnimation(int animationID,
+            float blendFactor = 0f, float speedFactor = 1f, float startNormalizedTime = 0f, float transitionSpeed = 0f)
+        {
+            control.ValueRW = new GpuEcsAnimatorControlComponent()
+            {
+                animatorInfo = new AnimatorInfo()
+                {
+                    animationID = animationID,
+                    blendFactor = blendFactor,
+                    speedFactor = speedFactor
+                },
+                startNormalizedTime = startNormalizedTime,
+                transitionSpeed = transitionSpeed
+            };
+            StartAnimation();
+        }
+
+        public void StartAnimation()
+        {
+            controlState.ValueRW = new GpuEcsAnimatorControlStateComponent() {
+                state = GpuEcsAnimatorControlStates.Start
+            };
+        }
+        
+        public void StopAnimation()
+        {
+            controlState.ValueRW = new GpuEcsAnimatorControlStateComponent() {
+                state = GpuEcsAnimatorControlStates.Stop
+            };
+        }
+        
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorAspect.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a76237f7b8ca482695bb8c544895fc00
+timeCreated: 1679903062

+ 123 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorBehaviour.cs

@@ -0,0 +1,123 @@
+using System;
+using GpuEcsAnimationBaker.Engine.Data;
+using Unity.Collections;
+using Unity.Entities;
+using Unity.Mathematics;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public class GpuEcsAnimatorBehaviour : MonoBehaviour
+    {
+        public int totalNbrOfFrames;
+        public int nbrOfAttachmentAnchors;
+        public GpuEcsAnimationData[] animations;
+        public GpuEcsAnimationEventOccurence[] animationEventOccurences;
+        public TransformUsageFlags transformUsageFlags = TransformUsageFlags.Dynamic;
+        public GpuEcsAttachmentAnchorData attachmentAnchorData;
+        // public AnimationData[] BackAnimationDatas;
+    }
+
+    [Serializable]
+    public struct GpuEcsAnimationEventOccurence
+    {
+        public float eventNormalizedTime;
+        public int eventId;
+    }
+
+    public class GpuEcsAnimatorBaker : Baker<GpuEcsAnimatorBehaviour>
+    {
+        public override void Bake(GpuEcsAnimatorBehaviour authoring)
+        {
+            Entity entity = GetEntity(authoring.transformUsageFlags);
+
+            AddComponent(entity, new GpuEcsAnimationDataComponent()
+            {
+                nbrOfAttachmentAnchors = authoring.nbrOfAttachmentAnchors,
+                totalNbrOfFrames = authoring.totalNbrOfFrames
+            });
+            
+            DynamicBuffer<GpuEcsAnimationDataBufferElement> gpuEcsAnimationDataBuffer = AddBuffer<GpuEcsAnimationDataBufferElement>(entity);
+            for (int animationIndex = 0; animationIndex < authoring.animations.Length; animationIndex++)
+            {
+                GpuEcsAnimationData gpuEcsAnimationData = authoring.animations[animationIndex];
+                gpuEcsAnimationDataBuffer.Add(new GpuEcsAnimationDataBufferElement()
+                {
+                    startFrameIndex = gpuEcsAnimationData.startFrameIndex,
+                    nbrOfFramesPerSample = gpuEcsAnimationData.nbrOfFramesPerSample,
+                    nbrOfInBetweenSamples = gpuEcsAnimationData.nbrOfInBetweenSamples,
+                    blendTimeCorrection = gpuEcsAnimationData.blendTimeCorrection,
+                    startEventOccurenceId = gpuEcsAnimationData.startEventOccurenceId,
+                    nbrOfEventOccurenceIds = gpuEcsAnimationData.nbrOfEventOccurenceIds,
+                    loop = gpuEcsAnimationData.loop
+                });
+            }
+            
+            DynamicBuffer<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer = AddBuffer<GpuEcsAnimationEventOccurenceBufferElement>(entity);
+            for (int animationEventOccurenceId = 0; animationEventOccurenceId < authoring.animationEventOccurences.Length; animationEventOccurenceId++)
+            {
+                GpuEcsAnimationEventOccurence occurence = authoring.animationEventOccurences[animationEventOccurenceId];
+                gpuEcsAnimationEventOccurenceBuffer.Add(new GpuEcsAnimationEventOccurenceBufferElement()
+                {
+                    eventNormalizedTime = occurence.eventNormalizedTime,
+                    eventId = occurence.eventId
+                });
+            }
+            
+            AddComponent(entity, new GpuEcsAnimatorShaderDataComponent()
+            {
+                shaderData = new float4x4(
+                    1f, 0, 0, 0, 
+                    0, 0, 0, 0, 
+                    0, 0, 0, 0,
+                    0, 0, 0, 0)
+            });
+
+            int initialAnimationID = 0;
+            GpuEcsAnimatorInitializerBehaviour initializer = authoring.GetComponent<GpuEcsAnimatorInitializerBehaviour>();
+            if (initializer != null) initialAnimationID = initializer.GetInitialAnimationID();
+
+            AddComponent(entity, new GpuEcsAnimatorInitializedComponent()
+            {
+                initialized = false
+            });
+            
+            AddComponent(entity, new GpuEcsAnimatorControlComponent()
+            {
+                animatorInfo = new AnimatorInfo()
+                {
+                    animationID = initialAnimationID,
+                    blendFactor = 0,
+                    speedFactor = 1
+                },
+                transitionSpeed = 0,
+                startNormalizedTime = 0
+            });
+            AddComponent(entity, new GpuEcsAnimatorControlStateComponent()
+            {
+                state = GpuEcsAnimatorControlStates.Start
+            });
+                
+            AddComponent<GpuEcsAnimatorTransitionInfoComponent>(entity);
+            AddComponent<GpuEcsAnimatorStateComponent>(entity);
+
+            DynamicBuffer<GpuEcsAttachmentAnchorDataBufferElement> anchorDataBuffer = AddBuffer<GpuEcsAttachmentAnchorDataBufferElement>(entity);
+            DynamicBuffer<GpuEcsCurrentAttachmentAnchorBufferElement> currentAnchorTransformBuffer = AddBuffer<GpuEcsCurrentAttachmentAnchorBufferElement>(entity);
+            if (authoring.attachmentAnchorData != null && authoring.nbrOfAttachmentAnchors > 0)
+            {
+                int anchorDataLength = authoring.attachmentAnchorData.anchorTransforms.Length;
+                NativeArray<GpuEcsAttachmentAnchorDataBufferElement> anchors = new NativeArray<GpuEcsAttachmentAnchorDataBufferElement>(anchorDataLength, Allocator.Temp);
+                for (int i = 0; i < anchorDataLength; i++) 
+                    anchors[i] = new GpuEcsAttachmentAnchorDataBufferElement() { anchorTransform = authoring.attachmentAnchorData.anchorTransforms[i] };
+                anchorDataBuffer.AddRange(anchors);
+                anchors.Dispose();
+
+                NativeArray<GpuEcsCurrentAttachmentAnchorBufferElement> currentAnchorTransforms = new NativeArray<GpuEcsCurrentAttachmentAnchorBufferElement>(authoring.nbrOfAttachmentAnchors, Allocator.Temp);
+                currentAnchorTransformBuffer.AddRange(currentAnchorTransforms);
+                currentAnchorTransforms.Dispose();
+            }
+
+            AddBuffer<GpuEcsAnimatorEventBufferElement>(entity);
+        }
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorBehaviour.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 6dbd5b1412c14f19ba40d2188c5cd8c1
+timeCreated: 1678872649

+ 69 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorComponents.cs

@@ -0,0 +1,69 @@
+using Unity.Entities;
+using Unity.Mathematics;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public struct GpuEcsAnimationDataComponent : IComponentData
+    {
+        public int totalNbrOfFrames;
+        public int nbrOfAttachmentAnchors;
+    }
+    public struct GpuEcsAnimationDataBufferElement : IBufferElementData
+    {
+        public int startFrameIndex;
+        public int nbrOfFramesPerSample;
+        public int nbrOfInBetweenSamples;
+        public float blendTimeCorrection;
+        public int startEventOccurenceId;
+        public int nbrOfEventOccurenceIds;
+        public bool loop;
+    }
+
+    public struct GpuEcsAnimationEventOccurenceBufferElement : IBufferElementData
+    {
+        public float eventNormalizedTime;
+        public int eventId;
+    }
+    
+    public struct GpuEcsAnimatorShaderDataComponent : IComponentData
+    {
+        public float4x4 shaderData;
+    }
+
+    public struct GpuEcsAnimatorInitializedComponent : IComponentData
+    {
+        public bool initialized;
+    }
+    
+    public struct GpuEcsAnimatorTransitionInfoComponent : IComponentData
+    {
+        public AnimatorInfo current;
+        public float blendPreviousToCurrent; // 0 when only previous is running, 1 when only current is running
+        public AnimatorInfo previous;
+    }
+
+    public struct GpuEcsAnimatorStateComponent : IComponentData
+    {
+        public float currentNormalizedTime;
+        public float previousNormalizedTime;
+        public bool stoppedCurrent;
+        public bool stoppedPrevious;
+    }
+
+    public struct GpuEcsAttachmentAnchorDataBufferElement : IBufferElementData
+    {
+        public float4x4 anchorTransform;
+    }
+    
+    public struct GpuEcsCurrentAttachmentAnchorBufferElement : IBufferElementData
+    {
+        public float4x4 currentTransform;
+    }
+    
+    public struct GpuEcsAnimatorEventBufferElement : IBufferElementData
+    {
+        public int animationId;
+        public int eventId;
+    }
+    
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorComponents.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 7c06f41bb0de4823a2384a594d94fd8c
+timeCreated: 1678872738

+ 30 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorControlComponents.cs

@@ -0,0 +1,30 @@
+using Unity.Entities;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public struct GpuEcsAnimatorControlComponent : IComponentData
+    {
+        public AnimatorInfo animatorInfo; // All info about the animation you want to play
+        public float startNormalizedTime; // An option to start the animation from an arbitrary position (0 to 1)
+        public float transitionSpeed; // The transition speed that will be applied when switching to another animation
+    }
+
+    public struct AnimatorInfo
+    {
+        public int animationID; // the unique animation ID, can be assigned from the generated enum file
+        public float blendFactor; // From 0 to 1, going from clip1 to clip2
+        public float speedFactor; // <1 to make the animation go slower, >1 to make it go faster
+    }
+
+    public enum GpuEcsAnimatorControlStates
+    {
+        Start,
+        Stop,
+        KeepCurrentState
+    }
+
+    public struct GpuEcsAnimatorControlStateComponent : IComponentData
+    {
+        public GpuEcsAnimatorControlStates state;
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorControlComponents.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: f12784a584374eb997d1a427f78a7285
+timeCreated: 1679578863

+ 26 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorInitializerBehaviour.cs

@@ -0,0 +1,26 @@
+using System;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    [RequireComponent(typeof(GpuEcsAnimatorBehaviour))]
+    public class GpuEcsAnimatorInitializerBehaviour : MonoBehaviour
+    {
+        public virtual int GetInitialAnimationID() { return 0; }
+    }
+
+    [RequireComponent(typeof(GpuEcsAnimatorBehaviour))]
+    public class GpuEcsAnimatorInitializerBehaviour<T> : GpuEcsAnimatorInitializerBehaviour where T : Enum
+    {
+        public T initialAnimationId;
+
+        public override int GetInitialAnimationID()
+        {
+            Array values = Enum.GetValues(typeof(T));
+            for (int i = 0; i < values.Length; i++)
+                if((values.GetValue(i)).Equals(initialAnimationId)) return i;
+            return 0;
+        }
+    }
+    
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorInitializerBehaviour.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ec9958e85aff4d3da10f04e0d50d7a00
+timeCreated: 1679565423

+ 313 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorSystem.cs

@@ -0,0 +1,313 @@
+using GpuEcsAnimationBaker.Engine.Data;
+using Unity.Burst;
+using Unity.Collections;
+using Unity.Entities;
+using Unity.Mathematics;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    [BurstCompile]
+    public partial struct GpuEcsAnimatorSystem : ISystem
+    {
+        [BurstCompile]
+        public void OnUpdate(ref SystemState state)
+        {
+            EndSimulationEntityCommandBufferSystem.Singleton ecbSystem =
+                SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>();
+            EntityCommandBuffer.ParallelWriter ecb = ecbSystem.CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();
+            float deltaTime = SystemAPI.Time.DeltaTime;
+            state.Dependency = new GpuEcsAnimatorJob()
+            {
+                ecb = ecb,
+                deltaTime = deltaTime
+            }.ScheduleParallel(state.Dependency);
+        }
+
+        [BurstCompile]
+        private partial struct GpuEcsAnimatorJob : IJobEntity
+        {
+            public EntityCommandBuffer.ParallelWriter ecb;
+            [ReadOnly] public float deltaTime;
+
+            public void Execute(
+                ref GpuEcsAnimatorShaderDataComponent gpuEcsAnimatorShaderData,
+                ref GpuEcsAnimatorTransitionInfoComponent gpuEcsAnimatorTransitionInfo,
+                ref GpuEcsAnimatorStateComponent gpuEcsAnimatorState,
+                ref GpuEcsAnimatorInitializedComponent gpuEcsAnimatorInitialized,
+                ref DynamicBuffer<GpuEcsCurrentAttachmentAnchorBufferElement> gpuEcsCurrentAttachmentAnchors,
+                ref GpuEcsAnimatorControlStateComponent gpuEcsAnimatorControlState,
+                ref DynamicBuffer<GpuEcsAnimatorEventBufferElement> gpuEcsAnimatorEventBuffer,
+                in GpuEcsAnimatorControlComponent gpuEcsAnimatorControl,
+                in GpuEcsAnimationDataComponent gpuEcsAnimationData,
+                in DynamicBuffer<GpuEcsAnimationDataBufferElement> gpuEcsAnimationDataBuffer,
+                in DynamicBuffer<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer,
+                in DynamicBuffer<GpuEcsAttachmentAnchorDataBufferElement> gpuEcsAttachmentAnchorData,
+                [ChunkIndexInQuery] int sortKey, Entity gpuEcsAnimatorEntity)
+            {
+                gpuEcsAnimatorEventBuffer.Clear();
+                if (!gpuEcsAnimatorInitialized.initialized )
+                {
+                    // We switch immediately to the first animation, no transition
+                    gpuEcsAnimatorTransitionInfo = new GpuEcsAnimatorTransitionInfoComponent()
+                    {
+                        current = gpuEcsAnimatorControl.animatorInfo,
+                        blendPreviousToCurrent = 1f
+                    };
+                    gpuEcsAnimatorState = new GpuEcsAnimatorStateComponent()
+                    {
+                        currentNormalizedTime = gpuEcsAnimatorControl.startNormalizedTime,
+                        stoppedPrevious = false,
+                        stoppedCurrent = false
+                    };
+                    gpuEcsAnimatorInitialized.initialized = true;
+                }
+                else if(gpuEcsAnimatorControl.animatorInfo.animationID != gpuEcsAnimatorTransitionInfo.current.animationID)
+                {
+                    // A new animation (or animation combination) has been started, so we need to do a transition
+                    // from the old one to the new
+                    gpuEcsAnimatorTransitionInfo = new GpuEcsAnimatorTransitionInfoComponent()
+                    {
+                        current = gpuEcsAnimatorControl.animatorInfo,
+                        previous = gpuEcsAnimatorTransitionInfo.current,
+                        blendPreviousToCurrent = 0f
+                    };
+                    gpuEcsAnimatorState = new GpuEcsAnimatorStateComponent()
+                    {
+                        previousNormalizedTime = gpuEcsAnimatorState.currentNormalizedTime,
+                        stoppedPrevious = gpuEcsAnimatorState.stoppedCurrent,
+                        currentNormalizedTime = gpuEcsAnimatorControl.startNormalizedTime,
+                        stoppedCurrent = false,
+                    };
+                }
+                else
+                {
+                    // The same animation (or animation combination) is still running, but the parameters might have changed
+                    // (blendPrimaryToSecondary or speedFactor)
+                    gpuEcsAnimatorTransitionInfo.current = gpuEcsAnimatorControl.animatorInfo;
+                }
+
+                GpuEcsAnimatorControlStates controlState = gpuEcsAnimatorControlState.state;
+                if (gpuEcsAnimatorControlState.state == GpuEcsAnimatorControlStates.Start)
+                    gpuEcsAnimatorState.stoppedCurrent = false;
+                else if (gpuEcsAnimatorControlState.state == GpuEcsAnimatorControlStates.Stop)
+                    gpuEcsAnimatorState.stoppedCurrent = true;
+                gpuEcsAnimatorControlState.state = GpuEcsAnimatorControlStates.KeepCurrentState;
+
+                if (!gpuEcsAnimatorState.stoppedCurrent)
+                {
+                    UpdateAnimatorState(ref gpuEcsAnimatorState.currentNormalizedTime, ref gpuEcsAnimatorState.stoppedCurrent,
+                        ref gpuEcsAnimatorEventBuffer,
+                        gpuEcsAnimatorTransitionInfo.current, controlState, gpuEcsAnimationDataBuffer, gpuEcsAnimationEventOccurenceBuffer,
+                        out float primaryBlendFactor, out float primaryTransitionToNextFrame, out int primaryFrameIndex,
+                        out float secondaryBlendFactor, out float secondaryTransitionToNextFrame, out int secondaryFrameIndex,
+                        sortKey, gpuEcsAnimatorEntity, forPrevious: false);
+                    if (gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent >= 1f)
+                    {
+                        gpuEcsAnimatorShaderData.shaderData = new float4x4(
+                            primaryBlendFactor, primaryTransitionToNextFrame, primaryFrameIndex, 0,
+                            secondaryBlendFactor, secondaryTransitionToNextFrame, secondaryFrameIndex, 0,
+                            0, 0, 0, 0,
+                            0, 0, 0, 0);
+
+                        //Apply attachment anchor transforms
+                        for (int attachmentAnchorIndex = 0; attachmentAnchorIndex < gpuEcsAnimationData.nbrOfAttachmentAnchors; attachmentAnchorIndex++)
+                        {
+                            int baseIndex = gpuEcsAnimationData.totalNbrOfFrames * attachmentAnchorIndex;
+                            gpuEcsCurrentAttachmentAnchors[attachmentAnchorIndex] = new GpuEcsCurrentAttachmentAnchorBufferElement()
+                            {
+                                currentTransform = LerpBlend(gpuEcsAttachmentAnchorData, baseIndex,
+                                    primaryFrameIndex, secondaryFrameIndex,
+                                    primaryTransitionToNextFrame, secondaryTransitionToNextFrame,
+                                    secondaryBlendFactor)
+                            };
+                        }
+                    }
+                    else
+                    {
+                        if (gpuEcsAnimatorControl.transitionSpeed == 0) gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent = 1f;
+                        else
+                        {
+                            gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent += deltaTime / gpuEcsAnimatorControl.transitionSpeed;
+                            if (gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent > 1f) gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent = 1f;
+                        }
+
+                        float previousToCurrent = gpuEcsAnimatorTransitionInfo.blendPreviousToCurrent;
+                        float currentToPrevious = 1f - previousToCurrent;
+                        UpdateAnimatorState(ref gpuEcsAnimatorState.previousNormalizedTime, ref gpuEcsAnimatorState.stoppedPrevious,
+                            ref gpuEcsAnimatorEventBuffer,
+                            gpuEcsAnimatorTransitionInfo.previous, controlState, gpuEcsAnimationDataBuffer, gpuEcsAnimationEventOccurenceBuffer,
+                            out float previousPrimaryBlendFactor, out float previousPrimaryTransitionToNextFrame, out int previousPrimaryFrameIndex,
+                            out float previousSecondaryBlendFactor, out float previousSecondaryTransitionToNextFrame, out int previousSecondaryFrameIndex,
+                            sortKey, gpuEcsAnimatorEntity, forPrevious: true);
+
+                        gpuEcsAnimatorShaderData.shaderData = new float4x4(
+                            previousToCurrent * primaryBlendFactor, primaryTransitionToNextFrame, primaryFrameIndex, 0,
+                            previousToCurrent * secondaryBlendFactor, secondaryTransitionToNextFrame, secondaryFrameIndex, 0,
+                            currentToPrevious * previousPrimaryBlendFactor, previousPrimaryTransitionToNextFrame, previousPrimaryFrameIndex, 0,
+                            currentToPrevious * previousSecondaryBlendFactor, previousSecondaryTransitionToNextFrame, previousSecondaryFrameIndex, 0);
+
+                        for (int attachmentAnchorIndex = 0; attachmentAnchorIndex < gpuEcsAnimationData.nbrOfAttachmentAnchors; attachmentAnchorIndex++)
+                        {
+                            int baseIndex = gpuEcsAnimationData.totalNbrOfFrames * attachmentAnchorIndex;
+
+                            float4x4 current = LerpBlend(gpuEcsAttachmentAnchorData, baseIndex,
+                                primaryFrameIndex, secondaryFrameIndex,
+                                primaryTransitionToNextFrame, secondaryTransitionToNextFrame,
+                                secondaryBlendFactor);
+                            float4x4 previous = LerpBlend(gpuEcsAttachmentAnchorData, baseIndex,
+                                previousPrimaryFrameIndex, previousSecondaryFrameIndex,
+                                previousPrimaryTransitionToNextFrame, previousSecondaryTransitionToNextFrame,
+                                previousSecondaryBlendFactor);
+
+                            gpuEcsCurrentAttachmentAnchors[attachmentAnchorIndex] = new GpuEcsCurrentAttachmentAnchorBufferElement()
+                            {
+                                currentTransform = LerpTransform(previous, current, previousToCurrent)
+                            };
+                        }
+                    }
+                }
+            }
+            
+            private float4x4 LerpBlend(in DynamicBuffer<GpuEcsAttachmentAnchorDataBufferElement> gpuEcsAttachmentAnchorData,
+                int baseIndex, int frameIndexA, int frameIndexB, 
+                float frameIndexATransitionToNextFrame, float frameIndexBTransitionToNextFrame,
+                float t)
+            {
+                float4x4 result;
+                if (t == 0)
+                    result = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexA, frameIndexATransitionToNextFrame);
+                else if(t == 1f)
+                    result = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexB, frameIndexBTransitionToNextFrame);
+                else
+                {
+                    float4x4 primary = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexA, frameIndexATransitionToNextFrame);
+                    float4x4 secondary = LerpNextFrame(gpuEcsAttachmentAnchorData, baseIndex, frameIndexB, frameIndexBTransitionToNextFrame);
+                    result = LerpTransform(primary, secondary, t); 
+                }
+                return result;
+            }
+
+            private float4x4 LerpNextFrame(in DynamicBuffer<GpuEcsAttachmentAnchorDataBufferElement> gpuEcsAttachmentAnchorData,
+                int baseIndex, int frameIndex, float transitionToNextFrame)
+            {
+                return LerpTransform(
+                    gpuEcsAttachmentAnchorData[baseIndex + frameIndex].anchorTransform,
+                    gpuEcsAttachmentAnchorData[baseIndex + frameIndex + 1].anchorTransform,
+                    transitionToNextFrame
+                );
+            }
+
+            private float4x4 LerpTransform(float4x4 valueA, float4x4 valueB, float t)
+            {
+                float3 posA = new float3(valueA.c3.x, valueA.c3.y, valueA.c3.z);
+                quaternion rotA = new quaternion(valueA);
+                float3 posB = new float3(valueB.c3.x, valueB.c3.y, valueB.c3.z);
+                quaternion rotB = new quaternion(valueB);
+
+                float3 pos = math.lerp(posA, posB, t);
+                Quaternion rot = math.slerp(rotA, rotB, t);
+                return float4x4.TRS(pos, rot, new float3(1f, 1f, 1f));
+            }
+
+            private void UpdateAnimatorState(ref float normalizedTime, ref bool stopped, 
+                ref DynamicBuffer<GpuEcsAnimatorEventBufferElement> gpuEcsAnimatorEventBuffer,
+                AnimatorInfo animatorInfo,
+                in GpuEcsAnimatorControlStates controlState,
+                in DynamicBuffer<GpuEcsAnimationDataBufferElement> gpuEcsAnimationDataBuffer,
+                in DynamicBuffer<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer,
+                out float primaryBlendFactor, out float primaryTransitionToNextFrame, out int primaryFrameIndex,
+                out float secondaryBlendFactor, out float secondaryTransitionToNextFrame, out int secondaryFrameIndex,
+                in int sortKey, Entity gpuEcsAnimatorEntity, bool forPrevious)
+            {
+                GpuEcsAnimationDataBufferElement animationData = gpuEcsAnimationDataBuffer[animatorInfo.animationID];
+
+                if (animationData.nbrOfInBetweenSamples == 1)
+                {
+                    float blendSpeedAdjustment = 1f;
+                    UpdateAnimationNormalizedTime(ref normalizedTime, ref stopped, ref gpuEcsAnimatorEventBuffer, animatorInfo, controlState, 
+                        gpuEcsAnimationEventOccurenceBuffer, animationData, blendSpeedAdjustment, 
+                        out float transitionToNextFrame, out int relativeFrameIndex, sortKey, gpuEcsAnimatorEntity, forPrevious);
+                    primaryBlendFactor = 1;
+                    primaryTransitionToNextFrame = transitionToNextFrame;
+                    primaryFrameIndex = animationData.startFrameIndex + relativeFrameIndex;
+                    secondaryBlendFactor = 0;
+                    secondaryTransitionToNextFrame = 0;
+                    secondaryFrameIndex = 0;
+                }
+                else
+                {
+                    float endBlend = (float)(animationData.nbrOfInBetweenSamples - 1);
+                    float currentBlendSetFloat = animatorInfo.blendFactor * endBlend;
+                    int currentBlendSet = (int)math.floor(currentBlendSetFloat);
+                    float transitionToNextSet = currentBlendSetFloat - (float)currentBlendSet;
+                    
+                    float blendSpeedAdjustment = animatorInfo.blendFactor * animationData.blendTimeCorrection + (1f - animatorInfo.blendFactor);
+                    UpdateAnimationNormalizedTime(ref normalizedTime, ref stopped, ref gpuEcsAnimatorEventBuffer, animatorInfo, controlState, 
+                        gpuEcsAnimationEventOccurenceBuffer, animationData, blendSpeedAdjustment, 
+                        out float transitionToNextFrame, out int relativeFrameIndex, sortKey, gpuEcsAnimatorEntity, forPrevious);
+                    primaryBlendFactor = 1f - transitionToNextSet;
+                    primaryTransitionToNextFrame = transitionToNextFrame;
+                    primaryFrameIndex = animationData.startFrameIndex + currentBlendSet * animationData.nbrOfFramesPerSample + relativeFrameIndex;
+                    secondaryBlendFactor = transitionToNextSet;
+                    secondaryTransitionToNextFrame = transitionToNextFrame;
+                    secondaryFrameIndex = animationData.startFrameIndex + (currentBlendSet + 1) * animationData.nbrOfFramesPerSample + relativeFrameIndex;
+                }
+            }
+
+            private void UpdateAnimationNormalizedTime(ref float normalizedTime, ref bool stopped,
+                ref DynamicBuffer<GpuEcsAnimatorEventBufferElement> gpuEcsAnimatorEventBuffer,
+                AnimatorInfo animatorInfo, in GpuEcsAnimatorControlStates controlState,
+                in DynamicBuffer<GpuEcsAnimationEventOccurenceBufferElement> gpuEcsAnimationEventOccurenceBuffer,
+                GpuEcsAnimationDataBufferElement animationData, float blendSpeedAdjustment, 
+                out float transitionToNextFrame, out int relativeFrameIndex, int sortKey, Entity gpuEcsAnimatorEntity, bool forPrevious)
+            {
+                int endFrame = animationData.nbrOfFramesPerSample - 1;
+                float animationLength = (float)endFrame / GlobalConstants.SampleFrameRate;
+                float currentTime = normalizedTime * animationLength;
+                if(!stopped) currentTime += deltaTime * animatorInfo.speedFactor * blendSpeedAdjustment;
+                float normalizedTimeLastUpdate = normalizedTime;
+                normalizedTime = currentTime / animationLength;
+                
+                for (int eventOccurencId = animationData.startEventOccurenceId; eventOccurencId < animationData.startEventOccurenceId + animationData.nbrOfEventOccurenceIds; eventOccurencId++)
+                {
+                    GpuEcsAnimationEventOccurenceBufferElement occurence = gpuEcsAnimationEventOccurenceBuffer[eventOccurencId];
+                    if (normalizedTimeLastUpdate < occurence.eventNormalizedTime && normalizedTime > occurence.eventNormalizedTime)
+                    {
+                        //Trigger event
+                        gpuEcsAnimatorEventBuffer.Add(new GpuEcsAnimatorEventBufferElement()
+                        {
+                            animationId = animatorInfo.animationID,
+                            eventId = occurence.eventId
+                        });
+                    }
+                }
+
+                if (!forPrevious && (animationData.loop || controlState == GpuEcsAnimatorControlStates.Start))
+                {
+                    while (normalizedTime >= 1f) normalizedTime -= 1f;
+                }
+                else
+                {
+                    if (normalizedTime >= 1f)
+                    {
+                        normalizedTime = 1f;
+                        stopped = true;
+                    }
+                }
+
+                if (normalizedTime == 1f) 
+                {
+                    relativeFrameIndex = endFrame - 1;
+                    transitionToNextFrame = 1f;
+                }
+                else
+                {
+                    float relativeFrameIndexFloat = normalizedTime * (float)endFrame;
+                    relativeFrameIndex = (int)math.floor(relativeFrameIndexFloat);
+                    transitionToNextFrame = relativeFrameIndexFloat - (float)relativeFrameIndex;
+                }
+            }
+        }
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAnimatorSystem.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 49919f8307c64e1295ff28ed06574630
+timeCreated: 1678957246

+ 12 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentAnchorData.cs

@@ -0,0 +1,12 @@
+using System;
+using Unity.Mathematics;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    [Serializable]
+    public class GpuEcsAttachmentAnchorData : ScriptableObject
+    {
+        public float4x4[] anchorTransforms;
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentAnchorData.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: f9f8288587a245c68a88b9c4a4a3b09a
+timeCreated: 1691945420

+ 37 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentBehaviour.cs

@@ -0,0 +1,37 @@
+using Unity.Entities;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public class GpuEcsAttachmentBehaviour : MonoBehaviour
+    {
+    }
+    
+    public class GpuEcsAttachmentBaker : Baker<GpuEcsAttachmentBehaviour>
+    {
+        public override void Bake(GpuEcsAttachmentBehaviour authoring)
+        {
+            int attachmentAnchorId = 0;
+            Entity gpuEcsAnimatorEntity = Entity.Null;
+            
+            GpuEcsAttachmentInitializerBehaviour initializer = authoring.GetComponent<GpuEcsAttachmentInitializerBehaviour>();
+            if (initializer != null) attachmentAnchorId = initializer.GetAttachmentAnchorID();
+            if (authoring.transform.parent != null)
+            {
+                GpuEcsAnimatorBehaviour gpuEcsAnimator = authoring.transform.parent.GetComponent<GpuEcsAnimatorBehaviour>();
+                if (gpuEcsAnimator != null)
+                {
+                    gpuEcsAnimatorEntity = GetEntity(gpuEcsAnimator, TransformUsageFlags.None);
+                }
+            }
+
+            Entity entity = GetEntity(TransformUsageFlags.Dynamic);
+            AddComponent(entity, new GpuEcsAttachmentComponent()
+            {
+                gpuEcsAnimatorEntity = gpuEcsAnimatorEntity,
+                attachmentAnchorId = attachmentAnchorId
+            });
+            
+        }
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentBehaviour.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 18dcb30678534d95a256d194d2fe8b33
+timeCreated: 1692011427

+ 10 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentComponents.cs

@@ -0,0 +1,10 @@
+using Unity.Entities;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    public struct GpuEcsAttachmentComponent : IComponentData
+    {
+        public Entity gpuEcsAnimatorEntity;
+        public int attachmentAnchorId;
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentComponents.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 8f4c26e1dc68431184503c832f9e61c3
+timeCreated: 1692011148

+ 25 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentInitializerBehaviour.cs

@@ -0,0 +1,25 @@
+using System;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    [RequireComponent(typeof(GpuEcsAttachmentBehaviour))]
+    public class GpuEcsAttachmentInitializerBehaviour : MonoBehaviour
+    {
+        public virtual int GetAttachmentAnchorID() { return 0; }
+    }
+
+    [RequireComponent(typeof(GpuEcsAttachmentBehaviour))]
+    public class GpuEcsAttachmentInitializerBehaviour<T> : GpuEcsAttachmentInitializerBehaviour where T : Enum
+    {
+        public T attachmentAnchorId;
+
+        public override int GetAttachmentAnchorID()
+        {
+            Array values = Enum.GetValues(typeof(T));
+            for (int i = 0; i < values.Length; i++)
+                if((values.GetValue(i)).Equals(attachmentAnchorId)) return i;
+            return 0;
+        }
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentInitializerBehaviour.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 241ce774393b43d5bf0d05b28c882d5a
+timeCreated: 1692094783

+ 43 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentSystem.cs

@@ -0,0 +1,43 @@
+using Unity.Burst;
+using Unity.Collections;
+using Unity.Entities;
+using Unity.Transforms;
+
+namespace GPUECSAnimationBaker.Engine.AnimatorSystem
+{
+    [BurstCompile]
+    public partial struct GpuEcsAttachmentSystem : ISystem
+    {
+        private BufferLookup<GpuEcsCurrentAttachmentAnchorBufferElement> gpuEcsCurrentAttachmentAnchorLookup;
+        
+        [BurstCompile]
+        public void OnCreate(ref SystemState state)
+        {
+            gpuEcsCurrentAttachmentAnchorLookup = state.GetBufferLookup<GpuEcsCurrentAttachmentAnchorBufferElement>(isReadOnly: true);
+        }
+        
+        [BurstCompile]
+        public void OnUpdate(ref SystemState state)
+        {
+            gpuEcsCurrentAttachmentAnchorLookup.Update(ref state);
+            state.Dependency = new GpuEcsAttachmentJob()
+            {
+                gpuEcsCurrentAttachmentAnchorLookup = gpuEcsCurrentAttachmentAnchorLookup
+            }.ScheduleParallel(state.Dependency);
+        }
+
+        [BurstCompile]
+        private partial struct GpuEcsAttachmentJob : IJobEntity
+        {
+            [ReadOnly] public BufferLookup<GpuEcsCurrentAttachmentAnchorBufferElement> gpuEcsCurrentAttachmentAnchorLookup;
+            
+            public void Execute(ref LocalTransform localTransform, in GpuEcsAttachmentComponent gpuEcsAttachment)
+            {
+                DynamicBuffer<GpuEcsCurrentAttachmentAnchorBufferElement> currentAttachmentAnchors 
+                    = gpuEcsCurrentAttachmentAnchorLookup[gpuEcsAttachment.gpuEcsAnimatorEntity];
+                GpuEcsCurrentAttachmentAnchorBufferElement currentAnchor = currentAttachmentAnchors[gpuEcsAttachment.attachmentAnchorId];
+                localTransform = LocalTransform.FromMatrix(currentAnchor.currentTransform);
+            }
+        }
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/AnimatorSystem/GpuEcsAttachmentSystem.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ef7fb8eb346843f393c9a6f812fed55e
+timeCreated: 1692012598

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Baker.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 396ecc82f4964a3f94db7e59a6afcdf3
+timeCreated: 1678870574

+ 832 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakeServices.cs

@@ -0,0 +1,832 @@
+#if UNITY_EDITOR
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using GPUECSAnimationBaker.Engine.AnimatorSystem;
+using GpuEcsAnimationBaker.Engine.Data;
+using Unity.Collections;
+using Unity.Mathematics;
+using UnityEditor;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.Baker
+{
+    public static class GpuEcsAnimationBakerServices
+    {
+        private static readonly int AnimatedBoneMatrices = Shader.PropertyToID("_AnimatedBoneMatrices");
+        private static readonly int EnableAnimation = Shader.PropertyToID("_EnableAnimation");
+
+        public static bool ValidateAnimationBakerData(GpuEcsAnimationBakerData bakerData, GameObject sourceModel, out string errors)
+        {
+            StringBuilder sbErrors = new StringBuilder();
+            if (bakerData.animations.Length == 0)
+                sbErrors.AppendLine("At least one animation must be baked.");
+
+            foreach (AnimationData animation in bakerData.animations)
+            {
+                if (string.IsNullOrWhiteSpace(animation.animationID))
+                    sbErrors.AppendLine("Animation ID is mandatory");
+                if (!Regex.IsMatch(animation.animationID, @"^[a-zA-Z_][a-zA-Z0-9_]+$"))
+                    sbErrors.AppendLine("Animation ID must be only letters, numbers or underscore, must not start with number");
+                if (string.IsNullOrWhiteSpace(animation.animatorStateName))
+                    sbErrors.AppendLine("Animation State Name is mandatory");
+                if (animation.animationType == AnimationTypes.SingleClip)
+                {
+                    if (animation.singleClipData.animationClip == null)
+                        sbErrors.AppendLine("Animation Clip is mandatory");
+                }
+                else if (animation.animationType == AnimationTypes.DualClipBlend)
+                {
+                    if (string.IsNullOrWhiteSpace(animation.dualClipBlendData.blendParameterName))
+                        sbErrors.AppendLine("Blend parameter name is mandatory");
+                    if (animation.dualClipBlendData.clip1.animationClip == null)
+                        sbErrors.AppendLine("Animation Clip 1 is mandatory");
+                    if (animation.dualClipBlendData.clip1.animationClip == null)
+                        sbErrors.AppendLine("Animation Clip 2 is mandatory");
+                    if (animation.dualClipBlendData.nbrOfInBetweenSamples < 2)
+                        sbErrors.AppendLine("Nbr of in between samples must be at least 2");
+                    if (animation.dualClipBlendData.nbrOfInBetweenSamples > 100)
+                        sbErrors.AppendLine("Nbr of in between samples is maximum 100");
+                }
+
+                foreach (AnimatorParameter parameterValue in animation.additionalAnimatorParameterValues)
+                {
+                    if (string.IsNullOrWhiteSpace(parameterValue.parameterName))
+                        sbErrors.AppendLine("Additional animator parameter name is mandatory");
+                }
+            }
+
+            bool foundDouble = false;
+            for (int i = 0; i < bakerData.animations.Length; i++)
+            {
+                for (int j = i + 1; j < bakerData.animations.Length; j++)
+                {
+                    if (bakerData.animations[i].animationID == bakerData.animations[j].animationID)
+                    {
+                        foundDouble = true; break;
+                    }
+                }
+                if(foundDouble) break;
+            }
+            if(foundDouble) sbErrors.AppendLine("Animation IDs must be unique");
+
+            foreach (AttachmentAnchor attachmentAnchor in bakerData.attachmentAnchors)
+            {
+                if (string.IsNullOrWhiteSpace(attachmentAnchor.attachmentAnchorID))
+                    sbErrors.AppendLine("Attachment Anchor ID is mandatory");
+                if(attachmentAnchor.attachmentAnchorTransform == null)
+                    sbErrors.AppendLine("Attachment Anchor reference transform is mandatory");
+                else if(!hasParent(attachmentAnchor.attachmentAnchorTransform, sourceModel.transform))
+                    sbErrors.AppendLine($"Attachment Anchor reference transform must be nested inside {sourceModel.name}");
+            }
+            
+            if(bakerData.boneUsage.numberOfBonesPerVertex < 1) 
+                sbErrors.AppendLine("Nbr of bones per vertex must be at least 1");
+            foreach (BoneUsagePerLoD boneUsagePerLOD in bakerData.boneUsage.boneUsagesPerLoD)
+            {
+                if(boneUsagePerLOD.maxNumberOfBonesPerVertex < 1) 
+                    sbErrors.AppendLine("Nbr of bones per vertex must be at least 1");
+            }
+            
+            errors = sbErrors.ToString();
+            return sbErrors.Length == 0;
+        }
+
+        private static bool hasParent(Transform child, Transform parent)
+        {
+            if (child.parent == null) return false;
+            if (child.parent.gameObject == parent.gameObject) return true;
+            else return hasParent(child.parent, parent);
+        }
+
+        public static GameObject GenerateAnimationObject(string assetPath, 
+            GpuEcsAnimationBakerData bakerData, string animatorName, string generatedAssetsFolder, 
+            string nameSuffixAsset = "_GpuEcsAnimator",
+            string nameSuffixAnimationIDsEnum = "_AnimationIDs",
+            string nameSuffixAnimationInitializerBehaviour = "_AnimationInitializerBehaviour",
+            string nameSuffixAnimationEventIDsEnum = "_AnimationEventIDs",
+            string nameSuffixAnimationAnchorIDsEnum = "_AttachmentAnchorIDs",
+            string nameSuffixAttachmentInitializerBehaviour = "_AttachmentInitializerBehaviour",
+            string meshPartSuffix = "Mesh",
+            string animationMatricesTexturePartSuffix = "AnimationMatricesTexture", 
+            string materialPartSuffix = "Material"
+            )
+        {
+            GameObject sourceModel = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
+            GameObject refModel = PrefabUtility.LoadPrefabContents(assetPath);
+
+            Debug.Log($"Generating Animation object for {assetPath}");
+            GameObject animationObject = GenerateAnimationObjectFromModel(refModel, sourceModel, bakerData, animatorName, generatedAssetsFolder,
+                nameSuffixAsset, nameSuffixAnimationIDsEnum, nameSuffixAnimationInitializerBehaviour, nameSuffixAnimationEventIDsEnum,
+                nameSuffixAnimationAnchorIDsEnum, nameSuffixAttachmentInitializerBehaviour, meshPartSuffix, animationMatricesTexturePartSuffix, materialPartSuffix);
+            PrefabUtility.UnloadPrefabContents(refModel);
+            
+            return animationObject;
+        }
+        
+        public static GameObject GenerateAnimationObjectFromModel(GameObject refModel, GameObject sourceModel, 
+            GpuEcsAnimationBakerData bakerData, string animatorName, string generatedAssetsFolder,
+            string nameSuffixAsset = "_GpuEcsAnimator",
+            string nameSuffixAnimationIDsEnum = "_AnimationIDs",
+            string nameSuffixAnimationInitializerBehaviour = "_AnimationInitializerBehaviour",
+            string nameSuffixAnimationEventIDsEnum = "_AnimationEventIDs",
+            string nameSuffixAnimationAnchorIDsEnum = "_AttachmentAnchorIDs",
+            string nameSuffixAttachmentInitializerBehaviour = "_AttachmentInitializerBehaviour",
+            string meshPartSuffix = "Mesh",
+            string animationMatricesTexturePartSuffix = "AnimationMatricesTexture", 
+            string materialPartSuffix = "Material"
+            ) 
+        {
+            if(!ValidateAnimationBakerData(bakerData, sourceModel, out string errors))
+            {
+                Debug.LogError(errors);
+                return null;
+            }
+
+            string targetAssetPath =
+                Path.Combine(generatedAssetsFolder, $"{animatorName}{nameSuffixAsset}.prefab");
+            string targetAnimationEnumAssetPath =
+                Path.Combine(generatedAssetsFolder, $"{animatorName}{nameSuffixAnimationIDsEnum}.cs");
+            string targetAnimationInitializerBehaviourAssetPath =
+                Path.Combine(generatedAssetsFolder, $"{animatorName}{nameSuffixAnimationInitializerBehaviour}.cs");
+            string targetAnimationEventEnumAssetPath =
+                Path.Combine(generatedAssetsFolder, $"{animatorName}{nameSuffixAnimationEventIDsEnum}.cs");
+            string targetAttachmentAnchorEnumAssetPath =
+                Path.Combine(generatedAssetsFolder, $"{animatorName}{nameSuffixAnimationAnchorIDsEnum}.cs");
+            string targetAttachmentInitializerBehaviourAssetPath =
+                Path.Combine(generatedAssetsFolder, $"{animatorName}{nameSuffixAttachmentInitializerBehaviour}.cs");
+            
+            refModel.transform.position = Vector3.zero;
+            refModel.transform.rotation = quaternion.identity;
+            Animator refModelAnimator = refModel.GetComponent<Animator>();
+            refModelAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
+            LODGroup refModelLoDGroup = refModel.GetComponent<LODGroup>();
+            LOD[] refModelLoDs = refModelLoDGroup == null ? null : refModelLoDGroup.GetLODs();
+            List<AnimationMatricesTexture> animationMatricesTexturesCache = new List<AnimationMatricesTexture>();
+            List<EcsGpuMaterial> ecsGpuMaterialsCache = new List<EcsGpuMaterial>();
+
+            GameObject test = AssetDatabase.LoadAssetAtPath<GameObject>(targetAssetPath);
+            if (test == null)
+            {
+                GameObject empty = new GameObject(refModel.name);
+                PrefabUtility.SaveAsPrefabAsset(empty, targetAssetPath);
+                GameObject.DestroyImmediate(empty, allowDestroyingAssets:true);
+            }
+            GameObject target = PrefabUtility.LoadPrefabContents(targetAssetPath);
+            target.transform.localScale = refModel.transform.localScale;
+            GameObject[] toDestroy = new GameObject[target.transform.childCount];
+            for (int childIndex = 0; childIndex < target.transform.childCount; childIndex++)
+                toDestroy[childIndex] = target.transform.GetChild(childIndex).gameObject;
+            foreach(GameObject go in toDestroy) Object.DestroyImmediate(go, allowDestroyingAssets: true);
+            RemoveComponent<MeshRenderer>(target);
+            RemoveComponent<MeshFilter>(target);
+            RemoveComponent<LODGroup>(target);
+            RemoveComponent<GpuEcsAnimatorBehaviour>(target);
+            RemoveComponent<GpuEcsAnimatedMeshBehaviour>(target);
+            
+            GpuEcsAnimatorBehaviour gpuEcsAnimator = AddGpuEcsAnimationBehaviour(target, bakerData, out string[] eventNames);
+            gpuEcsAnimator.transformUsageFlags = bakerData.transformUsageFlagsParent;
+
+            Dictionary<GameObject, GameObject> sourceToTargetMapping = new Dictionary<GameObject, GameObject>();
+            ProcessAnimationObjectRecursive(refModel, target, sourceToTargetMapping, animatorName,
+                meshPartSuffix, animationMatricesTexturePartSuffix, materialPartSuffix,
+                refModelAnimator, refModelLoDs, animationMatricesTexturesCache, ecsGpuMaterialsCache,
+                bakerData, gpuEcsAnimator.animations, gpuEcsAnimator.totalNbrOfFrames, generatedAssetsFolder, gpuEcsAnimator);
+            if (refModelLoDs != null)
+            {
+                LODGroup targetLoDGroup = target.AddComponent<LODGroup>();
+                LOD[] targetLoDs = new LOD[refModelLoDs.Length];
+                for (int lodIndex = 0; lodIndex < refModelLoDs.Length; lodIndex++)
+                {
+                    targetLoDs[lodIndex] = refModelLoDs[lodIndex];
+                    Renderer[] refModelRenderers = refModelLoDs[lodIndex].renderers;
+                    for (int rendererIndex = 0; rendererIndex < refModelRenderers.Length; rendererIndex++)
+                    {
+                        targetLoDs[lodIndex].renderers[rendererIndex] =
+                            sourceToTargetMapping[refModelRenderers[rendererIndex].gameObject].GetComponent<MeshRenderer>();
+                    }
+                }
+                targetLoDGroup.SetLODs(targetLoDs);
+            }
+            
+            if(bakerData.generateAnimationIdsEnum)
+                GenerateAnimationsEnumCode(bakerData, targetAnimationEnumAssetPath, targetAnimationInitializerBehaviourAssetPath);
+            
+            if(bakerData.generateAnimationEventIdsEnum)
+                GenerateAnimationEventsEnumCode(bakerData, targetAnimationEventEnumAssetPath, eventNames );
+
+            gpuEcsAnimator.nbrOfAttachmentAnchors = bakerData.attachmentAnchors.Length;
+            gpuEcsAnimator.attachmentAnchorData = BakeAttachmentAnchorTransforms(generatedAssetsFolder, sourceModel, animatorName, 
+                refModelAnimator, bakerData, gpuEcsAnimator.animations, gpuEcsAnimator.totalNbrOfFrames);
+            
+            if(bakerData.generateAttachmentAnchorIdsEnum)
+                GenerateAttachmentAnchorsEnumCode(bakerData, targetAttachmentAnchorEnumAssetPath, targetAttachmentInitializerBehaviourAssetPath);
+            
+            PrefabUtility.SaveAsPrefabAsset(target, targetAssetPath);
+            PrefabUtility.UnloadPrefabContents(target);
+            
+            return AssetDatabase.LoadAssetAtPath<GameObject>(targetAssetPath);
+        }
+
+        private const string enumFileTemplate = "namespace GPUECSAnimationBaker.Engine.AnimatorSystem\n"
+                                                + "{\n"
+                                                + "    public enum @ENUMNAME@\n"
+                                                + "    {\n"
+                                                + "@IDLIST@\n"
+                                                + "    }\n"
+                                                + "}";
+
+        private const string behaviourFileTemplate = "namespace GPUECSAnimationBaker.Engine.AnimatorSystem\n"
+                                                + "{\n"
+                                                + "    public class @CLASSNAME_@ENUMNAME@_Behaviour : @CLASSNAMEBehaviour<@ENUMNAME@> { } \n"
+                                                + "}";
+        
+        private static void GenerateAnimationsEnumCode(GpuEcsAnimationBakerData bakerData, string targetEnumAssetPath, string targetEnumBehaviourAssetPath)
+        {
+            GenerateEnumCodeFiles<AnimationData>($"AnimationIds{bakerData.animationIdsEnumName}", "GpuEcsAnimatorInitializer",
+                bakerData.animations, (animationData) => animationData.animationID, targetEnumAssetPath, targetEnumBehaviourAssetPath);
+        }
+
+        private static void GenerateAnimationEventsEnumCode(GpuEcsAnimationBakerData bakerData, string targetEnumAssetPath, string[] eventNames)
+        {
+            GenerateEnumCodeFiles<string>($"AnimationEventIds{bakerData.animationEventIdsEnumName}", null,
+                eventNames, (name) => name, targetEnumAssetPath, null);
+        }
+        
+        private static void GenerateAttachmentAnchorsEnumCode(GpuEcsAnimationBakerData bakerData, string targetEnumAssetPath, string targetEnumBehaviourAssetPath)
+        {
+            GenerateEnumCodeFiles<AttachmentAnchor>($"AnchorIds{bakerData.attachmentAnchorIdsEnumName}", "GpuEcsAttachmentInitializer", 
+                bakerData.attachmentAnchors, (attachmentAnchor) => attachmentAnchor.attachmentAnchorID, targetEnumAssetPath, targetEnumBehaviourAssetPath);
+        }
+        
+        private static void GenerateEnumCodeFiles<T>(string enumName, string className, T[] list, System.Func<T, string> listIdGetter, 
+            string targetEnumAssetPath, string targetEnumBehaviourAssetPath)
+        {
+            StringBuilder idList = new StringBuilder();
+            for (int index = 0; index < list.Length; index++)
+            {
+                idList.Append($"        {listIdGetter(list[index])} = {index.ToString()}");
+                if (index < list.Length - 1)
+                {
+                    idList.AppendLine(",");
+                }
+            }
+            
+            string enumCodeText = enumFileTemplate
+                .Replace("@ENUMNAME@", enumName)
+                .Replace("@IDLIST@", idList.ToString());
+            string enumCodePath = Path.Combine(Application.dataPath, "../" + targetEnumAssetPath); 
+            File.WriteAllText(enumCodePath, enumCodeText);
+
+            if (targetEnumBehaviourAssetPath != null)
+            {
+                string enumBehaviourText = behaviourFileTemplate
+                    .Replace("@CLASSNAME", className)
+                    .Replace("@ENUMNAME@", enumName);
+                string enumBehaviourPath = Path.Combine(Application.dataPath, "../" + targetEnumBehaviourAssetPath);
+                File.WriteAllText(enumBehaviourPath, enumBehaviourText);
+            }
+
+            AssetDatabase.Refresh();
+        }
+
+        private static GpuEcsAnimatorBehaviour AddGpuEcsAnimationBehaviour(GameObject target,
+            GpuEcsAnimationBakerData bakerData, out string[] eventNames)
+        {
+            GpuEcsAnimatorBehaviour gpuEcsAnimator = target.AddComponent<GpuEcsAnimatorBehaviour>();
+            gpuEcsAnimator.animations = new GpuEcsAnimationData[bakerData.animations.Length];
+            // gpuEcsAnimator.BackAnimationDatas= new AnimationData[bakerData.animations.Length];
+            List<GpuEcsAnimationEventOccurence> occurences = new List<GpuEcsAnimationEventOccurence>();
+            List<string> foundEvents = new List<string>();
+
+            int currentFrameIndex = 0;
+            int currentEventOccurenceId = 0;
+            int currentFoundEventId = 0;
+            for (int animationIndex = 0; animationIndex < bakerData.animations.Length; animationIndex++)
+            {
+                AnimationData animationData = bakerData.animations[animationIndex];
+                int nbrOfFramesPerSample = 0;
+                int nbrOfInBetweenSamples = 0;
+                float blendTimeCorrection = 1;
+                int startEventOccurenceId = currentEventOccurenceId;
+                int nbrOfEventOccurenceIds = 0;
+                if (animationData.animationType == AnimationTypes.SingleClip)
+                {
+                    SingleClipData singleClipData = animationData.singleClipData;
+                    nbrOfFramesPerSample = (int)(singleClipData.animationClip.length * GlobalConstants.SampleFrameRate) + 1;
+                    nbrOfInBetweenSamples = 1;
+                    blendTimeCorrection = 1;
+                    AddAnimationEvents(bakerData, animationData, occurences, ref currentEventOccurenceId, ref nbrOfEventOccurenceIds, foundEvents, 
+                        ref currentFoundEventId, singleClipData.animationClip);
+                }
+                else if (animationData.animationType == AnimationTypes.DualClipBlend)
+                {
+                    DualClipBlendData dualClipBlendData = animationData.dualClipBlendData;
+                    int clip1NbrOfFrames = (int)(dualClipBlendData.clip1.animationClip.length * GlobalConstants.SampleFrameRate) + 1;
+                    int clip2NbrOfFrames = (int)(dualClipBlendData.clip2.animationClip.length * GlobalConstants.SampleFrameRate) + 1;
+                    nbrOfFramesPerSample = math.max(clip1NbrOfFrames, clip2NbrOfFrames);
+                    blendTimeCorrection = dualClipBlendData.clip1.animationClip.length / dualClipBlendData.clip2.animationClip.length;
+                    nbrOfInBetweenSamples = dualClipBlendData.nbrOfInBetweenSamples;
+                    AddAnimationEvents(bakerData, animationData, occurences, ref currentEventOccurenceId, ref nbrOfEventOccurenceIds, foundEvents, 
+                        ref currentFoundEventId, dualClipBlendData.clip1.animationClip);
+                    AddAnimationEvents(bakerData, animationData, occurences, ref currentEventOccurenceId, ref nbrOfEventOccurenceIds, foundEvents, 
+                        ref currentFoundEventId, dualClipBlendData.clip2.animationClip);
+                }
+                bool loop = animationData.loop;
+                
+                gpuEcsAnimator.animations[animationIndex] = new GpuEcsAnimationData()
+                {
+                    startFrameIndex = currentFrameIndex,
+                    nbrOfFramesPerSample = nbrOfFramesPerSample,
+                    nbrOfInBetweenSamples = nbrOfInBetweenSamples,
+                    blendTimeCorrection = blendTimeCorrection,
+                    startEventOccurenceId = startEventOccurenceId,
+                    nbrOfEventOccurenceIds = nbrOfEventOccurenceIds,
+                    loop = loop,
+                    animationID = animationData.animationID,
+                    stateName = animationData.animatorStateName
+                };
+                currentFrameIndex += nbrOfFramesPerSample * nbrOfInBetweenSamples;
+            }
+            gpuEcsAnimator.totalNbrOfFrames = currentFrameIndex;
+            gpuEcsAnimator.animationEventOccurences = occurences.ToArray();
+            eventNames = bakerData.usePredefinedAnimationEventIds ? bakerData.predefinedAnimationEventIds : foundEvents.ToArray();
+            return gpuEcsAnimator;
+        }
+
+        private static void AddAnimationEvents(GpuEcsAnimationBakerData bakerData, AnimationData animationData, 
+            List<GpuEcsAnimationEventOccurence> occurences, 
+            ref int currentEventOccurenceId, ref int nbrOfEventOccurenceIds, 
+            List<string> foundEvents, ref int currentFoundEventId, AnimationClip animationClip)
+        {
+            AnimationEvent[] animationEvents = AnimationUtility.GetAnimationEvents(animationClip);
+            foreach (AnimationEvent animationEvent in animationEvents)
+            {
+                int eventId = -1;
+                if (bakerData.usePredefinedAnimationEventIds)
+                {
+                    eventId = bakerData.predefinedAnimationEventIds.ToList().FindIndex((n) => n.Equals(animationEvent.stringParameter));
+                    if(eventId == -1) Debug.LogWarning(
+                        $"Found event {animationEvent.stringParameter} that is not in the predefined event Ids list, so it will be ignored.");
+                }
+                else
+                {
+                    string name = $"{animationData.animationID}_{animationEvent.stringParameter}";
+                    eventId = foundEvents.FindIndex((n) => n.Equals(name));
+                    if (eventId == -1)
+                    {
+                        eventId = currentFoundEventId;
+                        foundEvents.Add(name);
+                        currentFoundEventId++;
+                    }
+                }
+
+                if (eventId != -1)
+                {
+                    occurences.Add(new GpuEcsAnimationEventOccurence()
+                    {
+                        eventId = eventId,
+                        eventNormalizedTime = animationEvent.time / animationClip.length,
+                    });
+                    currentEventOccurenceId++;
+                    nbrOfEventOccurenceIds++;
+                }
+            }
+        }
+        
+        private static void ProcessAnimationObjectRecursive(GameObject sourceNode, GameObject targetNode, 
+            Dictionary<GameObject, GameObject> sourceToTargetMapping, string animatorName, string meshPartSuffix,
+            string animationMatricesTexturePartSuffix, string materialPartSuffix,
+            Animator refModelAnimator, LOD[] refModelLoDs, 
+            List<AnimationMatricesTexture> animationMatricesTexturesCache, List<EcsGpuMaterial> ecsGpuMaterialsCache, 
+            GpuEcsAnimationBakerData bakerData, GpuEcsAnimationData[] animations, int totalNbrOfFrames,
+            string generatedAssetsFolder, GpuEcsAnimatorBehaviour gpuEcsAnimator)
+        {
+            sourceToTargetMapping.Add(sourceNode, targetNode);
+            SkinnedMeshRenderer existingSkinnedMeshRenderer = sourceNode.GetComponent<SkinnedMeshRenderer>();
+            if (existingSkinnedMeshRenderer != null)
+            {
+                Texture2D animationMatricesTexture = BakeAndSaveAnimationMatricesTexture(
+                    animationMatricesTexturesCache, generatedAssetsFolder, animatorName, animationMatricesTexturePartSuffix,
+                    refModelAnimator, bakerData, existingSkinnedMeshRenderer, animations, totalNbrOfFrames);
+                Mesh newMesh = BakeAndSaveBoneWeightsIntoMesh(refModelLoDs, generatedAssetsFolder, animatorName,
+                    meshPartSuffix, bakerData, existingSkinnedMeshRenderer);
+
+                MeshFilter meshFilter = targetNode.AddComponent<MeshFilter>();
+                MeshRenderer meshRenderer = targetNode.AddComponent<MeshRenderer>();
+                Material newMaterial = CreateAndSaveEcsGpuMaterial(ecsGpuMaterialsCache, generatedAssetsFolder,
+                    animatorName, materialPartSuffix, existingSkinnedMeshRenderer);
+                newMaterial.SetTexture(AnimatedBoneMatrices, animationMatricesTexture);
+                meshRenderer.sharedMaterial = newMaterial;
+                meshFilter.sharedMesh = newMesh;
+
+                GpuEcsAnimatedMeshBehaviour gpuEcsAnimatedMesh = targetNode.AddComponent<GpuEcsAnimatedMeshBehaviour>();
+                gpuEcsAnimatedMesh.animator = gpuEcsAnimator;
+                gpuEcsAnimatedMesh.transformUsageFlags = bakerData.transformUsageFlagsChildren;
+            }
+
+            for (int childIndex = 0; childIndex < sourceNode.transform.childCount; childIndex++)
+            {
+                GameObject sourceChild = sourceNode.transform.GetChild(childIndex).gameObject;
+                if (sourceChild.gameObject.activeSelf && !CheckEmptyRecursive(sourceChild))
+                {
+                    GameObject targetChild = new GameObject(sourceChild.name);
+                    targetChild.transform.parent = targetNode.transform;
+                    targetChild.transform.localPosition = sourceChild.transform.localPosition;
+                    targetChild.transform.localRotation = sourceChild.transform.localRotation;
+                    targetChild.transform.localScale = sourceChild.transform.localScale;
+                    ProcessAnimationObjectRecursive(sourceChild, targetChild, sourceToTargetMapping,
+                        animatorName, meshPartSuffix, animationMatricesTexturePartSuffix, materialPartSuffix,
+                        refModelAnimator, refModelLoDs, animationMatricesTexturesCache, ecsGpuMaterialsCache,
+                        bakerData, animations, totalNbrOfFrames, generatedAssetsFolder, gpuEcsAnimator);
+                }
+            }
+        }
+
+        private static void RemoveComponent<T>(GameObject gameObject)  where T : Component 
+        {
+            T component = gameObject.GetComponent<T>();
+            if(component != null) Object.DestroyImmediate(component, allowDestroyingAssets:true);
+        }
+        
+        private static bool CheckEmptyRecursive(GameObject node)
+        {
+            Component[] components = node.GetComponents<Component>();
+            bool empty = !components.Any(c => (c is SkinnedMeshRenderer));
+            if (empty)
+            {
+                for (int childIndex = 0; childIndex < node.transform.childCount; childIndex++)
+                {
+                    empty = CheckEmptyRecursive(node.transform.GetChild(childIndex).gameObject);
+                    if (!empty) break;
+                }
+            }
+
+            return empty;
+        }
+        
+        private static Mesh BakeAndSaveBoneWeightsIntoMesh(LOD[] refModelLoDs,
+            string generatedAssetsFolder, string animatorName, string meshPartSuffix, GpuEcsAnimationBakerData bakerData,
+            SkinnedMeshRenderer skinnedMeshRenderer)
+        {
+            int maxNumberOfBonesPerVertex = GetMaxNumberOfBonesPerVertex(refModelLoDs, bakerData, skinnedMeshRenderer);
+            Mesh newMesh = BakeBoneWeightsIntoMesh(skinnedMeshRenderer.sharedMesh, maxNumberOfBonesPerVertex);
+            SavePartAsAsset(newMesh, generatedAssetsFolder, animatorName, skinnedMeshRenderer, meshPartSuffix, "mesh");
+            return newMesh;
+        }
+
+        private static Texture2D BakeAndSaveAnimationMatricesTexture(List<AnimationMatricesTexture> cache,
+            string generatedAssetsFolder, string animatorName, string animationMatricesTexturePartSuffix,
+            Animator refModelAnimator, GpuEcsAnimationBakerData bakerData,
+            SkinnedMeshRenderer skinnedMeshRenderer, GpuEcsAnimationData[] animations, int totalNbrOfFrames)
+        {
+            if (!CheckAnimationMatricesTextureInCache(cache, skinnedMeshRenderer, out Texture2D animationMatricesTexture))
+            {
+                animationMatricesTexture = BakeAnimationMatricesTexture(skinnedMeshRenderer, refModelAnimator, bakerData,
+                    animations, totalNbrOfFrames);
+                SavePartAsAsset(animationMatricesTexture, generatedAssetsFolder, animatorName, skinnedMeshRenderer,
+                    animationMatricesTexturePartSuffix, "asset");
+                    
+                cache.Add(new AnimationMatricesTexture()
+                {
+                    texture = animationMatricesTexture,
+                    skinnedMeshRenderer = skinnedMeshRenderer
+                });
+            }
+            return animationMatricesTexture;
+        }
+
+        private static Material CreateAndSaveEcsGpuMaterial(List<EcsGpuMaterial> cache,
+            string generatedAssetsFolder, string animatorName, string materialPartSuffix,
+            SkinnedMeshRenderer skinnedMeshRenderer)
+        {
+            if (!CheckEcsGpuMaterialInCache(cache, skinnedMeshRenderer, out Material ecsGpuMaterial))
+            {
+                ecsGpuMaterial = Object.Instantiate<Material>(skinnedMeshRenderer.sharedMaterial);
+                ecsGpuMaterial.SetFloat(EnableAnimation, 0);
+                SavePartAsAsset(ecsGpuMaterial, generatedAssetsFolder, animatorName, skinnedMeshRenderer,
+                    materialPartSuffix, "mat");
+                cache.Add(new EcsGpuMaterial()
+                {
+                    material = ecsGpuMaterial,
+                    skinnedMeshRenderer = skinnedMeshRenderer
+                });
+            }
+            return ecsGpuMaterial;
+        }
+
+        private static string GenerateAssetPath(string generatedAssetsFolder, string animatorName,
+            string assetName, string assetFileExtension)
+        {
+            return Path.Combine(generatedAssetsFolder, $"{animatorName}_{assetName}.{assetFileExtension}");
+        }
+        
+        private static void SavePartAsAsset(Object asset, string generatedAssetsFolder, string animatorName,
+            SkinnedMeshRenderer skinnedMeshRenderer, string partName, string assetFileExtension)
+        {
+            string assetName = $"{partName}_{skinnedMeshRenderer.name}";
+            string assetPath = GenerateAssetPath(generatedAssetsFolder, animatorName, assetName, assetFileExtension);
+            AssetDatabase.CreateAsset(asset, assetPath);
+        }
+        
+        private static int GetMaxNumberOfBonesPerVertex(LOD[] refModelLoDs, GpuEcsAnimationBakerData bakerData,
+            SkinnedMeshRenderer skinnedMeshRenderer)
+        {
+            int maxNumberOfBonesPerVertex = bakerData.boneUsage.numberOfBonesPerVertex;
+            if (refModelLoDs != null)
+            {
+                for (int lodIndex = 0; lodIndex < refModelLoDs.Length; lodIndex++)
+                {
+                    if (refModelLoDs[lodIndex].renderers.Any(r => r == (Renderer)skinnedMeshRenderer))
+                    {
+                        BoneUsagePerLoD boneUsagePerLoD = bakerData.boneUsage.boneUsagesPerLoD
+                            .SingleOrDefault(b => b.lodIndex == lodIndex);
+                        if (boneUsagePerLoD != null)
+                            maxNumberOfBonesPerVertex = boneUsagePerLoD.maxNumberOfBonesPerVertex;
+                        break;
+                    }
+                }
+            }
+            return maxNumberOfBonesPerVertex;
+        }
+
+        private static bool CheckAnimationMatricesTextureInCache(List<AnimationMatricesTexture> cache,
+            SkinnedMeshRenderer skinnedMeshRenderer, out Texture2D foundTexture)
+        {
+            bool found = false;
+            foundTexture = null; 
+            foreach (AnimationMatricesTexture cachedTexture in cache)
+            {
+                if (CheckSkinnedMeshRendererHasSameBones(cachedTexture.skinnedMeshRenderer,
+                        skinnedMeshRenderer))
+                {
+                    found = true;
+                    foundTexture = cachedTexture.texture;
+                    break;
+                }
+            }
+            return found;
+        }
+
+        private static bool CheckEcsGpuMaterialInCache(List<EcsGpuMaterial> cache,
+            SkinnedMeshRenderer skinnedMeshRenderer, out Material foundMaterial)
+        {
+            bool found = false;
+            foundMaterial = null;
+            foreach (EcsGpuMaterial cachedEcsGpuMaterial in cache)
+            {
+                if (cachedEcsGpuMaterial.skinnedMeshRenderer.sharedMaterial == skinnedMeshRenderer.sharedMaterial
+                    && CheckSkinnedMeshRendererHasSameBones(cachedEcsGpuMaterial.skinnedMeshRenderer,
+                        skinnedMeshRenderer))
+                {
+                    found = true;
+                    foundMaterial = cachedEcsGpuMaterial.material;
+                    break;
+                }
+            }
+            return found;
+        }
+        
+        private static bool CheckSkinnedMeshRendererHasSameBones(SkinnedMeshRenderer skinnedMeshRendererA,
+            SkinnedMeshRenderer skinnedMeshRendererB)
+        {
+            bool hasSameBones = false;
+            if (skinnedMeshRendererA.bones.Length == skinnedMeshRendererB.bones.Length)
+            {
+                hasSameBones = true;
+                for (int i = 0; i < skinnedMeshRendererA.bones.Length; i++)
+                {
+                    if (!CheckMatrixEquality(skinnedMeshRendererA.bones[i].localToWorldMatrix,
+                            skinnedMeshRendererB.bones[i].localToWorldMatrix))
+                    {
+                        hasSameBones = false; break;
+                    }
+                    if (!CheckMatrixEquality(skinnedMeshRendererA.sharedMesh.bindposes[i],
+                            skinnedMeshRendererB.sharedMesh.bindposes[i]))
+                    {
+                        hasSameBones = false; break;
+                    }
+                }
+            }
+            return hasSameBones;
+        }
+
+        private static bool CheckMatrixEquality(Matrix4x4 m1, Matrix4x4 m2)
+        {
+            return m1.m00 == m2.m00 && m1.m01 == m2.m01 && m1.m02 == m2.m02 && m1.m03 == m2.m03
+                   && m1.m10 == m2.m10 && m1.m11 == m2.m11 && m1.m12 == m2.m12 && m1.m13 == m2.m13
+                   && m1.m20 == m2.m20 && m1.m21 == m2.m21 && m1.m22 == m2.m22 && m1.m23 == m2.m23
+                   && m1.m30 == m2.m30 && m1.m31 == m2.m31 && m1.m32 == m2.m32 && m1.m33 == m2.m33;
+        }
+
+        private static void IterateOverAllFramesThroughAnimator(
+            Animator refModelAnimator, GpuEcsAnimationBakerData bakerData, GpuEcsAnimationData[] animations,
+            System.Action<int> actionPerFrame)
+        {
+            refModelAnimator.speed = 0;
+            int currentFrameIndex = 0;
+
+            for (int animationIndex = 0; animationIndex < bakerData.animations.Length; animationIndex++)
+            {
+                AnimationData animationData = bakerData.animations[animationIndex];
+                GpuEcsAnimationData gpuEcsAnimationData = animations[animationIndex];
+                foreach (AnimatorParameter parameterValue in animationData.additionalAnimatorParameterValues)
+                {
+                    if(parameterValue.parameterType == AnimatorParameterTypes.Bool)
+                        refModelAnimator.SetBool(parameterValue.parameterName, parameterValue.boolValue);
+                    else if(parameterValue.parameterType == AnimatorParameterTypes.Float)
+                        refModelAnimator.SetFloat(parameterValue.parameterName, parameterValue.floatValue);
+                    else if(parameterValue.parameterType == AnimatorParameterTypes.Integer)
+                        refModelAnimator.SetInteger(parameterValue.parameterName, parameterValue.intValue);
+                }
+                
+                for (int sampleIndex = 0; sampleIndex < gpuEcsAnimationData.nbrOfInBetweenSamples; sampleIndex++)
+                {
+                    if (animationData.animationType == AnimationTypes.DualClipBlend)
+                    {
+                        DualClipBlendData dualClipBlendData = animationData.dualClipBlendData;
+                        float sampleRatio = (float)sampleIndex / (float)(gpuEcsAnimationData.nbrOfInBetweenSamples - 1);
+                        float blendValue = dualClipBlendData.clip1.parameterValue +
+                            (dualClipBlendData.clip2.parameterValue - dualClipBlendData.clip1.parameterValue) * sampleRatio;
+                        refModelAnimator.SetFloat(dualClipBlendData.blendParameterName, blendValue);
+                    }
+
+                    for (int frameIndex = 0; frameIndex < gpuEcsAnimationData.nbrOfFramesPerSample; frameIndex++)
+                    {
+                        float progressRatio = (float)frameIndex / (float)(gpuEcsAnimationData.nbrOfFramesPerSample - 1);
+                        refModelAnimator.Play(animationData.animatorStateName, -1, progressRatio);
+                        foreach(AnimatorState animatorState in animationData.additionalAnimatorStatesPerLayer)
+                            refModelAnimator.Play(animatorState.stateName, animatorState.layer, progressRatio);
+                        refModelAnimator.Update(0);
+
+                        actionPerFrame(currentFrameIndex);
+                        
+                        currentFrameIndex++;
+                    }
+                }
+            }
+        }
+
+        private static GpuEcsAttachmentAnchorData BakeAttachmentAnchorTransforms(string generatedAssetsFolder, GameObject sourceModel,
+            string animatorName, Animator refModelAnimator, GpuEcsAnimationBakerData bakerData, GpuEcsAnimationData[] animations,
+            int totalNbrOfFrames)
+        {
+            int nbrOfAttachments = bakerData.attachmentAnchors.Length;
+            if (nbrOfAttachments == 0) return null;
+            else
+            {
+                GpuEcsAttachmentAnchorData gpuEcsAttachmentAnchorData = ScriptableObject.CreateInstance<GpuEcsAttachmentAnchorData>();
+                gpuEcsAttachmentAnchorData.anchorTransforms = new float4x4[totalNbrOfFrames * nbrOfAttachments];
+
+                for (int attachmentAnchorIndex = 0; attachmentAnchorIndex < nbrOfAttachments; attachmentAnchorIndex++)
+                {
+                    AttachmentAnchor attachmentAnchor = bakerData.attachmentAnchors[attachmentAnchorIndex];
+                    Transform referenceAnchorTransform = attachmentAnchor.attachmentAnchorTransform;
+                    Stack<int> siblingIndexStack = new Stack<int>();
+                    GetSiblingIndexStack(referenceAnchorTransform, sourceModel.transform, siblingIndexStack);
+                    Transform anchorTransform = refModelAnimator.transform;
+                    while (siblingIndexStack.Count > 0)
+                        anchorTransform = anchorTransform.GetChild(siblingIndexStack.Pop());
+                    Debug.Assert(anchorTransform.name.Equals(referenceAnchorTransform.name));
+
+                    int baseIndex = attachmentAnchorIndex * totalNbrOfFrames;
+                    IterateOverAllFramesThroughAnimator(refModelAnimator, bakerData, animations,
+                        (currentFrameIndex) =>
+                        {
+                            gpuEcsAttachmentAnchorData.anchorTransforms[baseIndex + currentFrameIndex] = anchorTransform.localToWorldMatrix;
+                        });
+
+                }
+
+                string assetPath = GenerateAssetPath(generatedAssetsFolder, animatorName, "AttachmentAnchors", "asset");
+                AssetDatabase.CreateAsset(gpuEcsAttachmentAnchorData, assetPath);
+                return gpuEcsAttachmentAnchorData;
+            }
+        }
+
+        private static void GetSiblingIndexStack(Transform current, Transform root, Stack<int> currentStack)
+        {
+            if(current.gameObject == root.gameObject) return;
+            currentStack.Push(current.GetSiblingIndex());
+            GetSiblingIndexStack(current.parent, root, currentStack);
+        }
+        
+        private static Texture2D BakeAnimationMatricesTexture(SkinnedMeshRenderer skinnedMeshRenderer, 
+            Animator refModelAnimator, GpuEcsAnimationBakerData bakerData, GpuEcsAnimationData[] animations,
+            int totalNbrOfFrames)
+        {
+            int boneCount = skinnedMeshRenderer.bones.Length;
+            int animationMatricesTextureWidth = boneCount * 3;
+
+            NativeArray<half4> animatedBoneMatricesTextureData = new NativeArray<half4>(
+                totalNbrOfFrames * animationMatricesTextureWidth, Allocator.Temp);
+
+            float4x4 invSkinnedMeshRendererLocalToWorld =  math.inverse(skinnedMeshRenderer.transform.localToWorldMatrix);
+            IterateOverAllFramesThroughAnimator(refModelAnimator, bakerData, animations,
+                (currentFrameIndex) =>
+                {
+                    for (int boneIndex = 0; boneIndex < boneCount; boneIndex++)
+                    {
+                        Transform boneTransform = skinnedMeshRenderer.bones[boneIndex];
+                        if (boneTransform != null)
+                        {
+                            float4x4 matrix = math.mul(
+                                math.mul(invSkinnedMeshRendererLocalToWorld, boneTransform.localToWorldMatrix),
+                                skinnedMeshRenderer.sharedMesh.bindposes[boneIndex]
+                            );
+                            Debug.Assert(Mathf.Approximately(matrix[0][3], 0f)
+                                && Mathf.Approximately(matrix[1][3], 0f)
+                                && Mathf.Approximately(matrix[2][3], 0f)
+                                && Mathf.Approximately(matrix[3][3], 1f), "matrix row 4 must be 0,0,0,1");
+                            int matrixIndex = (currentFrameIndex * animationMatricesTextureWidth) + (boneIndex * 3);
+                            for (int i = 0; i < 3; i++)
+                                animatedBoneMatricesTextureData[matrixIndex + i] = new half4(
+                                    (half)matrix[0][i], (half)matrix[1][i], (half)matrix[2][i], (half)matrix[3][i]);
+                        }
+                    }
+                });
+
+            Texture2D animationMatricesTexture = new Texture2D(animationMatricesTextureWidth, totalNbrOfFrames, 
+                TextureFormat.RGBAHalf, false);
+            animationMatricesTexture.SetPixelData(animatedBoneMatricesTextureData, 0);
+            animationMatricesTexture.Apply();
+
+            animatedBoneMatricesTextureData.Dispose();
+
+            return animationMatricesTexture;
+        }
+        
+        private static Mesh BakeBoneWeightsIntoMesh(Mesh sourceMesh, int maxNumberOfBonesPerVertex)
+        {
+            Mesh mesh = GameObject.Instantiate(sourceMesh);
+            
+            int vertexCount = mesh.vertices.Length;
+            NativeArray<Vector4> uvs1 = new NativeArray<Vector4>(vertexCount, Allocator.Temp);
+            NativeArray<Vector4> uvs2 = new NativeArray<Vector4>(vertexCount, Allocator.Temp);
+            NativeArray<Vector4> uvs3 = new NativeArray<Vector4>(vertexCount, Allocator.Temp);
+            NativeArray<byte> bonesPerVertex = mesh.GetBonesPerVertex();
+            NativeArray<BoneWeight1> boneWeightsSource = mesh.GetAllBoneWeights();
+
+            int startBoneWeightIndex = 0;
+
+            for (int vertIndex = 0; vertIndex < vertexCount; vertIndex++)
+            {
+                float totalWeight = 0f;
+                float totalWeightCapped = 0f;
+                int numberOfBonesForThisVertex = bonesPerVertex[vertIndex];
+
+                int boneWeightIndexTemp = startBoneWeightIndex;
+                for (int i = 0; i < numberOfBonesForThisVertex; i++)
+                {
+                    BoneWeight1 currentBoneWeight = boneWeightsSource[boneWeightIndexTemp];
+                    totalWeight += currentBoneWeight.weight;
+                    if (i < maxNumberOfBonesPerVertex) totalWeightCapped += currentBoneWeight.weight;
+                    if (i > 0) Debug.Assert(boneWeightsSource[boneWeightIndexTemp - 1].weight >= currentBoneWeight.weight);
+                    boneWeightIndexTemp++;
+                }
+                Debug.Assert(Mathf.Approximately(1f, totalWeight));
+
+                float weightMultiplier = totalWeight / totalWeightCapped;
+                int nbrOfBonesToBake = math.min(maxNumberOfBonesPerVertex, numberOfBonesForThisVertex);
+
+                totalWeight = 0f;
+                boneWeightIndexTemp = startBoneWeightIndex;
+                float4 uv1 = float4.zero;
+                float4 uv2 = float4.zero;
+                float4 uv3 = float4.zero;
+                for (int i = 0; i < nbrOfBonesToBake; i++)
+                {
+                    BoneWeight1 currentBoneWeight = boneWeightsSource[boneWeightIndexTemp];
+                    float adjustedWeight = currentBoneWeight.weight * weightMultiplier; 
+                    totalWeight += adjustedWeight;
+                    boneWeightIndexTemp++;
+                    if      (i == 0) uv1 = new float4(currentBoneWeight.boneIndex, adjustedWeight, uv1.z, uv1.w);
+                    else if (i == 1) uv1 = new float4(uv1.x, uv1. y, currentBoneWeight.boneIndex, adjustedWeight);
+                    else if (i == 2) uv2 = new float4(currentBoneWeight.boneIndex, adjustedWeight, uv2.z, uv2.w);
+                    else if (i == 3) uv2 = new float4(uv2.x, uv2. y, currentBoneWeight.boneIndex, adjustedWeight);
+                    else if (i == 4) uv3 = new float4(currentBoneWeight.boneIndex, adjustedWeight, uv3.z, uv3.w);
+                    else if (i == 5) uv3 = new float4(uv3.x, uv3. y, currentBoneWeight.boneIndex, adjustedWeight);
+                }
+                Debug.Assert(Mathf.Approximately(1f, totalWeight));
+                uvs1[vertIndex] = uv1;
+                uvs2[vertIndex] = uv2;
+                uvs3[vertIndex] = uv3;
+                startBoneWeightIndex += numberOfBonesForThisVertex;
+            }
+            
+            mesh.SetUVs(1, uvs1);
+            mesh.SetUVs(2, uvs2);
+            mesh.SetUVs(3, uvs3);
+            
+            uvs1.Dispose();
+            uvs2.Dispose();
+            uvs3.Dispose();
+            bonesPerVertex.Dispose();
+            boneWeightsSource.Dispose();
+            return mesh;
+        }
+    }
+}
+#endif

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakeServices.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 63f784a8ff004921b1d2dccaf617a1b3
+timeCreated: 1678439503

+ 31 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerBehaviour.cs

@@ -0,0 +1,31 @@
+using System;
+using GpuEcsAnimationBaker.Engine.Data;
+using Unity.Entities;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.Baker
+{
+    [DisallowMultipleComponent]
+    [RequireComponent(typeof(Animator))]
+    public class GpuEcsAnimationBakerBehaviour : MonoBehaviour
+    {
+        public GpuEcsAnimationBakerData bakerData = new GpuEcsAnimationBakerData()
+        {
+            animations = Array.Empty<AnimationData>(),
+            generateAnimationIdsEnum = false,
+            animationIdsEnumName = "",
+            attachmentAnchors = Array.Empty<AttachmentAnchor>(),
+            generateAttachmentAnchorIdsEnum = false,
+            attachmentAnchorIdsEnumName = "",
+            boneUsage = new BoneUsage()
+            {
+                numberOfBonesPerVertex = 6,
+                boneUsagesPerLoD = Array.Empty<BoneUsagePerLoD>()
+            },
+            transformUsageFlagsParent = TransformUsageFlags.Dynamic,
+            transformUsageFlagsChildren = TransformUsageFlags.Renderable
+        };
+        [Tooltip("The last generated GPU ECS animator. This is used so that existing references will not be lost after regeneration")]
+        public GameObject gpuEcsAnimator;
+    }
+}

+ 11 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerBehaviour.cs.meta

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

+ 79 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerEditor.cs

@@ -0,0 +1,79 @@
+#if UNITY_EDITOR
+using System.IO;
+using GpuEcsAnimationBaker.Engine.Data;
+using UnityEditor;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.Baker
+{
+    [CustomEditor(typeof(GpuEcsAnimationBakerBehaviour))]
+    public class GpuEcsAnimationBakerEditor : UnityEditor.Editor
+    {
+        private SerializedProperty bakerDataProperty;
+        private SerializedProperty gpuEcsAnimatorProperty;
+        private bool showPrefabError = false;
+        
+        void OnEnable()
+        {
+            bakerDataProperty = serializedObject.FindProperty("bakerData");
+            gpuEcsAnimatorProperty = serializedObject.FindProperty("gpuEcsAnimator");
+            showPrefabError = false;
+        }
+
+        public override void OnInspectorGUI()
+        {
+            GameObject sourceModel = ((GpuEcsAnimationBakerBehaviour)target).gameObject;
+            GUIStyle labelStyle = new GUIStyle(GUI.skin.label);
+            labelStyle.normal.textColor = new Color(1f, 0.5f, 0f, 1f);
+            labelStyle.wordWrap = true; 
+            labelStyle.alignment = TextAnchor.MiddleLeft;
+            labelStyle.fontSize = 22;
+            labelStyle.fontStyle = FontStyle.Bold;
+            labelStyle.fixedHeight = 36;
+            GUILayout.Label("GPU ECS Animation Baker", labelStyle);
+            serializedObject.Update();
+            EditorGUILayout.PropertyField(bakerDataProperty);
+
+            bool validated = GpuEcsAnimationBakerServices.ValidateAnimationBakerData(
+                (GpuEcsAnimationBakerData)bakerDataProperty.boxedValue, sourceModel, out string errors);
+            if(!validated) EditorGUILayout.HelpBox(errors, MessageType.Error);
+            if(showPrefabError) EditorGUILayout.HelpBox("Generation can only happen on unloaded, selected prefabs", MessageType.Error);
+            GUI.enabled = validated;
+            GUIStyle buttonStyle = new GUIStyle(GUI.skin.button);
+            buttonStyle.normal.textColor = new Color(1f, 0.5f, 0f, 1f);
+            buttonStyle.alignment = TextAnchor.MiddleCenter;
+            buttonStyle.fontSize = 22;
+            buttonStyle.fontStyle = FontStyle.Bold;
+            buttonStyle.fixedHeight = 36;
+            if (GUILayout.Button("Generate GPU ECS Animator", buttonStyle))
+            {
+                string path = AssetDatabase.GetAssetPath(sourceModel);
+                if (string.IsNullOrEmpty(path) || !PrefabUtility.IsPartOfAnyPrefab(sourceModel))
+                    showPrefabError = true;
+                else
+                {
+                    string folder = Path.GetDirectoryName(path);
+                    string subFolder = $"BakedAssets_{sourceModel.name}";
+                    string generatedAssetsFolder = Path.Combine(folder, subFolder);
+                    if (!AssetDatabase.IsValidFolder(generatedAssetsFolder))
+                        generatedAssetsFolder = AssetDatabase.GUIDToAssetPath(AssetDatabase.CreateFolder(
+                            folder, subFolder));
+                    string animatorName = sourceModel.name;
+
+                    GpuEcsAnimationBakerData bakerData = (GpuEcsAnimationBakerData)bakerDataProperty.boxedValue;
+                    GameObject newGpuEcsAnimator = GpuEcsAnimationBakerServices.GenerateAnimationObject(path, bakerData,
+                        animatorName, generatedAssetsFolder);
+                    
+                    gpuEcsAnimatorProperty.boxedValue = newGpuEcsAnimator;
+                    showPrefabError = false;
+                }
+            }
+            GUI.enabled = true;
+
+            EditorGUILayout.PropertyField(gpuEcsAnimatorProperty);
+            
+            serializedObject.ApplyModifiedProperties();
+        }
+    }
+}
+#endif

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerEditor.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 79d531cf89b84b1da8f743add3d8f9e0
+timeCreated: 1678439969

+ 22 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerMenu.cs

@@ -0,0 +1,22 @@
+#if UNITY_EDITOR
+using UnityEditor;
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.Baker
+{
+    public static class GpuEcsAnimationBakerMenu
+    {
+        [MenuItem("Tools/GPU ECS Animation Baker/Add baker component")]
+        private static void AddGpuEcsAnimationBaker()
+        {
+            Selection.activeGameObject.AddComponent<GpuEcsAnimationBakerBehaviour>();
+        }    
+        
+        [MenuItem("Tools/GPU ECS Animation Baker/Add baker component", isValidateFunction:true)]
+        private static bool ValidateAddGpuEcsAnimationBaker()
+        {
+            return Selection.activeGameObject != null && Selection.activeGameObject.GetComponent<Animator>() != null;
+        }
+    }
+}
+#endif

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationBakerMenu.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 9a5d3f31af424f1abf047c581f9c9618
+timeCreated: 1679327604

+ 12 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationEventBakerBehaviour.cs

@@ -0,0 +1,12 @@
+using UnityEngine;
+
+namespace GPUECSAnimationBaker.Engine.Baker
+{
+    public class GpuEcsAnimationEventBakerBehaviour : MonoBehaviour
+    {
+        public void RaiseEvent(string eventID)
+        {
+            //Debug.Log($"RaiseEvent{eventID}");
+        }
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Baker/GpuEcsAnimationEventBakerBehaviour.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b5f0e3091ef64b7dbbd1aeeb69aa23fc
+timeCreated: 1692112016

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 173879fcf9ec40b59acfdd918e36a942
+timeCreated: 1678696737

+ 25 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationData.cs

@@ -0,0 +1,25 @@
+using System;
+using UnityEngine;
+
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    [Serializable]
+    public struct AnimationData
+    {
+        [Tooltip("Only used when generating enum code file to identify animations")]
+        public string animationID;
+        [Tooltip("The main animator state name that will be used during sampling, searched across all layers")]
+        public string animatorStateName;
+        [Tooltip("Specify single clip or dual clip blend animations")]
+        public AnimationTypes animationType;
+        public SingleClipData singleClipData;
+        public DualClipBlendData dualClipBlendData;
+        [Tooltip("Specify whether the animation should loop")]
+        public bool loop;
+        [Tooltip("Any additional Animator parameters that will be used during sampling (independent of blending)\nSpecify name, type & value for each")]
+        public AnimatorParameter[] additionalAnimatorParameterValues;
+        [Tooltip("Any additional Animator states that need to be set on different layers")]
+        public AnimatorState[] additionalAnimatorStatesPerLayer;
+    }
+
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationData.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 6b1068b7fce641d8a7bc80e6bebcbbe7
+timeCreated: 1678696820

+ 94 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationDataDrawer.cs

@@ -0,0 +1,94 @@
+#if UNITY_EDITOR
+using UnityEditor;
+using UnityEngine;
+
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    [CustomPropertyDrawer(typeof(AnimationData))]
+    public class AnimationDataDrawer : PropertyDrawer
+    {
+        private Rect GetLineRect(Rect position, int line, float indent)
+        {
+            return new Rect(position.x + indent, position.y + line * EditorGUIUtility.singleLineHeight,
+                position.width - indent, EditorGUIUtility.singleLineHeight);
+        }
+        
+        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
+        {
+            EditorGUI.BeginProperty(position, label, property);
+            SerializedProperty animationIDProperty = property.FindPropertyRelative("animationID");
+            SerializedProperty animatorStateNameProperty = property.FindPropertyRelative("animatorStateName");
+            SerializedProperty animationTypeProperty = property.FindPropertyRelative("animationType");
+            SerializedProperty singleClipDataProperty = property.FindPropertyRelative("singleClipData");
+            SerializedProperty dualClipBlendDataProperty = property.FindPropertyRelative("dualClipBlendData");
+            SerializedProperty loopDataProperty = property.FindPropertyRelative("loop");
+            SerializedProperty additionalParameterValuesProperty = property.FindPropertyRelative("additionalAnimatorParameterValues");
+            SerializedProperty additionalAnimatorStatesPerLayerProperty = property.FindPropertyRelative("additionalAnimatorStatesPerLayer");
+            int line = 0;
+            EditorGUI.PropertyField(GetLineRect(position, line, 0), animationIDProperty, new GUIContent("Animation ID"));
+            line++;
+            EditorGUI.PropertyField(GetLineRect(position, line, 0), animatorStateNameProperty, new GUIContent("Animator State Name"));
+            line++;
+            EditorGUI.PropertyField(GetLineRect(position, line, 0), animationTypeProperty, new GUIContent("Animation Type"));
+            AnimationTypes animationType = (AnimationTypes)animationTypeProperty.enumValueIndex;
+            if (animationType == AnimationTypes.SingleClip)
+            {
+                line++;
+                EditorGUI.PropertyField(GetLineRect(position, line, 0), 
+                    singleClipDataProperty.FindPropertyRelative("animationClip"), new GUIContent("Animation Clip"));
+            }
+            else
+            {
+                line++;
+                EditorGUI.PropertyField(GetLineRect(position, line, 0), 
+                    dualClipBlendDataProperty.FindPropertyRelative("blendParameterName"), new GUIContent("Blend parameter name"));
+                line++;
+                EditorGUI.LabelField(GetLineRect(position, line, 0), "Clip 1"); 
+                line++;
+                EditorGUI.PropertyField(GetLineRect(position, line, 10), 
+                    dualClipBlendDataProperty.FindPropertyRelative("clip1").FindPropertyRelative("parameterValue"), new GUIContent("Parameter Value"));
+                line++;
+                EditorGUI.PropertyField(GetLineRect(position, line, 10), 
+                    dualClipBlendDataProperty.FindPropertyRelative("clip1").FindPropertyRelative("animationClip"), new GUIContent("Animation Clip"));
+                line++;
+                EditorGUI.LabelField(GetLineRect(position, line, 0), "Clip 2"); 
+                line++;
+                EditorGUI.PropertyField(GetLineRect(position, line, 10), 
+                    dualClipBlendDataProperty.FindPropertyRelative("clip2").FindPropertyRelative("parameterValue"), new GUIContent("Parameter Value"));
+                line++;
+                EditorGUI.PropertyField(GetLineRect(position, line, 10), 
+                    dualClipBlendDataProperty.FindPropertyRelative("clip2").FindPropertyRelative("animationClip"), new GUIContent("Animation Clip"));
+                line++;
+                EditorGUI.PropertyField(GetLineRect(position, line, 0), 
+                    dualClipBlendDataProperty.FindPropertyRelative("nbrOfInBetweenSamples"), new GUIContent("Nbr of in between samples"));
+            }
+            line++;
+            EditorGUI.PropertyField(GetLineRect(position, line, 0), 
+                loopDataProperty, new GUIContent("Loop"));
+            line++;
+            EditorGUI.PropertyField(GetLineRect(position, line, 0), 
+                additionalParameterValuesProperty, new GUIContent("Additional animator parameter values"));
+            line++;
+            if (additionalParameterValuesProperty.isExpanded)
+                line += additionalParameterValuesProperty.arraySize + 3;
+            EditorGUI.PropertyField(GetLineRect(position, line, 0), 
+                additionalAnimatorStatesPerLayerProperty, new GUIContent("Additional animator states per layer"));
+            EditorGUI.EndProperty();
+        }
+
+        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
+        {
+            SerializedProperty animationTypeProperty = property.FindPropertyRelative("animationType");
+            SerializedProperty additionalParameterValuesProperty = property.FindPropertyRelative("additionalAnimatorParameterValues");
+            SerializedProperty additionalAnimatorStatesPerLayerProperty = property.FindPropertyRelative("additionalAnimatorStatesPerLayer");
+            AnimationTypes animationType = (AnimationTypes)animationTypeProperty.enumValueIndex;
+            int nbrOfLines = animationType == AnimationTypes.SingleClip ? 7 : 14;
+            if (additionalParameterValuesProperty.isExpanded)
+                nbrOfLines += additionalParameterValuesProperty.arraySize + 3;
+            if (additionalAnimatorStatesPerLayerProperty.isExpanded)
+                nbrOfLines += additionalAnimatorStatesPerLayerProperty.arraySize + 3;
+            return EditorGUIUtility.singleLineHeight * nbrOfLines;
+        }
+    }
+}
+#endif

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationDataDrawer.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ce81459ba0ea4380b87cfb510a462a27
+timeCreated: 1679232760

+ 10 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationMatricesTexture.cs

@@ -0,0 +1,10 @@
+using UnityEngine;
+
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    public class AnimationMatricesTexture
+    {
+        public SkinnedMeshRenderer skinnedMeshRenderer;
+        public Texture2D texture;
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationMatricesTexture.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 42de9783325447ef91539ab4a3ea8cf2
+timeCreated: 1678701051

+ 8 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationTypes.cs

@@ -0,0 +1,8 @@
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    public enum AnimationTypes
+    {
+        SingleClip,
+        DualClipBlend
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimationTypes.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 412ca53240eb4635a973d73941e241e2
+timeCreated: 1679220803

+ 15 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameter.cs

@@ -0,0 +1,15 @@
+using System;
+
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    [Serializable]
+    public struct AnimatorParameter
+    {
+        public string parameterName;
+        public AnimatorParameterTypes parameterType;
+        public bool boolValue;
+        public float floatValue;
+        public int intValue;
+    }
+
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameter.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ddd84665f7c4491bb9163b12b133b111
+timeCreated: 1678696899

+ 41 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterDrawer.cs

@@ -0,0 +1,41 @@
+#if UNITY_EDITOR
+using UnityEditor;
+using UnityEngine;
+
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    [CustomPropertyDrawer(typeof(AnimatorParameter))]
+    public class AnimatorParameterDrawer : PropertyDrawer
+    {
+        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
+        {
+            EditorGUI.BeginProperty(position, label, property);
+            float w = (position.width - 90) / 2;
+            SerializedProperty parameterNameProperty = property.FindPropertyRelative("parameterName");
+            SerializedProperty parameterTypeProperty = property.FindPropertyRelative("parameterType");
+            SerializedProperty boolValueProperty = property.FindPropertyRelative("boolValue");
+            SerializedProperty floatValueProperty = property.FindPropertyRelative("floatValue");
+            SerializedProperty intValueProperty = property.FindPropertyRelative("intValue");
+            EditorGUI.PropertyField(new Rect(position.position, new Vector2(w, position.height)), 
+                parameterNameProperty, new GUIContent(""));
+            EditorGUI.BeginChangeCheck();            
+            EditorGUI.PropertyField(new Rect(position.position + new Vector2(w + 5, 0), new Vector2(80, position.height)), 
+                parameterTypeProperty, new GUIContent(""));
+            if (EditorGUI.EndChangeCheck())
+            {
+                boolValueProperty.boolValue = false;
+                floatValueProperty.floatValue = 0;
+                intValueProperty.intValue = 0;
+            }
+            AnimatorParameterTypes parameterType = (AnimatorParameterTypes)parameterTypeProperty.enumValueIndex;
+            SerializedProperty valueProperty = null;
+            if (parameterType == AnimatorParameterTypes.Bool) valueProperty = boolValueProperty;
+            else if (parameterType == AnimatorParameterTypes.Float) valueProperty = floatValueProperty;
+            else if (parameterType == AnimatorParameterTypes.Integer) valueProperty = intValueProperty;
+            EditorGUI.PropertyField(new Rect(position.position + new Vector2(w + 90, 0), new Vector2(w, position.height)), 
+                valueProperty, new GUIContent(""));
+            EditorGUI.EndProperty();
+        }
+    }
+}
+#endif

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterDrawer.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 368626b264a74b1bb9090157b32f8ebd
+timeCreated: 1678696928

+ 9 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterTypes.cs

@@ -0,0 +1,9 @@
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    public enum AnimatorParameterTypes
+    {
+        Bool,
+        Float,
+        Integer
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorParameterTypes.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 39fde7d787f34da48e67b42a25cf6bd3
+timeCreated: 1678696872

+ 11 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorState.cs

@@ -0,0 +1,11 @@
+using System;
+
+namespace GpuEcsAnimationBaker.Engine.Data
+{
+    [Serializable]
+    public struct AnimatorState
+    {
+        public string stateName;
+        public int layer;
+    }
+}

+ 3 - 0
Assets/GPUECSAnimationBaker/Engine/Data/AnimatorState.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 9323c2b3448d40239301108a1256de89
+timeCreated: 1683552170

Неке датотеке нису приказане због велике количине промена