├── .gitignore ├── Backlog └── Readme.MD ├── ContinuousIntegration └── Readme.MD ├── Decoupling ├── Assets │ ├── Data.meta │ ├── Data │ │ ├── PlayerHealth.asset │ │ ├── PlayerHealth.asset.meta │ │ ├── PlayerMana.asset │ │ └── PlayerMana.asset.meta │ ├── Materials.meta │ ├── Materials │ │ ├── Concrete.mat │ │ ├── Concrete.mat.meta │ │ ├── Jeans.mat │ │ ├── Jeans.mat.meta │ │ ├── Skin.mat │ │ └── Skin.mat.meta │ ├── Prefabs.meta │ ├── Prefabs │ │ ├── Dungeon.prefab │ │ ├── Dungeon.prefab.meta │ │ ├── Player.prefab │ │ ├── Player.prefab.meta │ │ ├── ProgressBar.prefab │ │ ├── ProgressBar.prefab.meta │ │ ├── UI.prefab │ │ └── UI.prefab.meta │ ├── Scenes.meta │ ├── Scenes │ │ ├── Game.unity │ │ └── Game.unity.meta │ ├── Scripts.meta │ ├── Scripts │ │ ├── BoundedFloat.cs │ │ ├── BoundedFloat.cs.meta │ │ ├── Player.cs │ │ ├── Player.cs.meta │ │ ├── StatusBar.cs │ │ └── StatusBar.cs.meta │ ├── csc.rsp │ └── csc.rsp.meta ├── Documentation │ ├── Decoupling.dot │ ├── Decoupling.png │ ├── Dependencies.dot │ ├── Dependencies.png │ ├── HealthBar.png │ ├── HealthBar2.png │ └── ScriptableObjects.png ├── Packages │ └── manifest.json ├── ProjectSettings │ ├── AudioManager.asset │ ├── ClusterInputManager.asset │ ├── DynamicsManager.asset │ ├── EditorBuildSettings.asset │ ├── EditorSettings.asset │ ├── GraphicsSettings.asset │ ├── InputManager.asset │ ├── NavMeshAreas.asset │ ├── Physics2DSettings.asset │ ├── PresetManager.asset │ ├── ProjectSettings.asset │ ├── ProjectVersion.txt │ ├── QualitySettings.asset │ ├── TagManager.asset │ ├── TimeManager.asset │ ├── UnityConnectSettings.asset │ ├── VFXManager.asset │ └── XRSettings.asset ├── README-zh-TW.md └── README.md ├── LICENSE ├── README-zh-TW.md ├── README.md └── StateMachines └── Readme.MD /.gitignore: -------------------------------------------------------------------------------- 1 | [Ll]ibrary/ 2 | [Tt]emp/ 3 | [Oo]bj/ 4 | [Bb]uild/ 5 | [Bb]uilds/ 6 | [Ll]ogs/ 7 | Assets/AssetStoreTools* 8 | 9 | # Visual Studio cache directory 10 | .vs/ 11 | 12 | # Autogenerated VS/MD/Consulo solution and project files 13 | ExportedObj/ 14 | .consulo/ 15 | *.csproj 16 | *.unityproj 17 | *.sln 18 | *.suo 19 | *.tmp 20 | *.user 21 | *.userprefs 22 | *.pidb 23 | *.booproj 24 | *.svd 25 | *.pdb 26 | *.opendb 27 | 28 | # Unity3D generated meta files 29 | *.pidb.meta 30 | *.pdb.meta 31 | 32 | # Unity3D Generated File On Crash Reports 33 | sysinfo.txt 34 | 35 | # Builds 36 | *.apk 37 | *.unitypackage 38 | -------------------------------------------------------------------------------- /Backlog/Readme.MD: -------------------------------------------------------------------------------- 1 | # Backlog 2 | 3 | ## Tricks 4 | - Animator instead of state machine 5 | - Timeline instead of lerp 6 | 7 | ## Decoupling 8 | - ~~ScriptableObject instead of Singleton~~ 9 | - Runtime sets (observer) 10 | 11 | ## Correctness 12 | - ScriptableObject instead of CSV, json, etc. 13 | - [Required] attribute 14 | - Broken reference check 15 | - Code reviews 16 | - Tests and simulations 17 | - Refactoring 18 | - Parallel implementations 19 | 20 | ## Animation 21 | - Timeline 22 | - Animator 23 | 24 | ## Debugging 25 | - Custom Inspectors 26 | - Animator as state machine inspector 27 | - Gizmos 28 | 29 | ## Profiling 30 | - Profiler 31 | - Memory Profiler 32 | - GC alloc 33 | - Profiling statements 34 | 35 | ## Optimization 36 | - Data locality 37 | - Data oriented design 38 | - Moving static data out of prefabs (flyweight) 39 | - Debug stats on scriptable object (object pool tuning) 40 | - Double buffer 41 | - Schedulers 42 | - Leaky bucket 43 | - DOTS 44 | 45 | ## Unsorted 46 | - Game design patterns 47 | - Collaboration 48 | - Procedural generation 49 | - Machine learning 50 | - Shaders 51 | - Universal render pipeline 52 | - Post processing effects 53 | - Mentoring 54 | - UML 55 | -------------------------------------------------------------------------------- /ContinuousIntegration/Readme.MD: -------------------------------------------------------------------------------- 1 | # Continuous Integration 2 | 3 | - Version control 4 | - Jenkins 5 | - Automated tests 6 | - Unit test 7 | - Asset test 8 | - Integration test 9 | - Build server 10 | - SteamPipe 11 | - F8 feedback 12 | - Analytics 13 | - Sentry 14 | -------------------------------------------------------------------------------- /Decoupling/Assets/Data.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3c33b19a6eb99a94f872bd5d8dfe2752 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Data/PlayerHealth.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 02d9d0c655a44d443b038a45f66f7b90, type: 3} 13 | m_Name: PlayerHealth 14 | m_EditorClassIdentifier: 15 | maxValue: 80 16 | value: 70 17 | -------------------------------------------------------------------------------- /Decoupling/Assets/Data/PlayerHealth.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a3b5cacc10e52cb4dacf477ac19a07cb 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Data/PlayerMana.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 02d9d0c655a44d443b038a45f66f7b90, type: 3} 13 | m_Name: PlayerMana 14 | m_EditorClassIdentifier: 15 | maxValue: 40 16 | value: 30 17 | -------------------------------------------------------------------------------- /Decoupling/Assets/Data/PlayerMana.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 560495f8111f5724da5599562e0eedec 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Materials.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 94c164f8206ef8f4a90a95eb938204b5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Materials/Concrete.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Concrete 11 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: 13 | m_LightmapFlags: 4 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 0} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BumpScale: 1 60 | - _Cutoff: 0.5 61 | - _DetailNormalMapScale: 1 62 | - _DstBlend: 0 63 | - _GlossMapScale: 1 64 | - _Glossiness: 0.2 65 | - _GlossyReflections: 1 66 | - _Metallic: 0.2 67 | - _Mode: 0 68 | - _OcclusionStrength: 1 69 | - _Parallax: 0.02 70 | - _SmoothnessTextureChannel: 0 71 | - _SpecularHighlights: 1 72 | - _SrcBlend: 1 73 | - _UVSec: 0 74 | - _ZWrite: 1 75 | m_Colors: 76 | - _Color: {r: 0.53333336, g: 0.53333336, b: 0.53333336, a: 1} 77 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 78 | -------------------------------------------------------------------------------- /Decoupling/Assets/Materials/Concrete.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 13c269584f0b28e4f9e7adf2b52ada58 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Materials/Jeans.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Jeans 11 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: 13 | m_LightmapFlags: 4 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 0} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BumpScale: 1 60 | - _Cutoff: 0.5 61 | - _DetailNormalMapScale: 1 62 | - _DstBlend: 0 63 | - _GlossMapScale: 1 64 | - _Glossiness: 0 65 | - _GlossyReflections: 1 66 | - _Metallic: 0 67 | - _Mode: 0 68 | - _OcclusionStrength: 1 69 | - _Parallax: 0.02 70 | - _SmoothnessTextureChannel: 0 71 | - _SpecularHighlights: 1 72 | - _SrcBlend: 1 73 | - _UVSec: 0 74 | - _ZWrite: 1 75 | m_Colors: 76 | - _Color: {r: 0.06666667, g: 0.26666668, b: 0.73333335, a: 1} 77 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 78 | -------------------------------------------------------------------------------- /Decoupling/Assets/Materials/Jeans.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 123bff0b006accf4cb2faf85eeee8cd0 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Materials/Skin.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Skin 11 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: 13 | m_LightmapFlags: 4 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 0} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BumpScale: 1 60 | - _Cutoff: 0.5 61 | - _DetailNormalMapScale: 1 62 | - _DstBlend: 0 63 | - _GlossMapScale: 1 64 | - _Glossiness: 0.4 65 | - _GlossyReflections: 1 66 | - _Metallic: 0.2 67 | - _Mode: 0 68 | - _OcclusionStrength: 1 69 | - _Parallax: 0.02 70 | - _SmoothnessTextureChannel: 0 71 | - _SpecularHighlights: 1 72 | - _SrcBlend: 1 73 | - _UVSec: 0 74 | - _ZWrite: 1 75 | m_Colors: 76 | - _Color: {r: 0.8666667, g: 0.6635184, b: 0.13333334, a: 1} 77 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 78 | -------------------------------------------------------------------------------- /Decoupling/Assets/Materials/Skin.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: baa77afc7a4a3954599b64b2349e5d26 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3e9f49eefc742774fbca97a351230239 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/Dungeon.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3532432759913047904 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 3602722377457682209} 12 | - component: {fileID: 1218563337582504828} 13 | - component: {fileID: 8275703702617193374} 14 | - component: {fileID: 3538887381787578262} 15 | m_Layer: 0 16 | m_Name: Floor 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &3602722377457682209 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 3532432759913047904} 29 | m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 10, y: 10, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 1252267959797470240} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} 36 | --- !u!33 &1218563337582504828 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 3532432759913047904} 43 | m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} 44 | --- !u!23 &8275703702617193374 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 3532432759913047904} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RenderingLayerMask: 1 59 | m_RendererPriority: 0 60 | m_Materials: 61 | - {fileID: 2100000, guid: 13c269584f0b28e4f9e7adf2b52ada58, type: 2} 62 | m_StaticBatchInfo: 63 | firstSubMesh: 0 64 | subMeshCount: 0 65 | m_StaticBatchRoot: {fileID: 0} 66 | m_ProbeAnchor: {fileID: 0} 67 | m_LightProbeVolumeOverride: {fileID: 0} 68 | m_ScaleInLightmap: 1 69 | m_PreserveUVs: 0 70 | m_IgnoreNormalsForChartDetection: 0 71 | m_ImportantGI: 0 72 | m_StitchLightmapSeams: 0 73 | m_SelectedEditorRenderState: 3 74 | m_MinimumChartSize: 4 75 | m_AutoUVMaxDistance: 0.5 76 | m_AutoUVMaxAngle: 89 77 | m_LightmapParameters: {fileID: 0} 78 | m_SortingLayerID: 0 79 | m_SortingLayer: 0 80 | m_SortingOrder: 0 81 | --- !u!64 &3538887381787578262 82 | MeshCollider: 83 | m_ObjectHideFlags: 0 84 | m_CorrespondingSourceObject: {fileID: 0} 85 | m_PrefabInstance: {fileID: 0} 86 | m_PrefabAsset: {fileID: 0} 87 | m_GameObject: {fileID: 3532432759913047904} 88 | m_Material: {fileID: 0} 89 | m_IsTrigger: 0 90 | m_Enabled: 1 91 | serializedVersion: 3 92 | m_Convex: 0 93 | m_CookingOptions: -1 94 | m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} 95 | --- !u!1 &8762435044969880554 96 | GameObject: 97 | m_ObjectHideFlags: 0 98 | m_CorrespondingSourceObject: {fileID: 0} 99 | m_PrefabInstance: {fileID: 0} 100 | m_PrefabAsset: {fileID: 0} 101 | serializedVersion: 6 102 | m_Component: 103 | - component: {fileID: 1252267959797470240} 104 | m_Layer: 0 105 | m_Name: Dungeon 106 | m_TagString: Untagged 107 | m_Icon: {fileID: 0} 108 | m_NavMeshLayer: 0 109 | m_StaticEditorFlags: 0 110 | m_IsActive: 1 111 | --- !u!4 &1252267959797470240 112 | Transform: 113 | m_ObjectHideFlags: 0 114 | m_CorrespondingSourceObject: {fileID: 0} 115 | m_PrefabInstance: {fileID: 0} 116 | m_PrefabAsset: {fileID: 0} 117 | m_GameObject: {fileID: 8762435044969880554} 118 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 119 | m_LocalPosition: {x: 0, y: 0, z: 0} 120 | m_LocalScale: {x: 1, y: 1, z: 1} 121 | m_Children: 122 | - {fileID: 3602722377457682209} 123 | m_Father: {fileID: 0} 124 | m_RootOrder: 0 125 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 126 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/Dungeon.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5b4b9dda9117fe54aa82f756ba918230 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/Player.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1153051445323189980 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 8564007164421206819} 12 | - component: {fileID: 5375977632977691405} 13 | - component: {fileID: 3695632012363683869} 14 | m_Layer: 0 15 | m_Name: Sphere 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!4 &8564007164421206819 22 | Transform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 1153051445323189980} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 1.55, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_Children: [] 32 | m_Father: {fileID: 483095740043753956} 33 | m_RootOrder: 1 34 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 35 | --- !u!33 &5375977632977691405 36 | MeshFilter: 37 | m_ObjectHideFlags: 0 38 | m_CorrespondingSourceObject: {fileID: 0} 39 | m_PrefabInstance: {fileID: 0} 40 | m_PrefabAsset: {fileID: 0} 41 | m_GameObject: {fileID: 1153051445323189980} 42 | m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} 43 | --- !u!23 &3695632012363683869 44 | MeshRenderer: 45 | m_ObjectHideFlags: 0 46 | m_CorrespondingSourceObject: {fileID: 0} 47 | m_PrefabInstance: {fileID: 0} 48 | m_PrefabAsset: {fileID: 0} 49 | m_GameObject: {fileID: 1153051445323189980} 50 | m_Enabled: 1 51 | m_CastShadows: 1 52 | m_ReceiveShadows: 1 53 | m_DynamicOccludee: 1 54 | m_MotionVectors: 1 55 | m_LightProbeUsage: 1 56 | m_ReflectionProbeUsage: 1 57 | m_RenderingLayerMask: 1 58 | m_RendererPriority: 0 59 | m_Materials: 60 | - {fileID: 2100000, guid: 123bff0b006accf4cb2faf85eeee8cd0, type: 2} 61 | m_StaticBatchInfo: 62 | firstSubMesh: 0 63 | subMeshCount: 0 64 | m_StaticBatchRoot: {fileID: 0} 65 | m_ProbeAnchor: {fileID: 0} 66 | m_LightProbeVolumeOverride: {fileID: 0} 67 | m_ScaleInLightmap: 1 68 | m_PreserveUVs: 0 69 | m_IgnoreNormalsForChartDetection: 0 70 | m_ImportantGI: 0 71 | m_StitchLightmapSeams: 0 72 | m_SelectedEditorRenderState: 3 73 | m_MinimumChartSize: 4 74 | m_AutoUVMaxDistance: 0.5 75 | m_AutoUVMaxAngle: 89 76 | m_LightmapParameters: {fileID: 0} 77 | m_SortingLayerID: 0 78 | m_SortingLayer: 0 79 | m_SortingOrder: 0 80 | --- !u!1 &3822731113267904726 81 | GameObject: 82 | m_ObjectHideFlags: 0 83 | m_CorrespondingSourceObject: {fileID: 0} 84 | m_PrefabInstance: {fileID: 0} 85 | m_PrefabAsset: {fileID: 0} 86 | serializedVersion: 6 87 | m_Component: 88 | - component: {fileID: 7039639460716564945} 89 | - component: {fileID: 7460317939366629364} 90 | - component: {fileID: 4658058270579045709} 91 | m_Layer: 0 92 | m_Name: Cylinder 93 | m_TagString: Untagged 94 | m_Icon: {fileID: 0} 95 | m_NavMeshLayer: 0 96 | m_StaticEditorFlags: 0 97 | m_IsActive: 1 98 | --- !u!4 &7039639460716564945 99 | Transform: 100 | m_ObjectHideFlags: 0 101 | m_CorrespondingSourceObject: {fileID: 0} 102 | m_PrefabInstance: {fileID: 0} 103 | m_PrefabAsset: {fileID: 0} 104 | m_GameObject: {fileID: 3822731113267904726} 105 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 106 | m_LocalPosition: {x: 0, y: 1.55, z: 0.15} 107 | m_LocalScale: {x: 1, y: 0.02, z: 1.1} 108 | m_Children: [] 109 | m_Father: {fileID: 483095740043753956} 110 | m_RootOrder: 2 111 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 112 | --- !u!33 &7460317939366629364 113 | MeshFilter: 114 | m_ObjectHideFlags: 0 115 | m_CorrespondingSourceObject: {fileID: 0} 116 | m_PrefabInstance: {fileID: 0} 117 | m_PrefabAsset: {fileID: 0} 118 | m_GameObject: {fileID: 3822731113267904726} 119 | m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} 120 | --- !u!23 &4658058270579045709 121 | MeshRenderer: 122 | m_ObjectHideFlags: 0 123 | m_CorrespondingSourceObject: {fileID: 0} 124 | m_PrefabInstance: {fileID: 0} 125 | m_PrefabAsset: {fileID: 0} 126 | m_GameObject: {fileID: 3822731113267904726} 127 | m_Enabled: 1 128 | m_CastShadows: 1 129 | m_ReceiveShadows: 1 130 | m_DynamicOccludee: 1 131 | m_MotionVectors: 1 132 | m_LightProbeUsage: 1 133 | m_ReflectionProbeUsage: 1 134 | m_RenderingLayerMask: 1 135 | m_RendererPriority: 0 136 | m_Materials: 137 | - {fileID: 2100000, guid: 123bff0b006accf4cb2faf85eeee8cd0, type: 2} 138 | m_StaticBatchInfo: 139 | firstSubMesh: 0 140 | subMeshCount: 0 141 | m_StaticBatchRoot: {fileID: 0} 142 | m_ProbeAnchor: {fileID: 0} 143 | m_LightProbeVolumeOverride: {fileID: 0} 144 | m_ScaleInLightmap: 1 145 | m_PreserveUVs: 0 146 | m_IgnoreNormalsForChartDetection: 0 147 | m_ImportantGI: 0 148 | m_StitchLightmapSeams: 0 149 | m_SelectedEditorRenderState: 3 150 | m_MinimumChartSize: 4 151 | m_AutoUVMaxDistance: 0.5 152 | m_AutoUVMaxAngle: 89 153 | m_LightmapParameters: {fileID: 0} 154 | m_SortingLayerID: 0 155 | m_SortingLayer: 0 156 | m_SortingOrder: 0 157 | --- !u!1 &7764466603690297127 158 | GameObject: 159 | m_ObjectHideFlags: 0 160 | m_CorrespondingSourceObject: {fileID: 0} 161 | m_PrefabInstance: {fileID: 0} 162 | m_PrefabAsset: {fileID: 0} 163 | serializedVersion: 6 164 | m_Component: 165 | - component: {fileID: 483095740043753956} 166 | - component: {fileID: 9047061913790646996} 167 | - component: {fileID: 2918543682485056763} 168 | m_Layer: 0 169 | m_Name: Player 170 | m_TagString: Untagged 171 | m_Icon: {fileID: 0} 172 | m_NavMeshLayer: 0 173 | m_StaticEditorFlags: 0 174 | m_IsActive: 1 175 | --- !u!4 &483095740043753956 176 | Transform: 177 | m_ObjectHideFlags: 0 178 | m_CorrespondingSourceObject: {fileID: 0} 179 | m_PrefabInstance: {fileID: 0} 180 | m_PrefabAsset: {fileID: 0} 181 | m_GameObject: {fileID: 7764466603690297127} 182 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 183 | m_LocalPosition: {x: 0, y: 0, z: 0} 184 | m_LocalScale: {x: 1, y: 1, z: 1} 185 | m_Children: 186 | - {fileID: 7360209414911062670} 187 | - {fileID: 8564007164421206819} 188 | - {fileID: 7039639460716564945} 189 | m_Father: {fileID: 0} 190 | m_RootOrder: 0 191 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 192 | --- !u!143 &9047061913790646996 193 | CharacterController: 194 | m_ObjectHideFlags: 0 195 | m_CorrespondingSourceObject: {fileID: 0} 196 | m_PrefabInstance: {fileID: 0} 197 | m_PrefabAsset: {fileID: 0} 198 | m_GameObject: {fileID: 7764466603690297127} 199 | m_Material: {fileID: 0} 200 | m_IsTrigger: 0 201 | m_Enabled: 1 202 | serializedVersion: 2 203 | m_Height: 2 204 | m_Radius: 0.5 205 | m_SlopeLimit: 45 206 | m_StepOffset: 0.3 207 | m_SkinWidth: 0.1 208 | m_MinMoveDistance: 0 209 | m_Center: {x: 0, y: 1, z: 0} 210 | --- !u!114 &2918543682485056763 211 | MonoBehaviour: 212 | m_ObjectHideFlags: 0 213 | m_CorrespondingSourceObject: {fileID: 0} 214 | m_PrefabInstance: {fileID: 0} 215 | m_PrefabAsset: {fileID: 0} 216 | m_GameObject: {fileID: 7764466603690297127} 217 | m_Enabled: 1 218 | m_EditorHideFlags: 0 219 | m_Script: {fileID: 11500000, guid: 575110446718f4b419845f814e067c88, type: 3} 220 | m_Name: 221 | m_EditorClassIdentifier: 222 | controller: {fileID: 9047061913790646996} 223 | speed: 10 224 | health: {fileID: 11400000, guid: a3b5cacc10e52cb4dacf477ac19a07cb, type: 2} 225 | mana: {fileID: 11400000, guid: 560495f8111f5724da5599562e0eedec, type: 2} 226 | --- !u!1 &8433657621023297109 227 | GameObject: 228 | m_ObjectHideFlags: 0 229 | m_CorrespondingSourceObject: {fileID: 0} 230 | m_PrefabInstance: {fileID: 0} 231 | m_PrefabAsset: {fileID: 0} 232 | serializedVersion: 6 233 | m_Component: 234 | - component: {fileID: 7360209414911062670} 235 | - component: {fileID: 2853207746173746516} 236 | - component: {fileID: 5064488607802024395} 237 | m_Layer: 0 238 | m_Name: Capsule 239 | m_TagString: Untagged 240 | m_Icon: {fileID: 0} 241 | m_NavMeshLayer: 0 242 | m_StaticEditorFlags: 0 243 | m_IsActive: 1 244 | --- !u!4 &7360209414911062670 245 | Transform: 246 | m_ObjectHideFlags: 0 247 | m_CorrespondingSourceObject: {fileID: 0} 248 | m_PrefabInstance: {fileID: 0} 249 | m_PrefabAsset: {fileID: 0} 250 | m_GameObject: {fileID: 8433657621023297109} 251 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 252 | m_LocalPosition: {x: 0, y: 1, z: 0} 253 | m_LocalScale: {x: 1, y: 1, z: 1} 254 | m_Children: [] 255 | m_Father: {fileID: 483095740043753956} 256 | m_RootOrder: 0 257 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 258 | --- !u!33 &2853207746173746516 259 | MeshFilter: 260 | m_ObjectHideFlags: 0 261 | m_CorrespondingSourceObject: {fileID: 0} 262 | m_PrefabInstance: {fileID: 0} 263 | m_PrefabAsset: {fileID: 0} 264 | m_GameObject: {fileID: 8433657621023297109} 265 | m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} 266 | --- !u!23 &5064488607802024395 267 | MeshRenderer: 268 | m_ObjectHideFlags: 0 269 | m_CorrespondingSourceObject: {fileID: 0} 270 | m_PrefabInstance: {fileID: 0} 271 | m_PrefabAsset: {fileID: 0} 272 | m_GameObject: {fileID: 8433657621023297109} 273 | m_Enabled: 1 274 | m_CastShadows: 1 275 | m_ReceiveShadows: 1 276 | m_DynamicOccludee: 1 277 | m_MotionVectors: 1 278 | m_LightProbeUsage: 1 279 | m_ReflectionProbeUsage: 1 280 | m_RenderingLayerMask: 1 281 | m_RendererPriority: 0 282 | m_Materials: 283 | - {fileID: 2100000, guid: baa77afc7a4a3954599b64b2349e5d26, type: 2} 284 | m_StaticBatchInfo: 285 | firstSubMesh: 0 286 | subMeshCount: 0 287 | m_StaticBatchRoot: {fileID: 0} 288 | m_ProbeAnchor: {fileID: 0} 289 | m_LightProbeVolumeOverride: {fileID: 0} 290 | m_ScaleInLightmap: 1 291 | m_PreserveUVs: 0 292 | m_IgnoreNormalsForChartDetection: 0 293 | m_ImportantGI: 0 294 | m_StitchLightmapSeams: 0 295 | m_SelectedEditorRenderState: 3 296 | m_MinimumChartSize: 4 297 | m_AutoUVMaxDistance: 0.5 298 | m_AutoUVMaxAngle: 89 299 | m_LightmapParameters: {fileID: 0} 300 | m_SortingLayerID: 0 301 | m_SortingLayer: 0 302 | m_SortingOrder: 0 303 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/Player.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 53efc4fa4d90ed04fbef8595d4fd7693 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/ProgressBar.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3401348595165950329 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 3401348595165950330} 12 | m_Layer: 5 13 | m_Name: Fill Area 14 | m_TagString: Untagged 15 | m_Icon: {fileID: 0} 16 | m_NavMeshLayer: 0 17 | m_StaticEditorFlags: 0 18 | m_IsActive: 1 19 | --- !u!224 &3401348595165950330 20 | RectTransform: 21 | m_ObjectHideFlags: 0 22 | m_CorrespondingSourceObject: {fileID: 0} 23 | m_PrefabInstance: {fileID: 0} 24 | m_PrefabAsset: {fileID: 0} 25 | m_GameObject: {fileID: 3401348595165950329} 26 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 27 | m_LocalPosition: {x: 0, y: 0, z: 0} 28 | m_LocalScale: {x: 1, y: 1, z: 1} 29 | m_Children: 30 | - {fileID: 3401348595976271525} 31 | m_Father: {fileID: 3401348596094318139} 32 | m_RootOrder: 1 33 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 34 | m_AnchorMin: {x: 0, y: 0} 35 | m_AnchorMax: {x: 1, y: 1} 36 | m_AnchoredPosition: {x: 0, y: 0} 37 | m_SizeDelta: {x: 0, y: 0} 38 | m_Pivot: {x: 0.5, y: 0.5} 39 | --- !u!1 &3401348595410424767 40 | GameObject: 41 | m_ObjectHideFlags: 0 42 | m_CorrespondingSourceObject: {fileID: 0} 43 | m_PrefabInstance: {fileID: 0} 44 | m_PrefabAsset: {fileID: 0} 45 | serializedVersion: 6 46 | m_Component: 47 | - component: {fileID: 3401348595410424760} 48 | - component: {fileID: 3401348595410424762} 49 | - component: {fileID: 3401348595410424761} 50 | m_Layer: 5 51 | m_Name: Background 52 | m_TagString: Untagged 53 | m_Icon: {fileID: 0} 54 | m_NavMeshLayer: 0 55 | m_StaticEditorFlags: 0 56 | m_IsActive: 1 57 | --- !u!224 &3401348595410424760 58 | RectTransform: 59 | m_ObjectHideFlags: 0 60 | m_CorrespondingSourceObject: {fileID: 0} 61 | m_PrefabInstance: {fileID: 0} 62 | m_PrefabAsset: {fileID: 0} 63 | m_GameObject: {fileID: 3401348595410424767} 64 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 65 | m_LocalPosition: {x: 0, y: 0, z: 0} 66 | m_LocalScale: {x: 1, y: 1, z: 1} 67 | m_Children: [] 68 | m_Father: {fileID: 3401348596094318139} 69 | m_RootOrder: 0 70 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 71 | m_AnchorMin: {x: 0, y: 0} 72 | m_AnchorMax: {x: 1, y: 1} 73 | m_AnchoredPosition: {x: 0, y: 0} 74 | m_SizeDelta: {x: 0, y: 0} 75 | m_Pivot: {x: 0.5, y: 0.5} 76 | --- !u!222 &3401348595410424762 77 | CanvasRenderer: 78 | m_ObjectHideFlags: 0 79 | m_CorrespondingSourceObject: {fileID: 0} 80 | m_PrefabInstance: {fileID: 0} 81 | m_PrefabAsset: {fileID: 0} 82 | m_GameObject: {fileID: 3401348595410424767} 83 | m_CullTransparentMesh: 0 84 | --- !u!114 &3401348595410424761 85 | MonoBehaviour: 86 | m_ObjectHideFlags: 0 87 | m_CorrespondingSourceObject: {fileID: 0} 88 | m_PrefabInstance: {fileID: 0} 89 | m_PrefabAsset: {fileID: 0} 90 | m_GameObject: {fileID: 3401348595410424767} 91 | m_Enabled: 1 92 | m_EditorHideFlags: 0 93 | m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} 94 | m_Name: 95 | m_EditorClassIdentifier: 96 | m_Material: {fileID: 0} 97 | m_Color: {r: 0.133, g: 0.133, b: 0.133, a: 0.49803922} 98 | m_RaycastTarget: 1 99 | m_OnCullStateChanged: 100 | m_PersistentCalls: 101 | m_Calls: [] 102 | m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} 103 | m_Type: 1 104 | m_PreserveAspect: 0 105 | m_FillCenter: 1 106 | m_FillMethod: 4 107 | m_FillAmount: 1 108 | m_FillClockwise: 1 109 | m_FillOrigin: 0 110 | m_UseSpriteMesh: 0 111 | --- !u!1 &3401348595976271524 112 | GameObject: 113 | m_ObjectHideFlags: 0 114 | m_CorrespondingSourceObject: {fileID: 0} 115 | m_PrefabInstance: {fileID: 0} 116 | m_PrefabAsset: {fileID: 0} 117 | serializedVersion: 6 118 | m_Component: 119 | - component: {fileID: 3401348595976271525} 120 | - component: {fileID: 3401348595976271527} 121 | - component: {fileID: 3401348595976271526} 122 | m_Layer: 5 123 | m_Name: Fill 124 | m_TagString: Untagged 125 | m_Icon: {fileID: 0} 126 | m_NavMeshLayer: 0 127 | m_StaticEditorFlags: 0 128 | m_IsActive: 1 129 | --- !u!224 &3401348595976271525 130 | RectTransform: 131 | m_ObjectHideFlags: 0 132 | m_CorrespondingSourceObject: {fileID: 0} 133 | m_PrefabInstance: {fileID: 0} 134 | m_PrefabAsset: {fileID: 0} 135 | m_GameObject: {fileID: 3401348595976271524} 136 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 137 | m_LocalPosition: {x: 0, y: 0, z: 0} 138 | m_LocalScale: {x: 1, y: 1, z: 1} 139 | m_Children: [] 140 | m_Father: {fileID: 3401348595165950330} 141 | m_RootOrder: 0 142 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 143 | m_AnchorMin: {x: 0, y: 0} 144 | m_AnchorMax: {x: 0, y: 0} 145 | m_AnchoredPosition: {x: 0, y: 0} 146 | m_SizeDelta: {x: 0, y: 0} 147 | m_Pivot: {x: 0.5, y: 0.5} 148 | --- !u!222 &3401348595976271527 149 | CanvasRenderer: 150 | m_ObjectHideFlags: 0 151 | m_CorrespondingSourceObject: {fileID: 0} 152 | m_PrefabInstance: {fileID: 0} 153 | m_PrefabAsset: {fileID: 0} 154 | m_GameObject: {fileID: 3401348595976271524} 155 | m_CullTransparentMesh: 0 156 | --- !u!114 &3401348595976271526 157 | MonoBehaviour: 158 | m_ObjectHideFlags: 0 159 | m_CorrespondingSourceObject: {fileID: 0} 160 | m_PrefabInstance: {fileID: 0} 161 | m_PrefabAsset: {fileID: 0} 162 | m_GameObject: {fileID: 3401348595976271524} 163 | m_Enabled: 1 164 | m_EditorHideFlags: 0 165 | m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} 166 | m_Name: 167 | m_EditorClassIdentifier: 168 | m_Material: {fileID: 0} 169 | m_Color: {r: 1, g: 1, b: 1, a: 1} 170 | m_RaycastTarget: 1 171 | m_OnCullStateChanged: 172 | m_PersistentCalls: 173 | m_Calls: [] 174 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 175 | m_Type: 1 176 | m_PreserveAspect: 0 177 | m_FillCenter: 1 178 | m_FillMethod: 4 179 | m_FillAmount: 1 180 | m_FillClockwise: 1 181 | m_FillOrigin: 0 182 | m_UseSpriteMesh: 0 183 | --- !u!1 &3401348596094318138 184 | GameObject: 185 | m_ObjectHideFlags: 0 186 | m_CorrespondingSourceObject: {fileID: 0} 187 | m_PrefabInstance: {fileID: 0} 188 | m_PrefabAsset: {fileID: 0} 189 | serializedVersion: 6 190 | m_Component: 191 | - component: {fileID: 3401348596094318139} 192 | - component: {fileID: 3401348596094318148} 193 | - component: {fileID: 3720783969492196593} 194 | m_Layer: 5 195 | m_Name: ProgressBar 196 | m_TagString: Untagged 197 | m_Icon: {fileID: 0} 198 | m_NavMeshLayer: 0 199 | m_StaticEditorFlags: 0 200 | m_IsActive: 1 201 | --- !u!224 &3401348596094318139 202 | RectTransform: 203 | m_ObjectHideFlags: 0 204 | m_CorrespondingSourceObject: {fileID: 0} 205 | m_PrefabInstance: {fileID: 0} 206 | m_PrefabAsset: {fileID: 0} 207 | m_GameObject: {fileID: 3401348596094318138} 208 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 209 | m_LocalPosition: {x: 0, y: 0, z: 0} 210 | m_LocalScale: {x: 1, y: 1, z: 1} 211 | m_Children: 212 | - {fileID: 3401348595410424760} 213 | - {fileID: 3401348595165950330} 214 | m_Father: {fileID: 0} 215 | m_RootOrder: 0 216 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 217 | m_AnchorMin: {x: 0, y: 0} 218 | m_AnchorMax: {x: 0, y: 0} 219 | m_AnchoredPosition: {x: 0, y: 0} 220 | m_SizeDelta: {x: 100, y: 100} 221 | m_Pivot: {x: 0, y: 0} 222 | --- !u!114 &3401348596094318148 223 | MonoBehaviour: 224 | m_ObjectHideFlags: 0 225 | m_CorrespondingSourceObject: {fileID: 0} 226 | m_PrefabInstance: {fileID: 0} 227 | m_PrefabAsset: {fileID: 0} 228 | m_GameObject: {fileID: 3401348596094318138} 229 | m_Enabled: 1 230 | m_EditorHideFlags: 0 231 | m_Script: {fileID: -113659843, guid: f70555f144d8491a825f0804e09c671c, type: 3} 232 | m_Name: 233 | m_EditorClassIdentifier: 234 | m_Navigation: 235 | m_Mode: 0 236 | m_SelectOnUp: {fileID: 0} 237 | m_SelectOnDown: {fileID: 0} 238 | m_SelectOnLeft: {fileID: 0} 239 | m_SelectOnRight: {fileID: 0} 240 | m_Transition: 0 241 | m_Colors: 242 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 243 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 244 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 245 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 246 | m_ColorMultiplier: 1 247 | m_FadeDuration: 0.1 248 | m_SpriteState: 249 | m_HighlightedSprite: {fileID: 0} 250 | m_PressedSprite: {fileID: 0} 251 | m_DisabledSprite: {fileID: 0} 252 | m_AnimationTriggers: 253 | m_NormalTrigger: Normal 254 | m_HighlightedTrigger: Highlighted 255 | m_PressedTrigger: Pressed 256 | m_DisabledTrigger: Disabled 257 | m_Interactable: 0 258 | m_TargetGraphic: {fileID: 0} 259 | m_FillRect: {fileID: 3401348595976271525} 260 | m_HandleRect: {fileID: 0} 261 | m_Direction: 2 262 | m_MinValue: 0 263 | m_MaxValue: 1 264 | m_WholeNumbers: 0 265 | m_Value: 0.5 266 | m_OnValueChanged: 267 | m_PersistentCalls: 268 | m_Calls: [] 269 | --- !u!114 &3720783969492196593 270 | MonoBehaviour: 271 | m_ObjectHideFlags: 0 272 | m_CorrespondingSourceObject: {fileID: 0} 273 | m_PrefabInstance: {fileID: 0} 274 | m_PrefabAsset: {fileID: 0} 275 | m_GameObject: {fileID: 3401348596094318138} 276 | m_Enabled: 1 277 | m_EditorHideFlags: 0 278 | m_Script: {fileID: 11500000, guid: 8b6eb4e4f61e21a4c8facd7586530716, type: 3} 279 | m_Name: 280 | m_EditorClassIdentifier: 281 | slider: {fileID: 3401348596094318148} 282 | data: {fileID: 0} 283 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/ProgressBar.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 61316d189acf74e4b8bf00aef51d499d 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/UI.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3201264846060713528 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 3201264846060713524} 12 | - component: {fileID: 3201264846060713525} 13 | - component: {fileID: 3201264846060713526} 14 | - component: {fileID: 3201264846060713527} 15 | m_Layer: 5 16 | m_Name: UI 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!224 &3201264846060713524 23 | RectTransform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 3201264846060713528} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 0, y: 0, z: 0} 32 | m_Children: 33 | - {fileID: 5452054565858635712} 34 | - {fileID: 1294203839815670052} 35 | - {fileID: 3183760179214872281} 36 | m_Father: {fileID: 0} 37 | m_RootOrder: 0 38 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 39 | m_AnchorMin: {x: 0, y: 0} 40 | m_AnchorMax: {x: 0, y: 0} 41 | m_AnchoredPosition: {x: 0, y: 0} 42 | m_SizeDelta: {x: 0, y: 0} 43 | m_Pivot: {x: 0, y: 0} 44 | --- !u!223 &3201264846060713525 45 | Canvas: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 3201264846060713528} 51 | m_Enabled: 1 52 | serializedVersion: 3 53 | m_RenderMode: 0 54 | m_Camera: {fileID: 0} 55 | m_PlaneDistance: 100 56 | m_PixelPerfect: 0 57 | m_ReceivesEvents: 1 58 | m_OverrideSorting: 0 59 | m_OverridePixelPerfect: 0 60 | m_SortingBucketNormalizedSize: 0 61 | m_AdditionalShaderChannelsFlag: 0 62 | m_SortingLayerID: 0 63 | m_SortingOrder: 0 64 | m_TargetDisplay: 0 65 | --- !u!114 &3201264846060713526 66 | MonoBehaviour: 67 | m_ObjectHideFlags: 0 68 | m_CorrespondingSourceObject: {fileID: 0} 69 | m_PrefabInstance: {fileID: 0} 70 | m_PrefabAsset: {fileID: 0} 71 | m_GameObject: {fileID: 3201264846060713528} 72 | m_Enabled: 1 73 | m_EditorHideFlags: 0 74 | m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3} 75 | m_Name: 76 | m_EditorClassIdentifier: 77 | m_UiScaleMode: 0 78 | m_ReferencePixelsPerUnit: 100 79 | m_ScaleFactor: 1 80 | m_ReferenceResolution: {x: 800, y: 600} 81 | m_ScreenMatchMode: 0 82 | m_MatchWidthOrHeight: 0 83 | m_PhysicalUnit: 3 84 | m_FallbackScreenDPI: 96 85 | m_DefaultSpriteDPI: 96 86 | m_DynamicPixelsPerUnit: 1 87 | --- !u!114 &3201264846060713527 88 | MonoBehaviour: 89 | m_ObjectHideFlags: 0 90 | m_CorrespondingSourceObject: {fileID: 0} 91 | m_PrefabInstance: {fileID: 0} 92 | m_PrefabAsset: {fileID: 0} 93 | m_GameObject: {fileID: 3201264846060713528} 94 | m_Enabled: 1 95 | m_EditorHideFlags: 0 96 | m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3} 97 | m_Name: 98 | m_EditorClassIdentifier: 99 | m_IgnoreReversedGraphics: 1 100 | m_BlockingObjects: 0 101 | m_BlockingMask: 102 | serializedVersion: 2 103 | m_Bits: 4294967295 104 | --- !u!1 &5983752389616769492 105 | GameObject: 106 | m_ObjectHideFlags: 0 107 | m_CorrespondingSourceObject: {fileID: 0} 108 | m_PrefabInstance: {fileID: 0} 109 | m_PrefabAsset: {fileID: 0} 110 | serializedVersion: 6 111 | m_Component: 112 | - component: {fileID: 3183760179214872281} 113 | - component: {fileID: 4888599164617372829} 114 | - component: {fileID: 5428831455605194471} 115 | m_Layer: 5 116 | m_Name: QuickSlots 117 | m_TagString: Untagged 118 | m_Icon: {fileID: 0} 119 | m_NavMeshLayer: 0 120 | m_StaticEditorFlags: 0 121 | m_IsActive: 1 122 | --- !u!224 &3183760179214872281 123 | RectTransform: 124 | m_ObjectHideFlags: 0 125 | m_CorrespondingSourceObject: {fileID: 0} 126 | m_PrefabInstance: {fileID: 0} 127 | m_PrefabAsset: {fileID: 0} 128 | m_GameObject: {fileID: 5983752389616769492} 129 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 130 | m_LocalPosition: {x: 0, y: 0, z: 0} 131 | m_LocalScale: {x: 1, y: 1, z: 1} 132 | m_Children: [] 133 | m_Father: {fileID: 3201264846060713524} 134 | m_RootOrder: 2 135 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 136 | m_AnchorMin: {x: 0.2, y: 0} 137 | m_AnchorMax: {x: 0.8, y: 0} 138 | m_AnchoredPosition: {x: 0, y: 0} 139 | m_SizeDelta: {x: -180, y: 40} 140 | m_Pivot: {x: 0.5, y: 0} 141 | --- !u!222 &4888599164617372829 142 | CanvasRenderer: 143 | m_ObjectHideFlags: 0 144 | m_CorrespondingSourceObject: {fileID: 0} 145 | m_PrefabInstance: {fileID: 0} 146 | m_PrefabAsset: {fileID: 0} 147 | m_GameObject: {fileID: 5983752389616769492} 148 | m_CullTransparentMesh: 0 149 | --- !u!114 &5428831455605194471 150 | MonoBehaviour: 151 | m_ObjectHideFlags: 0 152 | m_CorrespondingSourceObject: {fileID: 0} 153 | m_PrefabInstance: {fileID: 0} 154 | m_PrefabAsset: {fileID: 0} 155 | m_GameObject: {fileID: 5983752389616769492} 156 | m_Enabled: 1 157 | m_EditorHideFlags: 0 158 | m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} 159 | m_Name: 160 | m_EditorClassIdentifier: 161 | m_Material: {fileID: 0} 162 | m_Color: {r: 0.13333334, g: 0.13333334, b: 0.13333334, a: 0.5019608} 163 | m_RaycastTarget: 1 164 | m_OnCullStateChanged: 165 | m_PersistentCalls: 166 | m_Calls: [] 167 | m_Sprite: {fileID: 0} 168 | m_Type: 0 169 | m_PreserveAspect: 0 170 | m_FillCenter: 1 171 | m_FillMethod: 4 172 | m_FillAmount: 1 173 | m_FillClockwise: 1 174 | m_FillOrigin: 0 175 | m_UseSpriteMesh: 0 176 | --- !u!1001 &4522153954277158687 177 | PrefabInstance: 178 | m_ObjectHideFlags: 0 179 | serializedVersion: 2 180 | m_Modification: 181 | m_TransformParent: {fileID: 3201264846060713524} 182 | m_Modifications: 183 | - target: {fileID: 3401348596094318138, guid: 61316d189acf74e4b8bf00aef51d499d, 184 | type: 3} 185 | propertyPath: m_Name 186 | value: ManaBar 187 | objectReference: {fileID: 0} 188 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 189 | type: 3} 190 | propertyPath: m_LocalPosition.x 191 | value: 0 192 | objectReference: {fileID: 0} 193 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 194 | type: 3} 195 | propertyPath: m_LocalPosition.y 196 | value: 0 197 | objectReference: {fileID: 0} 198 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 199 | type: 3} 200 | propertyPath: m_LocalPosition.z 201 | value: 0 202 | objectReference: {fileID: 0} 203 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 204 | type: 3} 205 | propertyPath: m_LocalRotation.x 206 | value: 0 207 | objectReference: {fileID: 0} 208 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 209 | type: 3} 210 | propertyPath: m_LocalRotation.y 211 | value: 0 212 | objectReference: {fileID: 0} 213 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 214 | type: 3} 215 | propertyPath: m_LocalRotation.z 216 | value: 0 217 | objectReference: {fileID: 0} 218 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 219 | type: 3} 220 | propertyPath: m_LocalRotation.w 221 | value: 1 222 | objectReference: {fileID: 0} 223 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 224 | type: 3} 225 | propertyPath: m_RootOrder 226 | value: 1 227 | objectReference: {fileID: 0} 228 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 229 | type: 3} 230 | propertyPath: m_LocalEulerAnglesHint.x 231 | value: 0 232 | objectReference: {fileID: 0} 233 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 234 | type: 3} 235 | propertyPath: m_LocalEulerAnglesHint.y 236 | value: 0 237 | objectReference: {fileID: 0} 238 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 239 | type: 3} 240 | propertyPath: m_LocalEulerAnglesHint.z 241 | value: 0 242 | objectReference: {fileID: 0} 243 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 244 | type: 3} 245 | propertyPath: m_AnchoredPosition.x 246 | value: 0 247 | objectReference: {fileID: 0} 248 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 249 | type: 3} 250 | propertyPath: m_AnchoredPosition.y 251 | value: 0 252 | objectReference: {fileID: 0} 253 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 254 | type: 3} 255 | propertyPath: m_SizeDelta.x 256 | value: 80 257 | objectReference: {fileID: 0} 258 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 259 | type: 3} 260 | propertyPath: m_SizeDelta.y 261 | value: 80 262 | objectReference: {fileID: 0} 263 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 264 | type: 3} 265 | propertyPath: m_AnchorMin.x 266 | value: 0.8 267 | objectReference: {fileID: 0} 268 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 269 | type: 3} 270 | propertyPath: m_AnchorMin.y 271 | value: 0 272 | objectReference: {fileID: 0} 273 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 274 | type: 3} 275 | propertyPath: m_AnchorMax.x 276 | value: 0.8 277 | objectReference: {fileID: 0} 278 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 279 | type: 3} 280 | propertyPath: m_AnchorMax.y 281 | value: 0 282 | objectReference: {fileID: 0} 283 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 284 | type: 3} 285 | propertyPath: m_Pivot.x 286 | value: 1 287 | objectReference: {fileID: 0} 288 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 289 | type: 3} 290 | propertyPath: m_Pivot.y 291 | value: 0 292 | objectReference: {fileID: 0} 293 | - target: {fileID: 3401348595976271525, guid: 61316d189acf74e4b8bf00aef51d499d, 294 | type: 3} 295 | propertyPath: m_AnchorMax.x 296 | value: 0 297 | objectReference: {fileID: 0} 298 | - target: {fileID: 3401348595976271525, guid: 61316d189acf74e4b8bf00aef51d499d, 299 | type: 3} 300 | propertyPath: m_AnchorMax.y 301 | value: 0 302 | objectReference: {fileID: 0} 303 | - target: {fileID: 3401348595976271526, guid: 61316d189acf74e4b8bf00aef51d499d, 304 | type: 3} 305 | propertyPath: m_Color.r 306 | value: 0.06666667 307 | objectReference: {fileID: 0} 308 | - target: {fileID: 3401348595976271526, guid: 61316d189acf74e4b8bf00aef51d499d, 309 | type: 3} 310 | propertyPath: m_Color.g 311 | value: 0.06666667 312 | objectReference: {fileID: 0} 313 | - target: {fileID: 3401348595976271526, guid: 61316d189acf74e4b8bf00aef51d499d, 314 | type: 3} 315 | propertyPath: m_Color.b 316 | value: 0.53333336 317 | objectReference: {fileID: 0} 318 | m_RemovedComponents: [] 319 | m_SourcePrefab: {fileID: 100100000, guid: 61316d189acf74e4b8bf00aef51d499d, type: 3} 320 | --- !u!224 &1294203839815670052 stripped 321 | RectTransform: 322 | m_CorrespondingSourceObject: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 323 | type: 3} 324 | m_PrefabInstance: {fileID: 4522153954277158687} 325 | m_PrefabAsset: {fileID: 0} 326 | --- !u!1001 &7250111757865540091 327 | PrefabInstance: 328 | m_ObjectHideFlags: 0 329 | serializedVersion: 2 330 | m_Modification: 331 | m_TransformParent: {fileID: 3201264846060713524} 332 | m_Modifications: 333 | - target: {fileID: 3401348596094318138, guid: 61316d189acf74e4b8bf00aef51d499d, 334 | type: 3} 335 | propertyPath: m_Name 336 | value: HealthBar 337 | objectReference: {fileID: 0} 338 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 339 | type: 3} 340 | propertyPath: m_LocalPosition.x 341 | value: 0 342 | objectReference: {fileID: 0} 343 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 344 | type: 3} 345 | propertyPath: m_LocalPosition.y 346 | value: 0 347 | objectReference: {fileID: 0} 348 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 349 | type: 3} 350 | propertyPath: m_LocalPosition.z 351 | value: 0 352 | objectReference: {fileID: 0} 353 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 354 | type: 3} 355 | propertyPath: m_LocalRotation.x 356 | value: 0 357 | objectReference: {fileID: 0} 358 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 359 | type: 3} 360 | propertyPath: m_LocalRotation.y 361 | value: 0 362 | objectReference: {fileID: 0} 363 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 364 | type: 3} 365 | propertyPath: m_LocalRotation.z 366 | value: 0 367 | objectReference: {fileID: 0} 368 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 369 | type: 3} 370 | propertyPath: m_LocalRotation.w 371 | value: 1 372 | objectReference: {fileID: 0} 373 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 374 | type: 3} 375 | propertyPath: m_RootOrder 376 | value: 0 377 | objectReference: {fileID: 0} 378 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 379 | type: 3} 380 | propertyPath: m_LocalEulerAnglesHint.x 381 | value: 0 382 | objectReference: {fileID: 0} 383 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 384 | type: 3} 385 | propertyPath: m_LocalEulerAnglesHint.y 386 | value: 0 387 | objectReference: {fileID: 0} 388 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 389 | type: 3} 390 | propertyPath: m_LocalEulerAnglesHint.z 391 | value: 0 392 | objectReference: {fileID: 0} 393 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 394 | type: 3} 395 | propertyPath: m_AnchoredPosition.x 396 | value: 0 397 | objectReference: {fileID: 0} 398 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 399 | type: 3} 400 | propertyPath: m_AnchoredPosition.y 401 | value: 0 402 | objectReference: {fileID: 0} 403 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 404 | type: 3} 405 | propertyPath: m_SizeDelta.x 406 | value: 80 407 | objectReference: {fileID: 0} 408 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 409 | type: 3} 410 | propertyPath: m_SizeDelta.y 411 | value: 80 412 | objectReference: {fileID: 0} 413 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 414 | type: 3} 415 | propertyPath: m_AnchorMin.x 416 | value: 0.2 417 | objectReference: {fileID: 0} 418 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 419 | type: 3} 420 | propertyPath: m_AnchorMin.y 421 | value: 0 422 | objectReference: {fileID: 0} 423 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 424 | type: 3} 425 | propertyPath: m_AnchorMax.x 426 | value: 0.2 427 | objectReference: {fileID: 0} 428 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 429 | type: 3} 430 | propertyPath: m_AnchorMax.y 431 | value: 0 432 | objectReference: {fileID: 0} 433 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 434 | type: 3} 435 | propertyPath: m_Pivot.x 436 | value: 0 437 | objectReference: {fileID: 0} 438 | - target: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 439 | type: 3} 440 | propertyPath: m_Pivot.y 441 | value: 0 442 | objectReference: {fileID: 0} 443 | - target: {fileID: 3401348595976271525, guid: 61316d189acf74e4b8bf00aef51d499d, 444 | type: 3} 445 | propertyPath: m_AnchorMax.x 446 | value: 0 447 | objectReference: {fileID: 0} 448 | - target: {fileID: 3401348595976271525, guid: 61316d189acf74e4b8bf00aef51d499d, 449 | type: 3} 450 | propertyPath: m_AnchorMax.y 451 | value: 0 452 | objectReference: {fileID: 0} 453 | - target: {fileID: 3401348595976271526, guid: 61316d189acf74e4b8bf00aef51d499d, 454 | type: 3} 455 | propertyPath: m_Color.g 456 | value: 0.13333334 457 | objectReference: {fileID: 0} 458 | - target: {fileID: 3401348595976271526, guid: 61316d189acf74e4b8bf00aef51d499d, 459 | type: 3} 460 | propertyPath: m_Color.b 461 | value: 0.13333334 462 | objectReference: {fileID: 0} 463 | - target: {fileID: 3401348595976271526, guid: 61316d189acf74e4b8bf00aef51d499d, 464 | type: 3} 465 | propertyPath: m_Color.r 466 | value: 0.6 467 | objectReference: {fileID: 0} 468 | m_RemovedComponents: [] 469 | m_SourcePrefab: {fileID: 100100000, guid: 61316d189acf74e4b8bf00aef51d499d, type: 3} 470 | --- !u!224 &5452054565858635712 stripped 471 | RectTransform: 472 | m_CorrespondingSourceObject: {fileID: 3401348596094318139, guid: 61316d189acf74e4b8bf00aef51d499d, 473 | type: 3} 474 | m_PrefabInstance: {fileID: 7250111757865540091} 475 | m_PrefabAsset: {fileID: 0} 476 | -------------------------------------------------------------------------------- /Decoupling/Assets/Prefabs/UI.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e9e64589632d17245b61bfc66c2546bb 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 67057b6d891904d44890faf1a3bfa29d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scenes/Game.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 705507994} 41 | m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 11 47 | m_GIWorkflowMode: 0 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 0 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 10 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_AtlasSize: 1024 61 | m_AO: 0 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_Padding: 2 66 | m_LightmapParameters: {fileID: 0} 67 | m_LightmapsBakeMode: 1 68 | m_TextureCompression: 1 69 | m_FinalGather: 0 70 | m_FinalGatherFiltering: 1 71 | m_FinalGatherRayCount: 256 72 | m_ReflectionCompression: 2 73 | m_MixedBakeMode: 2 74 | m_BakeBackend: 1 75 | m_PVRSampling: 1 76 | m_PVRDirectSampleCount: 32 77 | m_PVRSampleCount: 500 78 | m_PVRBounces: 2 79 | m_PVRFilterTypeDirect: 0 80 | m_PVRFilterTypeIndirect: 0 81 | m_PVRFilterTypeAO: 0 82 | m_PVRFilteringMode: 1 83 | m_PVRCulling: 1 84 | m_PVRFilteringGaussRadiusDirect: 1 85 | m_PVRFilteringGaussRadiusIndirect: 5 86 | m_PVRFilteringGaussRadiusAO: 2 87 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 88 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 89 | m_PVRFilteringAtrousPositionSigmaAO: 1 90 | m_ShowResolutionOverlay: 1 91 | m_LightingDataAsset: {fileID: 0} 92 | m_UseShadowmask: 1 93 | --- !u!196 &4 94 | NavMeshSettings: 95 | serializedVersion: 2 96 | m_ObjectHideFlags: 0 97 | m_BuildSettings: 98 | serializedVersion: 2 99 | agentTypeID: 0 100 | agentRadius: 0.5 101 | agentHeight: 2 102 | agentSlope: 45 103 | agentClimb: 0.4 104 | ledgeDropHeight: 0 105 | maxJumpAcrossDistance: 0 106 | minRegionArea: 2 107 | manualCellSize: 0 108 | cellSize: 0.16666667 109 | manualTileSize: 0 110 | tileSize: 256 111 | accuratePlacement: 0 112 | debug: 113 | m_Flags: 0 114 | m_NavMeshData: {fileID: 0} 115 | --- !u!1001 &228698003 116 | PrefabInstance: 117 | m_ObjectHideFlags: 0 118 | serializedVersion: 2 119 | m_Modification: 120 | m_TransformParent: {fileID: 0} 121 | m_Modifications: 122 | - target: {fileID: 3201264846060713528, guid: e9e64589632d17245b61bfc66c2546bb, 123 | type: 3} 124 | propertyPath: m_Name 125 | value: UI 126 | objectReference: {fileID: 0} 127 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 128 | type: 3} 129 | propertyPath: m_LocalPosition.x 130 | value: 0 131 | objectReference: {fileID: 0} 132 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 133 | type: 3} 134 | propertyPath: m_LocalPosition.y 135 | value: 0 136 | objectReference: {fileID: 0} 137 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 138 | type: 3} 139 | propertyPath: m_LocalPosition.z 140 | value: 0 141 | objectReference: {fileID: 0} 142 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 143 | type: 3} 144 | propertyPath: m_LocalRotation.x 145 | value: 0 146 | objectReference: {fileID: 0} 147 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 148 | type: 3} 149 | propertyPath: m_LocalRotation.y 150 | value: 0 151 | objectReference: {fileID: 0} 152 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 153 | type: 3} 154 | propertyPath: m_LocalRotation.z 155 | value: 0 156 | objectReference: {fileID: 0} 157 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 158 | type: 3} 159 | propertyPath: m_LocalRotation.w 160 | value: 1 161 | objectReference: {fileID: 0} 162 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 163 | type: 3} 164 | propertyPath: m_RootOrder 165 | value: 2 166 | objectReference: {fileID: 0} 167 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 168 | type: 3} 169 | propertyPath: m_LocalEulerAnglesHint.x 170 | value: 0 171 | objectReference: {fileID: 0} 172 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 173 | type: 3} 174 | propertyPath: m_LocalEulerAnglesHint.y 175 | value: 0 176 | objectReference: {fileID: 0} 177 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 178 | type: 3} 179 | propertyPath: m_LocalEulerAnglesHint.z 180 | value: 0 181 | objectReference: {fileID: 0} 182 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 183 | type: 3} 184 | propertyPath: m_AnchoredPosition.x 185 | value: 0 186 | objectReference: {fileID: 0} 187 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 188 | type: 3} 189 | propertyPath: m_AnchoredPosition.y 190 | value: 0 191 | objectReference: {fileID: 0} 192 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 193 | type: 3} 194 | propertyPath: m_SizeDelta.x 195 | value: 0 196 | objectReference: {fileID: 0} 197 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 198 | type: 3} 199 | propertyPath: m_SizeDelta.y 200 | value: 0 201 | objectReference: {fileID: 0} 202 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 203 | type: 3} 204 | propertyPath: m_AnchorMin.x 205 | value: 0 206 | objectReference: {fileID: 0} 207 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 208 | type: 3} 209 | propertyPath: m_AnchorMin.y 210 | value: 0 211 | objectReference: {fileID: 0} 212 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 213 | type: 3} 214 | propertyPath: m_AnchorMax.x 215 | value: 0 216 | objectReference: {fileID: 0} 217 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 218 | type: 3} 219 | propertyPath: m_AnchorMax.y 220 | value: 0 221 | objectReference: {fileID: 0} 222 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 223 | type: 3} 224 | propertyPath: m_Pivot.x 225 | value: 0 226 | objectReference: {fileID: 0} 227 | - target: {fileID: 3201264846060713524, guid: e9e64589632d17245b61bfc66c2546bb, 228 | type: 3} 229 | propertyPath: m_Pivot.y 230 | value: 0 231 | objectReference: {fileID: 0} 232 | - target: {fileID: 5452054565640023902, guid: e9e64589632d17245b61bfc66c2546bb, 233 | type: 3} 234 | propertyPath: m_AnchorMax.x 235 | value: 0 236 | objectReference: {fileID: 0} 237 | - target: {fileID: 5452054565640023902, guid: e9e64589632d17245b61bfc66c2546bb, 238 | type: 3} 239 | propertyPath: m_AnchorMax.y 240 | value: 0 241 | objectReference: {fileID: 0} 242 | - target: {fileID: 1294203839697721786, guid: e9e64589632d17245b61bfc66c2546bb, 243 | type: 3} 244 | propertyPath: m_AnchorMax.x 245 | value: 0 246 | objectReference: {fileID: 0} 247 | - target: {fileID: 1294203839697721786, guid: e9e64589632d17245b61bfc66c2546bb, 248 | type: 3} 249 | propertyPath: m_AnchorMax.y 250 | value: 0 251 | objectReference: {fileID: 0} 252 | - target: {fileID: 6286870553982240010, guid: e9e64589632d17245b61bfc66c2546bb, 253 | type: 3} 254 | propertyPath: data 255 | value: 256 | objectReference: {fileID: 11400000, guid: a3b5cacc10e52cb4dacf477ac19a07cb, 257 | type: 2} 258 | - target: {fileID: 964626021152044014, guid: e9e64589632d17245b61bfc66c2546bb, 259 | type: 3} 260 | propertyPath: data 261 | value: 262 | objectReference: {fileID: 11400000, guid: 560495f8111f5724da5599562e0eedec, 263 | type: 2} 264 | m_RemovedComponents: [] 265 | m_SourcePrefab: {fileID: 100100000, guid: e9e64589632d17245b61bfc66c2546bb, type: 3} 266 | --- !u!1 &705507993 267 | GameObject: 268 | m_ObjectHideFlags: 0 269 | m_CorrespondingSourceObject: {fileID: 0} 270 | m_PrefabInstance: {fileID: 0} 271 | m_PrefabAsset: {fileID: 0} 272 | serializedVersion: 6 273 | m_Component: 274 | - component: {fileID: 705507995} 275 | - component: {fileID: 705507994} 276 | m_Layer: 0 277 | m_Name: Directional Light 278 | m_TagString: Untagged 279 | m_Icon: {fileID: 0} 280 | m_NavMeshLayer: 0 281 | m_StaticEditorFlags: 0 282 | m_IsActive: 1 283 | --- !u!108 &705507994 284 | Light: 285 | m_ObjectHideFlags: 0 286 | m_CorrespondingSourceObject: {fileID: 0} 287 | m_PrefabInstance: {fileID: 0} 288 | m_PrefabAsset: {fileID: 0} 289 | m_GameObject: {fileID: 705507993} 290 | m_Enabled: 1 291 | serializedVersion: 8 292 | m_Type: 1 293 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 294 | m_Intensity: 1 295 | m_Range: 10 296 | m_SpotAngle: 30 297 | m_CookieSize: 10 298 | m_Shadows: 299 | m_Type: 2 300 | m_Resolution: -1 301 | m_CustomResolution: -1 302 | m_Strength: 1 303 | m_Bias: 0.05 304 | m_NormalBias: 0.4 305 | m_NearPlane: 0.2 306 | m_Cookie: {fileID: 0} 307 | m_DrawHalo: 0 308 | m_Flare: {fileID: 0} 309 | m_RenderMode: 0 310 | m_CullingMask: 311 | serializedVersion: 2 312 | m_Bits: 4294967295 313 | m_Lightmapping: 1 314 | m_LightShadowCasterMode: 0 315 | m_AreaSize: {x: 1, y: 1} 316 | m_BounceIntensity: 1 317 | m_ColorTemperature: 6570 318 | m_UseColorTemperature: 0 319 | m_ShadowRadius: 0 320 | m_ShadowAngle: 0 321 | --- !u!4 &705507995 322 | Transform: 323 | m_ObjectHideFlags: 0 324 | m_CorrespondingSourceObject: {fileID: 0} 325 | m_PrefabInstance: {fileID: 0} 326 | m_PrefabAsset: {fileID: 0} 327 | m_GameObject: {fileID: 705507993} 328 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 329 | m_LocalPosition: {x: 0, y: 3, z: 0} 330 | m_LocalScale: {x: 1, y: 1, z: 1} 331 | m_Children: [] 332 | m_Father: {fileID: 0} 333 | m_RootOrder: 1 334 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 335 | --- !u!1 &963194225 336 | GameObject: 337 | m_ObjectHideFlags: 0 338 | m_CorrespondingSourceObject: {fileID: 0} 339 | m_PrefabInstance: {fileID: 0} 340 | m_PrefabAsset: {fileID: 0} 341 | serializedVersion: 6 342 | m_Component: 343 | - component: {fileID: 963194228} 344 | - component: {fileID: 963194227} 345 | - component: {fileID: 963194226} 346 | m_Layer: 0 347 | m_Name: Main Camera 348 | m_TagString: MainCamera 349 | m_Icon: {fileID: 0} 350 | m_NavMeshLayer: 0 351 | m_StaticEditorFlags: 0 352 | m_IsActive: 1 353 | --- !u!81 &963194226 354 | AudioListener: 355 | m_ObjectHideFlags: 0 356 | m_CorrespondingSourceObject: {fileID: 0} 357 | m_PrefabInstance: {fileID: 0} 358 | m_PrefabAsset: {fileID: 0} 359 | m_GameObject: {fileID: 963194225} 360 | m_Enabled: 1 361 | --- !u!20 &963194227 362 | Camera: 363 | m_ObjectHideFlags: 0 364 | m_CorrespondingSourceObject: {fileID: 0} 365 | m_PrefabInstance: {fileID: 0} 366 | m_PrefabAsset: {fileID: 0} 367 | m_GameObject: {fileID: 963194225} 368 | m_Enabled: 1 369 | serializedVersion: 2 370 | m_ClearFlags: 1 371 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 372 | m_projectionMatrixMode: 1 373 | m_SensorSize: {x: 36, y: 24} 374 | m_LensShift: {x: 0, y: 0} 375 | m_GateFitMode: 2 376 | m_FocalLength: 50 377 | m_NormalizedViewPortRect: 378 | serializedVersion: 2 379 | x: 0 380 | y: 0 381 | width: 1 382 | height: 1 383 | near clip plane: 1 384 | far clip plane: 100 385 | field of view: 26.991467 386 | orthographic: 0 387 | orthographic size: 5 388 | m_Depth: -1 389 | m_CullingMask: 390 | serializedVersion: 2 391 | m_Bits: 4294967295 392 | m_RenderingPath: -1 393 | m_TargetTexture: {fileID: 0} 394 | m_TargetDisplay: 0 395 | m_TargetEye: 3 396 | m_HDR: 1 397 | m_AllowMSAA: 1 398 | m_AllowDynamicResolution: 0 399 | m_ForceIntoRT: 0 400 | m_OcclusionCulling: 1 401 | m_StereoConvergence: 10 402 | m_StereoSeparation: 0.022 403 | --- !u!4 &963194228 404 | Transform: 405 | m_ObjectHideFlags: 0 406 | m_CorrespondingSourceObject: {fileID: 0} 407 | m_PrefabInstance: {fileID: 0} 408 | m_PrefabAsset: {fileID: 0} 409 | m_GameObject: {fileID: 963194225} 410 | m_LocalRotation: {x: 0.3420201, y: 0, z: 0, w: 0.9396927} 411 | m_LocalPosition: {x: 0, y: 7, z: -10} 412 | m_LocalScale: {x: 1, y: 1, z: 1} 413 | m_Children: [] 414 | m_Father: {fileID: 0} 415 | m_RootOrder: 0 416 | m_LocalEulerAnglesHint: {x: 40, y: 0, z: 0} 417 | --- !u!1001 &3538887381787578260 418 | PrefabInstance: 419 | m_ObjectHideFlags: 0 420 | serializedVersion: 2 421 | m_Modification: 422 | m_TransformParent: {fileID: 0} 423 | m_Modifications: 424 | - target: {fileID: 8762435044969880554, guid: 5b4b9dda9117fe54aa82f756ba918230, 425 | type: 3} 426 | propertyPath: m_Name 427 | value: Dungeon 428 | objectReference: {fileID: 0} 429 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 430 | type: 3} 431 | propertyPath: m_LocalPosition.x 432 | value: 0 433 | objectReference: {fileID: 0} 434 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 435 | type: 3} 436 | propertyPath: m_LocalPosition.y 437 | value: 0 438 | objectReference: {fileID: 0} 439 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 440 | type: 3} 441 | propertyPath: m_LocalPosition.z 442 | value: 0 443 | objectReference: {fileID: 0} 444 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 445 | type: 3} 446 | propertyPath: m_LocalRotation.x 447 | value: 0 448 | objectReference: {fileID: 0} 449 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 450 | type: 3} 451 | propertyPath: m_LocalRotation.y 452 | value: 0 453 | objectReference: {fileID: 0} 454 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 455 | type: 3} 456 | propertyPath: m_LocalRotation.z 457 | value: 0 458 | objectReference: {fileID: 0} 459 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 460 | type: 3} 461 | propertyPath: m_LocalRotation.w 462 | value: 1 463 | objectReference: {fileID: 0} 464 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 465 | type: 3} 466 | propertyPath: m_RootOrder 467 | value: 3 468 | objectReference: {fileID: 0} 469 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 470 | type: 3} 471 | propertyPath: m_LocalEulerAnglesHint.x 472 | value: 0 473 | objectReference: {fileID: 0} 474 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 475 | type: 3} 476 | propertyPath: m_LocalEulerAnglesHint.y 477 | value: 0 478 | objectReference: {fileID: 0} 479 | - target: {fileID: 1252267959797470240, guid: 5b4b9dda9117fe54aa82f756ba918230, 480 | type: 3} 481 | propertyPath: m_LocalEulerAnglesHint.z 482 | value: 0 483 | objectReference: {fileID: 0} 484 | m_RemovedComponents: [] 485 | m_SourcePrefab: {fileID: 100100000, guid: 5b4b9dda9117fe54aa82f756ba918230, type: 3} 486 | --- !u!1001 &6149743647819024155 487 | PrefabInstance: 488 | m_ObjectHideFlags: 0 489 | serializedVersion: 2 490 | m_Modification: 491 | m_TransformParent: {fileID: 0} 492 | m_Modifications: 493 | - target: {fileID: 7764466603690297127, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 494 | type: 3} 495 | propertyPath: m_Name 496 | value: Player 497 | objectReference: {fileID: 0} 498 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 499 | type: 3} 500 | propertyPath: m_LocalPosition.x 501 | value: 0 502 | objectReference: {fileID: 0} 503 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 504 | type: 3} 505 | propertyPath: m_LocalPosition.y 506 | value: 0 507 | objectReference: {fileID: 0} 508 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 509 | type: 3} 510 | propertyPath: m_LocalPosition.z 511 | value: -2 512 | objectReference: {fileID: 0} 513 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 514 | type: 3} 515 | propertyPath: m_LocalRotation.x 516 | value: 0 517 | objectReference: {fileID: 0} 518 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 519 | type: 3} 520 | propertyPath: m_LocalRotation.y 521 | value: 0.86602545 522 | objectReference: {fileID: 0} 523 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 524 | type: 3} 525 | propertyPath: m_LocalRotation.z 526 | value: 0 527 | objectReference: {fileID: 0} 528 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 529 | type: 3} 530 | propertyPath: m_LocalRotation.w 531 | value: 0.49999994 532 | objectReference: {fileID: 0} 533 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 534 | type: 3} 535 | propertyPath: m_RootOrder 536 | value: 4 537 | objectReference: {fileID: 0} 538 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 539 | type: 3} 540 | propertyPath: m_LocalEulerAnglesHint.x 541 | value: 0 542 | objectReference: {fileID: 0} 543 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 544 | type: 3} 545 | propertyPath: m_LocalEulerAnglesHint.y 546 | value: 120 547 | objectReference: {fileID: 0} 548 | - target: {fileID: 483095740043753956, guid: 53efc4fa4d90ed04fbef8595d4fd7693, 549 | type: 3} 550 | propertyPath: m_LocalEulerAnglesHint.z 551 | value: 0 552 | objectReference: {fileID: 0} 553 | m_RemovedComponents: [] 554 | m_SourcePrefab: {fileID: 100100000, guid: 53efc4fa4d90ed04fbef8595d4fd7693, type: 3} 555 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scenes/Game.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b8655ab 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 69aa69415ad4980428ca71a2450714da 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scripts/BoundedFloat.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | [CreateAssetMenu] 4 | public sealed class BoundedFloat : ScriptableObject 5 | { 6 | public float maxValue; 7 | public float value; 8 | } 9 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scripts/BoundedFloat.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 02d9d0c655a44d443b038a45f66f7b90 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scripts/Player.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | public sealed class Player : MonoBehaviour 4 | { 5 | [Header("Setup")] 6 | [SerializeField] private CharacterController controller; 7 | [SerializeField] private float speed; 8 | 9 | [Header("Stats")] 10 | [SerializeField] private BoundedFloat health; 11 | [SerializeField] private BoundedFloat mana; 12 | 13 | void Update() 14 | { 15 | var deltaX = Input.GetAxis("Horizontal"); 16 | var deltaZ = Input.GetAxis("Vertical"); 17 | var forward = new Vector3(deltaX, 0, deltaZ); 18 | 19 | if (forward.sqrMagnitude > 0.01f) 20 | { 21 | transform.localRotation = Quaternion.LookRotation(forward, Vector3.up); 22 | } 23 | 24 | controller.SimpleMove(forward * speed); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scripts/Player.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 575110446718f4b419845f814e067c88 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scripts/StatusBar.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | 4 | public sealed class StatusBar : MonoBehaviour 5 | { 6 | [SerializeField] private Slider slider; 7 | [SerializeField] private BoundedFloat data; 8 | 9 | void Update() 10 | { 11 | slider.maxValue = data.maxValue; 12 | slider.value = data.value; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Decoupling/Assets/Scripts/StatusBar.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8b6eb4e4f61e21a4c8facd7586530716 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Decoupling/Assets/csc.rsp: -------------------------------------------------------------------------------- 1 | -nowarn:649 2 | -warnaserror -------------------------------------------------------------------------------- /Decoupling/Assets/csc.rsp.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce0327f0cb4406945b970daf8149259c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Decoupling/Documentation/Decoupling.dot: -------------------------------------------------------------------------------- 1 | digraph G { 2 | 3 | UI; 4 | Player; 5 | 6 | node [shape=Rect] 7 | PlayerHealth; 8 | PlayerMana; 9 | 10 | UI -> PlayerHealth; 11 | UI -> PlayerMana; 12 | Player -> PlayerHealth; 13 | Player -> PlayerMana; 14 | } 15 | -------------------------------------------------------------------------------- /Decoupling/Documentation/Decoupling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jimmy2822/gamedev-workshop/da1b3131616a63ea344cab8c4845d8919cc6b9ab/Decoupling/Documentation/Decoupling.png -------------------------------------------------------------------------------- /Decoupling/Documentation/Dependencies.dot: -------------------------------------------------------------------------------- 1 | digraph G { 2 | 3 | UI -> Player; 4 | UI -> Inventory; 5 | UI -> Equipment; 6 | UI -> TalentTree; 7 | UI -> CharacterStats; 8 | UI -> SpellBook; 9 | UI -> BuffManager; 10 | 11 | Player -> Inventory; 12 | Player -> Equipment; 13 | Player -> TalentTree; 14 | Player -> CharacterStats; 15 | Player -> SpellBook; 16 | Player -> BuffManager; 17 | 18 | Inventory -> Items; 19 | Inventory -> Equipment; 20 | 21 | Equipment -> Inventory; 22 | Equipment -> CharacterStats; 23 | Equipment -> SpellBook; 24 | Equipment -> BuffManager; 25 | 26 | TalentTree -> Player; 27 | TalentTree -> CharacterStats; 28 | TalentTree -> SpellBook; 29 | TalentTree -> BuffManager; 30 | 31 | SpellBook -> Inventory; 32 | SpellBook -> Spells; 33 | 34 | BuffManager -> CharacterStats; 35 | BuffManager -> EnemyManager; 36 | 37 | Spells -> BuffManager; 38 | Spells -> EnemyManager; 39 | Spells -> CharacterStats; 40 | 41 | Items -> Sockets; 42 | Items -> Gems; 43 | Sockets -> Gems; 44 | 45 | EnemyManager -> Player; 46 | } 47 | -------------------------------------------------------------------------------- /Decoupling/Documentation/Dependencies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jimmy2822/gamedev-workshop/da1b3131616a63ea344cab8c4845d8919cc6b9ab/Decoupling/Documentation/Dependencies.png -------------------------------------------------------------------------------- /Decoupling/Documentation/HealthBar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jimmy2822/gamedev-workshop/da1b3131616a63ea344cab8c4845d8919cc6b9ab/Decoupling/Documentation/HealthBar.png -------------------------------------------------------------------------------- /Decoupling/Documentation/HealthBar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jimmy2822/gamedev-workshop/da1b3131616a63ea344cab8c4845d8919cc6b9ab/Decoupling/Documentation/HealthBar2.png -------------------------------------------------------------------------------- /Decoupling/Documentation/ScriptableObjects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jimmy2822/gamedev-workshop/da1b3131616a63ea344cab8c4845d8919cc6b9ab/Decoupling/Documentation/ScriptableObjects.png -------------------------------------------------------------------------------- /Decoupling/Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.package-manager-ui": "2.0.8", 4 | "com.unity.modules.audio": "1.0.0", 5 | "com.unity.modules.imgui": "1.0.0", 6 | "com.unity.modules.physics": "1.0.0", 7 | "com.unity.modules.ui": "1.0.0" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 1024 20 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | m_FrictionType: 0 32 | m_EnableEnhancedDeterminism: 0 33 | m_EnableUnifiedHeightmaps: 1 34 | m_DefaultMaxAngluarSpeed: 7 35 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: 8 | - enabled: 1 9 | path: Assets/Scenes/Game.unity 10 | guid: 9fc0d4010bbf28b4594072e72b8655ab 11 | m_configObjects: {} 12 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 7 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 2 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInPlayMode: 1 24 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 12 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | m_PreloadedShaders: [] 39 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 40 | type: 0} 41 | m_CustomRenderPipeline: {fileID: 0} 42 | m_TransparencySortMode: 0 43 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 44 | m_DefaultRenderingPath: 1 45 | m_DefaultMobileRenderingPath: 1 46 | m_TierSettings: [] 47 | m_LightmapStripping: 0 48 | m_FogStripping: 0 49 | m_InstancingStripping: 0 50 | m_LightmapKeepPlain: 1 51 | m_LightmapKeepDirCombined: 1 52 | m_LightmapKeepDynamicPlain: 1 53 | m_LightmapKeepDynamicDirCombined: 1 54 | m_LightmapKeepShadowMask: 1 55 | m_LightmapKeepSubtractive: 1 56 | m_FogKeepLinear: 1 57 | m_FogKeepExp: 1 58 | m_FogKeepExp2: 1 59 | m_AlbedoSwatchInfos: [] 60 | m_LightsUseLinearIntensity: 0 61 | m_LightsUseColorTemperature: 0 62 | m_LogWhenShaderIsCompiled: 0 63 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | m_DefaultList: [] 7 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 18 7 | productGUID: 21b1b7019367fe7419dad8ba6a3dc605 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: DefaultCompany 16 | productName: Workshop1 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_MTRendering: 1 52 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 53 | iosShowActivityIndicatorOnLoading: -1 54 | androidShowActivityIndicatorOnLoading: -1 55 | displayResolutionDialog: 0 56 | iosUseCustomAppBackgroundBehavior: 0 57 | iosAllowHTTPDownload: 1 58 | allowedAutorotateToPortrait: 1 59 | allowedAutorotateToPortraitUpsideDown: 1 60 | allowedAutorotateToLandscapeRight: 1 61 | allowedAutorotateToLandscapeLeft: 1 62 | useOSAutorotation: 1 63 | use32BitDisplayBuffer: 1 64 | preserveFramebufferAlpha: 0 65 | disableDepthAndStencilBuffers: 0 66 | androidStartInFullscreen: 1 67 | androidRenderOutsideSafeArea: 1 68 | androidBlitType: 0 69 | defaultIsNativeResolution: 1 70 | macRetinaSupport: 1 71 | runInBackground: 1 72 | captureSingleScreen: 0 73 | muteOtherAudioSources: 0 74 | Prepare IOS For Recording: 0 75 | Force IOS Speakers When Recording: 0 76 | deferSystemGesturesMode: 0 77 | hideHomeButton: 0 78 | submitAnalytics: 1 79 | usePlayerLog: 1 80 | bakeCollisionMeshes: 0 81 | forceSingleInstance: 0 82 | resizableWindow: 0 83 | useMacAppStoreValidation: 0 84 | macAppStoreCategory: public.app-category.games 85 | gpuSkinning: 1 86 | graphicsJobs: 0 87 | xboxPIXTextureCapture: 0 88 | xboxEnableAvatar: 0 89 | xboxEnableKinect: 0 90 | xboxEnableKinectAutoTracking: 0 91 | xboxEnableFitness: 0 92 | visibleInBackground: 1 93 | allowFullscreenSwitch: 1 94 | graphicsJobMode: 0 95 | fullscreenMode: 1 96 | xboxSpeechDB: 0 97 | xboxEnableHeadOrientation: 0 98 | xboxEnableGuest: 0 99 | xboxEnablePIXSampling: 0 100 | metalFramebufferOnly: 0 101 | xboxOneResolution: 0 102 | xboxOneSResolution: 0 103 | xboxOneXResolution: 3 104 | xboxOneMonoLoggingLevel: 0 105 | xboxOneLoggingLevel: 1 106 | xboxOneDisableEsram: 0 107 | xboxOnePresentImmediateThreshold: 0 108 | switchQueueCommandMemory: 0 109 | switchQueueControlMemory: 16384 110 | switchQueueComputeMemory: 262144 111 | switchNVNShaderPoolsGranularity: 33554432 112 | switchNVNDefaultPoolsGranularity: 16777216 113 | switchNVNOtherPoolsGranularity: 16777216 114 | vulkanEnableSetSRGBWrite: 0 115 | m_SupportedAspectRatios: 116 | 4:3: 1 117 | 5:4: 1 118 | 16:10: 1 119 | 16:9: 1 120 | Others: 1 121 | bundleVersion: 0.1 122 | preloadedAssets: [] 123 | metroInputSource: 0 124 | wsaTransparentSwapchain: 0 125 | m_HolographicPauseOnTrackingLoss: 1 126 | xboxOneDisableKinectGpuReservation: 1 127 | xboxOneEnable7thCore: 1 128 | isWsaHolographicRemotingEnabled: 0 129 | vrSettings: 130 | cardboard: 131 | depthFormat: 0 132 | enableTransitionView: 0 133 | daydream: 134 | depthFormat: 0 135 | useSustainedPerformanceMode: 0 136 | enableVideoLayer: 0 137 | useProtectedVideoMemory: 0 138 | minimumSupportedHeadTracking: 0 139 | maximumSupportedHeadTracking: 1 140 | hololens: 141 | depthFormat: 1 142 | depthBufferSharingEnabled: 1 143 | oculus: 144 | sharedDepthBuffer: 1 145 | dashSupport: 1 146 | lowOverheadMode: 0 147 | protectedContext: 0 148 | v2Signing: 0 149 | enable360StereoCapture: 0 150 | protectGraphicsMemory: 0 151 | enableFrameTimingStats: 0 152 | useHDRDisplay: 0 153 | m_ColorGamuts: 00000000 154 | targetPixelDensity: 30 155 | resolutionScalingMode: 0 156 | androidSupportedAspectRatio: 1 157 | androidMaxAspectRatio: 2.1 158 | applicationIdentifier: {} 159 | buildNumber: {} 160 | AndroidBundleVersionCode: 1 161 | AndroidMinSdkVersion: 16 162 | AndroidTargetSdkVersion: 0 163 | AndroidPreferredInstallLocation: 1 164 | aotOptions: 165 | stripEngineCode: 1 166 | iPhoneStrippingLevel: 0 167 | iPhoneScriptCallOptimization: 0 168 | ForceInternetPermission: 0 169 | ForceSDCardPermission: 0 170 | CreateWallpaper: 0 171 | APKExpansionFiles: 0 172 | keepLoadedShadersAlive: 0 173 | StripUnusedMeshComponents: 1 174 | VertexChannelCompressionMask: 4054 175 | iPhoneSdkVersion: 988 176 | iOSTargetOSVersionString: 9.0 177 | tvOSSdkVersion: 0 178 | tvOSRequireExtendedGameController: 0 179 | tvOSTargetOSVersionString: 9.0 180 | uIPrerenderedIcon: 0 181 | uIRequiresPersistentWiFi: 0 182 | uIRequiresFullScreen: 1 183 | uIStatusBarHidden: 1 184 | uIExitOnSuspend: 0 185 | uIStatusBarStyle: 0 186 | iPhoneSplashScreen: {fileID: 0} 187 | iPhoneHighResSplashScreen: {fileID: 0} 188 | iPhoneTallHighResSplashScreen: {fileID: 0} 189 | iPhone47inSplashScreen: {fileID: 0} 190 | iPhone55inPortraitSplashScreen: {fileID: 0} 191 | iPhone55inLandscapeSplashScreen: {fileID: 0} 192 | iPhone58inPortraitSplashScreen: {fileID: 0} 193 | iPhone58inLandscapeSplashScreen: {fileID: 0} 194 | iPadPortraitSplashScreen: {fileID: 0} 195 | iPadHighResPortraitSplashScreen: {fileID: 0} 196 | iPadLandscapeSplashScreen: {fileID: 0} 197 | iPadHighResLandscapeSplashScreen: {fileID: 0} 198 | appleTVSplashScreen: {fileID: 0} 199 | appleTVSplashScreen2x: {fileID: 0} 200 | tvOSSmallIconLayers: [] 201 | tvOSSmallIconLayers2x: [] 202 | tvOSLargeIconLayers: [] 203 | tvOSLargeIconLayers2x: [] 204 | tvOSTopShelfImageLayers: [] 205 | tvOSTopShelfImageLayers2x: [] 206 | tvOSTopShelfImageWideLayers: [] 207 | tvOSTopShelfImageWideLayers2x: [] 208 | iOSLaunchScreenType: 0 209 | iOSLaunchScreenPortrait: {fileID: 0} 210 | iOSLaunchScreenLandscape: {fileID: 0} 211 | iOSLaunchScreenBackgroundColor: 212 | serializedVersion: 2 213 | rgba: 0 214 | iOSLaunchScreenFillPct: 100 215 | iOSLaunchScreenSize: 100 216 | iOSLaunchScreenCustomXibPath: 217 | iOSLaunchScreeniPadType: 0 218 | iOSLaunchScreeniPadImage: {fileID: 0} 219 | iOSLaunchScreeniPadBackgroundColor: 220 | serializedVersion: 2 221 | rgba: 0 222 | iOSLaunchScreeniPadFillPct: 100 223 | iOSLaunchScreeniPadSize: 100 224 | iOSLaunchScreeniPadCustomXibPath: 225 | iOSUseLaunchScreenStoryboard: 0 226 | iOSLaunchScreenCustomStoryboardPath: 227 | iOSDeviceRequirements: [] 228 | iOSURLSchemes: [] 229 | iOSBackgroundModes: 0 230 | iOSMetalForceHardShadows: 0 231 | metalEditorSupport: 1 232 | metalAPIValidation: 1 233 | iOSRenderExtraFrameOnPause: 0 234 | appleDeveloperTeamID: 235 | iOSManualSigningProvisioningProfileID: 236 | tvOSManualSigningProvisioningProfileID: 237 | iOSManualSigningProvisioningProfileType: 0 238 | tvOSManualSigningProvisioningProfileType: 0 239 | appleEnableAutomaticSigning: 0 240 | iOSRequireARKit: 0 241 | iOSAutomaticallyDetectAndAddCapabilities: 1 242 | appleEnableProMotion: 0 243 | clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea 244 | templatePackageId: com.unity.template.3d@3.1.2 245 | templateDefaultScene: Assets/Scenes/SampleScene.unity 246 | AndroidTargetArchitectures: 1 247 | AndroidSplashScreenScale: 0 248 | androidSplashScreen: {fileID: 0} 249 | AndroidKeystoreName: '{inproject}: ' 250 | AndroidKeyaliasName: 251 | AndroidBuildApkPerCpuArchitecture: 0 252 | AndroidTVCompatibility: 0 253 | AndroidIsGame: 1 254 | AndroidEnableTango: 0 255 | androidEnableBanner: 1 256 | androidUseLowAccuracyLocation: 0 257 | m_AndroidBanners: 258 | - width: 320 259 | height: 180 260 | banner: {fileID: 0} 261 | androidGamepadSupportLevel: 0 262 | resolutionDialogBanner: {fileID: 0} 263 | m_BuildTargetIcons: [] 264 | m_BuildTargetPlatformIcons: [] 265 | m_BuildTargetBatching: 266 | - m_BuildTarget: Standalone 267 | m_StaticBatching: 1 268 | m_DynamicBatching: 0 269 | - m_BuildTarget: tvOS 270 | m_StaticBatching: 1 271 | m_DynamicBatching: 0 272 | - m_BuildTarget: Android 273 | m_StaticBatching: 1 274 | m_DynamicBatching: 0 275 | - m_BuildTarget: iPhone 276 | m_StaticBatching: 1 277 | m_DynamicBatching: 0 278 | - m_BuildTarget: WebGL 279 | m_StaticBatching: 0 280 | m_DynamicBatching: 0 281 | m_BuildTargetGraphicsAPIs: 282 | - m_BuildTarget: AndroidPlayer 283 | m_APIs: 150000000b000000 284 | m_Automatic: 0 285 | - m_BuildTarget: iOSSupport 286 | m_APIs: 10000000 287 | m_Automatic: 1 288 | - m_BuildTarget: AppleTVSupport 289 | m_APIs: 10000000 290 | m_Automatic: 0 291 | - m_BuildTarget: WebGLSupport 292 | m_APIs: 0b000000 293 | m_Automatic: 1 294 | m_BuildTargetVRSettings: 295 | - m_BuildTarget: Standalone 296 | m_Enabled: 0 297 | m_Devices: 298 | - Oculus 299 | - OpenVR 300 | m_BuildTargetEnableVuforiaSettings: [] 301 | openGLRequireES31: 0 302 | openGLRequireES31AEP: 0 303 | m_TemplateCustomTags: {} 304 | mobileMTRendering: 305 | Android: 1 306 | iPhone: 1 307 | tvOS: 1 308 | m_BuildTargetGroupLightmapEncodingQuality: [] 309 | m_BuildTargetGroupLightmapSettings: [] 310 | playModeTestRunnerEnabled: 0 311 | runPlayModeTestAsEditModeTest: 0 312 | actionOnDotNetUnhandledException: 1 313 | enableInternalProfiler: 0 314 | logObjCUncaughtExceptions: 1 315 | enableCrashReportAPI: 0 316 | cameraUsageDescription: 317 | locationUsageDescription: 318 | microphoneUsageDescription: 319 | switchNetLibKey: 320 | switchSocketMemoryPoolSize: 6144 321 | switchSocketAllocatorPoolSize: 128 322 | switchSocketConcurrencyLimit: 14 323 | switchScreenResolutionBehavior: 2 324 | switchUseCPUProfiler: 0 325 | switchApplicationID: 0x01004b9000490000 326 | switchNSODependencies: 327 | switchTitleNames_0: 328 | switchTitleNames_1: 329 | switchTitleNames_2: 330 | switchTitleNames_3: 331 | switchTitleNames_4: 332 | switchTitleNames_5: 333 | switchTitleNames_6: 334 | switchTitleNames_7: 335 | switchTitleNames_8: 336 | switchTitleNames_9: 337 | switchTitleNames_10: 338 | switchTitleNames_11: 339 | switchTitleNames_12: 340 | switchTitleNames_13: 341 | switchTitleNames_14: 342 | switchPublisherNames_0: 343 | switchPublisherNames_1: 344 | switchPublisherNames_2: 345 | switchPublisherNames_3: 346 | switchPublisherNames_4: 347 | switchPublisherNames_5: 348 | switchPublisherNames_6: 349 | switchPublisherNames_7: 350 | switchPublisherNames_8: 351 | switchPublisherNames_9: 352 | switchPublisherNames_10: 353 | switchPublisherNames_11: 354 | switchPublisherNames_12: 355 | switchPublisherNames_13: 356 | switchPublisherNames_14: 357 | switchIcons_0: {fileID: 0} 358 | switchIcons_1: {fileID: 0} 359 | switchIcons_2: {fileID: 0} 360 | switchIcons_3: {fileID: 0} 361 | switchIcons_4: {fileID: 0} 362 | switchIcons_5: {fileID: 0} 363 | switchIcons_6: {fileID: 0} 364 | switchIcons_7: {fileID: 0} 365 | switchIcons_8: {fileID: 0} 366 | switchIcons_9: {fileID: 0} 367 | switchIcons_10: {fileID: 0} 368 | switchIcons_11: {fileID: 0} 369 | switchIcons_12: {fileID: 0} 370 | switchIcons_13: {fileID: 0} 371 | switchIcons_14: {fileID: 0} 372 | switchSmallIcons_0: {fileID: 0} 373 | switchSmallIcons_1: {fileID: 0} 374 | switchSmallIcons_2: {fileID: 0} 375 | switchSmallIcons_3: {fileID: 0} 376 | switchSmallIcons_4: {fileID: 0} 377 | switchSmallIcons_5: {fileID: 0} 378 | switchSmallIcons_6: {fileID: 0} 379 | switchSmallIcons_7: {fileID: 0} 380 | switchSmallIcons_8: {fileID: 0} 381 | switchSmallIcons_9: {fileID: 0} 382 | switchSmallIcons_10: {fileID: 0} 383 | switchSmallIcons_11: {fileID: 0} 384 | switchSmallIcons_12: {fileID: 0} 385 | switchSmallIcons_13: {fileID: 0} 386 | switchSmallIcons_14: {fileID: 0} 387 | switchManualHTML: 388 | switchAccessibleURLs: 389 | switchLegalInformation: 390 | switchMainThreadStackSize: 1048576 391 | switchPresenceGroupId: 392 | switchLogoHandling: 0 393 | switchReleaseVersion: 0 394 | switchDisplayVersion: 1.0.0 395 | switchStartupUserAccount: 0 396 | switchTouchScreenUsage: 0 397 | switchSupportedLanguagesMask: 0 398 | switchLogoType: 0 399 | switchApplicationErrorCodeCategory: 400 | switchUserAccountSaveDataSize: 0 401 | switchUserAccountSaveDataJournalSize: 0 402 | switchApplicationAttribute: 0 403 | switchCardSpecSize: -1 404 | switchCardSpecClock: -1 405 | switchRatingsMask: 0 406 | switchRatingsInt_0: 0 407 | switchRatingsInt_1: 0 408 | switchRatingsInt_2: 0 409 | switchRatingsInt_3: 0 410 | switchRatingsInt_4: 0 411 | switchRatingsInt_5: 0 412 | switchRatingsInt_6: 0 413 | switchRatingsInt_7: 0 414 | switchRatingsInt_8: 0 415 | switchRatingsInt_9: 0 416 | switchRatingsInt_10: 0 417 | switchRatingsInt_11: 0 418 | switchLocalCommunicationIds_0: 419 | switchLocalCommunicationIds_1: 420 | switchLocalCommunicationIds_2: 421 | switchLocalCommunicationIds_3: 422 | switchLocalCommunicationIds_4: 423 | switchLocalCommunicationIds_5: 424 | switchLocalCommunicationIds_6: 425 | switchLocalCommunicationIds_7: 426 | switchParentalControl: 0 427 | switchAllowsScreenshot: 1 428 | switchAllowsVideoCapturing: 1 429 | switchAllowsRuntimeAddOnContentInstall: 0 430 | switchDataLossConfirmation: 0 431 | switchUserAccountLockEnabled: 0 432 | switchSystemResourceMemory: 16777216 433 | switchSupportedNpadStyles: 22 434 | switchNativeFsCacheSize: 32 435 | switchIsHoldTypeHorizontal: 0 436 | switchSupportedNpadCount: 8 437 | switchSocketConfigEnabled: 0 438 | switchTcpInitialSendBufferSize: 32 439 | switchTcpInitialReceiveBufferSize: 64 440 | switchTcpAutoSendBufferSizeMax: 256 441 | switchTcpAutoReceiveBufferSizeMax: 256 442 | switchUdpSendBufferSize: 9 443 | switchUdpReceiveBufferSize: 42 444 | switchSocketBufferEfficiency: 4 445 | switchSocketInitializeEnabled: 1 446 | switchNetworkInterfaceManagerInitializeEnabled: 1 447 | switchPlayerConnectionEnabled: 1 448 | ps4NPAgeRating: 12 449 | ps4NPTitleSecret: 450 | ps4NPTrophyPackPath: 451 | ps4ParentalLevel: 11 452 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 453 | ps4Category: 0 454 | ps4MasterVersion: 01.00 455 | ps4AppVersion: 01.00 456 | ps4AppType: 0 457 | ps4ParamSfxPath: 458 | ps4VideoOutPixelFormat: 0 459 | ps4VideoOutInitialWidth: 1920 460 | ps4VideoOutBaseModeInitialWidth: 1920 461 | ps4VideoOutReprojectionRate: 60 462 | ps4PronunciationXMLPath: 463 | ps4PronunciationSIGPath: 464 | ps4BackgroundImagePath: 465 | ps4StartupImagePath: 466 | ps4StartupImagesFolder: 467 | ps4IconImagesFolder: 468 | ps4SaveDataImagePath: 469 | ps4SdkOverride: 470 | ps4BGMPath: 471 | ps4ShareFilePath: 472 | ps4ShareOverlayImagePath: 473 | ps4PrivacyGuardImagePath: 474 | ps4NPtitleDatPath: 475 | ps4RemotePlayKeyAssignment: -1 476 | ps4RemotePlayKeyMappingDir: 477 | ps4PlayTogetherPlayerCount: 0 478 | ps4EnterButtonAssignment: 1 479 | ps4ApplicationParam1: 0 480 | ps4ApplicationParam2: 0 481 | ps4ApplicationParam3: 0 482 | ps4ApplicationParam4: 0 483 | ps4DownloadDataSize: 0 484 | ps4GarlicHeapSize: 2048 485 | ps4ProGarlicHeapSize: 2560 486 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 487 | ps4pnSessions: 1 488 | ps4pnPresence: 1 489 | ps4pnFriends: 1 490 | ps4pnGameCustomData: 1 491 | playerPrefsSupport: 0 492 | enableApplicationExit: 0 493 | resetTempFolder: 1 494 | restrictedAudioUsageRights: 0 495 | ps4UseResolutionFallback: 0 496 | ps4ReprojectionSupport: 0 497 | ps4UseAudio3dBackend: 0 498 | ps4SocialScreenEnabled: 0 499 | ps4ScriptOptimizationLevel: 0 500 | ps4Audio3dVirtualSpeakerCount: 14 501 | ps4attribCpuUsage: 0 502 | ps4PatchPkgPath: 503 | ps4PatchLatestPkgPath: 504 | ps4PatchChangeinfoPath: 505 | ps4PatchDayOne: 0 506 | ps4attribUserManagement: 0 507 | ps4attribMoveSupport: 0 508 | ps4attrib3DSupport: 0 509 | ps4attribShareSupport: 0 510 | ps4attribExclusiveVR: 0 511 | ps4disableAutoHideSplash: 0 512 | ps4videoRecordingFeaturesUsed: 0 513 | ps4contentSearchFeaturesUsed: 0 514 | ps4attribEyeToEyeDistanceSettingVR: 0 515 | ps4IncludedModules: [] 516 | monoEnv: 517 | splashScreenBackgroundSourceLandscape: {fileID: 0} 518 | splashScreenBackgroundSourcePortrait: {fileID: 0} 519 | spritePackerPolicy: 520 | webGLMemorySize: 16 521 | webGLExceptionSupport: 1 522 | webGLNameFilesAsHashes: 0 523 | webGLDataCaching: 1 524 | webGLDebugSymbols: 0 525 | webGLEmscriptenArgs: 526 | webGLModulesDirectory: 527 | webGLTemplate: APPLICATION:Default 528 | webGLAnalyzeBuildSize: 0 529 | webGLUseEmbeddedResources: 0 530 | webGLCompressionFormat: 1 531 | webGLLinkerTarget: 1 532 | webGLThreadsSupport: 0 533 | scriptingDefineSymbols: {} 534 | platformArchitecture: {} 535 | scriptingBackend: {} 536 | il2cppCompilerConfiguration: {} 537 | managedStrippingLevel: {} 538 | incrementalIl2cppBuild: {} 539 | allowUnsafeCode: 0 540 | additionalIl2CppArgs: 541 | scriptingRuntimeVersion: 1 542 | apiCompatibilityLevelPerPlatform: {} 543 | m_RenderingPath: 1 544 | m_MobileRenderingPath: 1 545 | metroPackageName: Template_3D 546 | metroPackageVersion: 547 | metroCertificatePath: 548 | metroCertificatePassword: 549 | metroCertificateSubject: 550 | metroCertificateIssuer: 551 | metroCertificateNotAfter: 0000000000000000 552 | metroApplicationDescription: Template_3D 553 | wsaImages: {} 554 | metroTileShortName: 555 | metroTileShowName: 0 556 | metroMediumTileShowName: 0 557 | metroLargeTileShowName: 0 558 | metroWideTileShowName: 0 559 | metroSupportStreamingInstall: 0 560 | metroLastRequiredScene: 0 561 | metroDefaultTileSize: 1 562 | metroTileForegroundText: 2 563 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 564 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 565 | a: 1} 566 | metroSplashScreenUseBackgroundColor: 0 567 | platformCapabilities: {} 568 | metroTargetDeviceFamilies: {} 569 | metroFTAName: 570 | metroFTAFileTypes: [] 571 | metroProtocolName: 572 | metroCompilationOverrides: 1 573 | XboxOneProductId: 574 | XboxOneUpdateKey: 575 | XboxOneSandboxId: 576 | XboxOneContentId: 577 | XboxOneTitleId: 578 | XboxOneSCId: 579 | XboxOneGameOsOverridePath: 580 | XboxOnePackagingOverridePath: 581 | XboxOneAppManifestOverridePath: 582 | XboxOneVersion: 1.0.0.0 583 | XboxOnePackageEncryption: 0 584 | XboxOnePackageUpdateGranularity: 2 585 | XboxOneDescription: 586 | XboxOneLanguage: 587 | - enus 588 | XboxOneCapability: [] 589 | XboxOneGameRating: {} 590 | XboxOneIsContentPackage: 0 591 | XboxOneEnableGPUVariability: 1 592 | XboxOneSockets: {} 593 | XboxOneSplashScreen: {fileID: 0} 594 | XboxOneAllowedProductIds: [] 595 | XboxOnePersistentLocalStorageSize: 0 596 | XboxOneXTitleMemory: 8 597 | xboxOneScriptCompiler: 1 598 | XboxOneOverrideIdentityName: 599 | vrEditorSettings: 600 | daydream: 601 | daydreamIconForeground: {fileID: 0} 602 | daydreamIconBackground: {fileID: 0} 603 | cloudServicesEnabled: 604 | UNet: 1 605 | luminIcon: 606 | m_Name: 607 | m_ModelFolderPath: 608 | m_PortalFolderPath: 609 | luminCert: 610 | m_CertPath: 611 | m_PrivateKeyPath: 612 | luminIsChannelApp: 0 613 | luminVersion: 614 | m_VersionCode: 1 615 | m_VersionName: 616 | facebookSdkVersion: 7.9.4 617 | facebookAppId: 618 | facebookCookies: 1 619 | facebookLogging: 1 620 | facebookStatus: 1 621 | facebookXfbml: 0 622 | facebookFrictionlessRequests: 1 623 | apiCompatibilityLevel: 6 624 | cloudProjectId: 625 | framebufferDepthMemorylessMode: 0 626 | projectName: 627 | organizationId: 628 | cloudEnabled: 0 629 | enableNativePlatformBackendsForNewInputSystem: 0 630 | disableOldInputManagerSupport: 0 631 | legacyClampBlendShapeWeights: 0 632 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2018.4.11f1 2 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | excludedTargetPlatforms: [] 44 | - serializedVersion: 2 45 | name: Low 46 | pixelLightCount: 0 47 | shadows: 0 48 | shadowResolution: 0 49 | shadowProjection: 1 50 | shadowCascades: 1 51 | shadowDistance: 20 52 | shadowNearPlaneOffset: 3 53 | shadowCascade2Split: 0.33333334 54 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 55 | shadowmaskMode: 0 56 | blendWeights: 2 57 | textureQuality: 0 58 | anisotropicTextures: 0 59 | antiAliasing: 0 60 | softParticles: 0 61 | softVegetation: 0 62 | realtimeReflectionProbes: 0 63 | billboardsFaceCameraPosition: 0 64 | vSyncCount: 0 65 | lodBias: 0.4 66 | maximumLODLevel: 0 67 | streamingMipmapsActive: 0 68 | streamingMipmapsAddAllCameras: 1 69 | streamingMipmapsMemoryBudget: 512 70 | streamingMipmapsRenderersPerFrame: 512 71 | streamingMipmapsMaxLevelReduction: 2 72 | streamingMipmapsMaxFileIORequests: 1024 73 | particleRaycastBudget: 16 74 | asyncUploadTimeSlice: 2 75 | asyncUploadBufferSize: 16 76 | asyncUploadPersistentBuffer: 1 77 | resolutionScalingFixedDPIFactor: 1 78 | excludedTargetPlatforms: [] 79 | - serializedVersion: 2 80 | name: Medium 81 | pixelLightCount: 1 82 | shadows: 1 83 | shadowResolution: 0 84 | shadowProjection: 1 85 | shadowCascades: 1 86 | shadowDistance: 20 87 | shadowNearPlaneOffset: 3 88 | shadowCascade2Split: 0.33333334 89 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 90 | shadowmaskMode: 0 91 | blendWeights: 2 92 | textureQuality: 0 93 | anisotropicTextures: 1 94 | antiAliasing: 0 95 | softParticles: 0 96 | softVegetation: 0 97 | realtimeReflectionProbes: 0 98 | billboardsFaceCameraPosition: 0 99 | vSyncCount: 1 100 | lodBias: 0.7 101 | maximumLODLevel: 0 102 | streamingMipmapsActive: 0 103 | streamingMipmapsAddAllCameras: 1 104 | streamingMipmapsMemoryBudget: 512 105 | streamingMipmapsRenderersPerFrame: 512 106 | streamingMipmapsMaxLevelReduction: 2 107 | streamingMipmapsMaxFileIORequests: 1024 108 | particleRaycastBudget: 64 109 | asyncUploadTimeSlice: 2 110 | asyncUploadBufferSize: 16 111 | asyncUploadPersistentBuffer: 1 112 | resolutionScalingFixedDPIFactor: 1 113 | excludedTargetPlatforms: [] 114 | - serializedVersion: 2 115 | name: High 116 | pixelLightCount: 2 117 | shadows: 2 118 | shadowResolution: 1 119 | shadowProjection: 1 120 | shadowCascades: 2 121 | shadowDistance: 40 122 | shadowNearPlaneOffset: 3 123 | shadowCascade2Split: 0.33333334 124 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 125 | shadowmaskMode: 1 126 | blendWeights: 2 127 | textureQuality: 0 128 | anisotropicTextures: 1 129 | antiAliasing: 0 130 | softParticles: 0 131 | softVegetation: 1 132 | realtimeReflectionProbes: 1 133 | billboardsFaceCameraPosition: 1 134 | vSyncCount: 1 135 | lodBias: 1 136 | maximumLODLevel: 0 137 | streamingMipmapsActive: 0 138 | streamingMipmapsAddAllCameras: 1 139 | streamingMipmapsMemoryBudget: 512 140 | streamingMipmapsRenderersPerFrame: 512 141 | streamingMipmapsMaxLevelReduction: 2 142 | streamingMipmapsMaxFileIORequests: 1024 143 | particleRaycastBudget: 256 144 | asyncUploadTimeSlice: 2 145 | asyncUploadBufferSize: 16 146 | asyncUploadPersistentBuffer: 1 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Very High 151 | pixelLightCount: 3 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 2 156 | shadowDistance: 70 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 2 164 | antiAliasing: 2 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 1.5 171 | maximumLODLevel: 0 172 | streamingMipmapsActive: 0 173 | streamingMipmapsAddAllCameras: 1 174 | streamingMipmapsMemoryBudget: 512 175 | streamingMipmapsRenderersPerFrame: 512 176 | streamingMipmapsMaxLevelReduction: 2 177 | streamingMipmapsMaxFileIORequests: 1024 178 | particleRaycastBudget: 1024 179 | asyncUploadTimeSlice: 2 180 | asyncUploadBufferSize: 16 181 | asyncUploadPersistentBuffer: 1 182 | resolutionScalingFixedDPIFactor: 1 183 | excludedTargetPlatforms: [] 184 | - serializedVersion: 2 185 | name: Ultra 186 | pixelLightCount: 4 187 | shadows: 2 188 | shadowResolution: 2 189 | shadowProjection: 1 190 | shadowCascades: 4 191 | shadowDistance: 150 192 | shadowNearPlaneOffset: 3 193 | shadowCascade2Split: 0.33333334 194 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 195 | shadowmaskMode: 1 196 | blendWeights: 4 197 | textureQuality: 0 198 | anisotropicTextures: 2 199 | antiAliasing: 2 200 | softParticles: 1 201 | softVegetation: 1 202 | realtimeReflectionProbes: 1 203 | billboardsFaceCameraPosition: 1 204 | vSyncCount: 1 205 | lodBias: 2 206 | maximumLODLevel: 0 207 | streamingMipmapsActive: 0 208 | streamingMipmapsAddAllCameras: 1 209 | streamingMipmapsMemoryBudget: 512 210 | streamingMipmapsRenderersPerFrame: 512 211 | streamingMipmapsMaxLevelReduction: 2 212 | streamingMipmapsMaxFileIORequests: 1024 213 | particleRaycastBudget: 4096 214 | asyncUploadTimeSlice: 2 215 | asyncUploadBufferSize: 16 216 | asyncUploadPersistentBuffer: 1 217 | resolutionScalingFixedDPIFactor: 1 218 | excludedTargetPlatforms: [] 219 | m_PerPlatformDefaultQuality: 220 | Android: 2 221 | Lumin: 5 222 | Nintendo 3DS: 5 223 | Nintendo Switch: 5 224 | PS4: 5 225 | PSP2: 2 226 | Standalone: 5 227 | WebGL: 3 228 | Windows Store Apps: 5 229 | XboxOne: 5 230 | iPhone: 2 231 | tvOS: 2 232 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_TestInitMode: 0 13 | CrashReportingSettings: 14 | m_EventUrl: https://perf-events.cloud.unity3d.com 15 | m_Enabled: 0 16 | m_LogBufferSize: 10 17 | m_CaptureEditorExceptions: 1 18 | UnityPurchasingSettings: 19 | m_Enabled: 0 20 | m_TestMode: 0 21 | UnityAnalyticsSettings: 22 | m_Enabled: 0 23 | m_TestMode: 0 24 | m_InitializeOnStartup: 1 25 | UnityAdsSettings: 26 | m_Enabled: 0 27 | m_InitializeOnStartup: 1 28 | m_TestMode: 0 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_RenderPipeSettingsPath: 10 | m_FixedTimeStep: 0.016666668 11 | m_MaxDeltaTime: 0.05 12 | -------------------------------------------------------------------------------- /Decoupling/ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /Decoupling/README-zh-TW.md: -------------------------------------------------------------------------------- 1 | # 為何拆解耦合(decoupling) 2 | 3 | 需求會改變、專案會成長、軟體會演化。 4 | 5 | ## 問題 6 | 7 | 在系統的各模組間有高度耦合的狀況代表: 8 | - 難以把每個組件的內容隔離開來描述 9 | - 組件難以單獨進行測試 10 | - 難以重複利用組件 11 | 12 | 以上種種都會讓我們難以看懂、維護並發展每個組件,以及整體的系統。 13 | 14 | ![打結的毛線球](https://cdn.pixabay.com/photo/2016/06/28/10/49/thread-1484387_640.jpg "能解得開算你厲害。") 15 | 16 | ## 解方 17 | 18 | 我們必須讓組件盡量 [模組化](https://en.wikipedia.org/wiki/Modular_programming) 才能利於分別描述、測試與重複利用。模組化的組件能夠更容易的被修改或替換,讓我們的系統更具彈性,得以適應各種不同的需求修改。我們可以透過拆解耦合的相依組件,並定義最少介面的手段來達到模組化的目的。 19 | 20 | ![樂高磚塊](https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Lego_bricks.jpg/640px-Lego_bricks.jpg "以樂高為榜樣吧,朋友。") 21 | 22 | ## 範例 23 | 24 | 舉例來說,假設我們要開發一款類似 [《暗黑破壞神》](https://en.wikipedia.org/wiki/Diablo_(video_game)) 的遊戲,在其中我們有一個玩家角色,還有一個顯示玩家現有血量跟法力的介面。我們要怎麼把血條顯示跟玩家的血量值做聯結?這兩個組件分別附著在完全不同的遊戲物件上! 25 | 26 | ### Singleton 模式 27 | 28 | 我們很快發現到,整個遊戲裡只有一個玩家角色,也只有一個介面。那不就正好能用上 [Singleton 模式](https://en.wikipedia.org/wiki/Singleton_pattern) 來存取其他組件了嗎?[太巧妙了!](https://youtu.be/wv4eTE0aUiQ) 29 | 30 | ```csharp 31 | public sealed class Player : MonoBehaviour 32 | { 33 | public static Player main { get; private set; } 34 | 35 | public float maxHealth; 36 | public float health; 37 | 38 | void Start() 39 | { 40 | main = this; 41 | } 42 | 43 | // ... 44 | } 45 | ``` 46 | 47 | ```csharp 48 | public sealed class HealthBar : MonoBehaviour 49 | { 50 | [SerializeField] private Slider slider; 51 | 52 | void Update() 53 | { 54 | var player = Player.main; 55 | slider.maxValue = player.maxHealth; 56 | slider.value = player.health; 57 | } 58 | } 59 | ``` 60 | 61 | ![血條](./Documentation/HealthBar.png "聰明!") 62 | 63 | 搞定。太輕鬆了。開始著手 [下個任務](https://www.reddit.com/r/restofthefuckingowl/) 吧。沒過多久,我們就寫好了物品欄、裝備、道具、寶石、鑲嵌凹槽、技能樹、角色數值、法術書、Buff,還有敵人系統到遊戲中。這些組件都需要互相溝通。那就加入更多 singleton 吧,易如反掌! 64 | 65 | ![組件相依圖](./Documentation/Dependencies.png "可以上架了!") 66 | 67 | 好等等,看起來沒那麼簡單了。就在這時,我們的遊戲企劃突然想到,如果能有個新法術,可以讓身上所有裝備的屬性加值效果加倍就太好了。哦,還有,順便增加個玩家必須每 20 秒殺死敵人才能維持的狂暴 buff。每當新增一個 singleton,程式設計師的心就酸了一下。如果再收到一個新的錯誤回報,說「為什麼在雙重 buff 時限結束後角色數值沒有正確重置啊!」的話,大家可能就會覺得乾脆辭職去賣雞排還比較快活吧。 68 | 69 | 還是別這樣做吧。如果我告訴你有個方法,讓每個組件都可以被隔離、模組化,而且還能和其他組件共享資訊呢?這就必須討論 [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection) 了! 70 | 71 | ### Dependency injection(常譯「相依性注入」) 72 | 73 | 讓我們來仔細看看 [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection)、[separation of concerns (SoC,常譯「關注點分離」)](https://en.wikipedia.org/wiki/Separation_of_concerns),與 [inversion of control (IoC,常譯「控制反轉」)](https://en.wikipedia.org/wiki/Inversion_of_control) ,這些看起來都好像很高深、很複雜,然後可能還要下載額外的框架才能使用,還是得轉換到一個全新語言去比較快...(是嗎?) 74 | 75 | 此處關鍵是意識到,其實 [Unity 裡的 Inspector](https://docs.unity3d.com/Manual/UsingTheInspector.html) *就是*一個 dependency injector(注入器)。事實上,我們已經使用了這個功能來注入相依組件。在 [前面範例](#singleton-模式) 的 `HealthBar` 當中對介面組件 `Slider` 的參考*就是*我們透過 Unity Inspector 來*注入*的相依性了。就跟指定一個欄位一樣簡單。很誇張嗎?但其實這差不多就是關於 dependency injection 你需要知道的全部了。 76 | 77 | ```csharp 78 | public sealed class Player : MonoBehaviour 79 | { 80 | public float maxHealth; 81 | public float health; 82 | 83 | // 娘子快來看,沒有 singleton! 84 | // ... 85 | } 86 | ``` 87 | 88 | ```csharp 89 | public sealed class HealthBar : MonoBehaviour 90 | { 91 | [SerializeField] private Slider slider; 92 | [SerializeField] private Player player; 93 | 94 | void Update() 95 | { 96 | slider.maxValue = player.maxHealth; 97 | slider.value = player.health; 98 | } 99 | } 100 | ``` 101 | 102 | ![血條第二版](./Documentation/HealthBar2.png "但我們真的有得到什麼好處嗎?") 103 | 104 | 好,所以我們把 singleton 模式換掉,改成使用注入的玩家組件參考,歡呼吧!不過...,我們到底從中獲得什麼好處了嗎?重新再來看一下我們原本遭遇的問題吧: 105 | 106 | - [x] 把每個組件的內容隔離開來描述 107 | - [ ] 組件可以單獨進行測試 108 | - [ ] 重複利用組件 109 | 110 | 其實真的還沒有多大改變。我們大概能在不去看 `Player` 定義的情況下,來猜測 `HealthBar` 到底在做什麼,但是我們還是無法開一個空場景,在不把 `Player` 也拉進來場景中的情況下去單獨測試它。我們也無法重複利用 `HealthBar` 的程式碼在 `ManaBar` 或其他類似的顯示上。我們得複製貼上一份相同的程式碼,然後把每個 `health` 字眼都替換成 `mana`。真令人失望。 111 | 112 | 之後,我們可能也會想進一步清理遊戲架構,把介面組件移到屬於它自己的場景裡並壓在遊戲場景上。但這樣我們的參考就爛了。這下我們得怎麼讓 `HealthBar` 得知 `Player` 呢?它們根本在不同場景中啊!於是乎,看起來 dependency injection 也不怎麼管用嘛,跟那些只有在理論上聽起來有用的想法沒兩樣。 113 | 114 | 修蛋幾勒! 115 | 116 | ### ScriptableObjects 117 | 118 | 今天要講的第二個關鍵是,我們可以不單純只注入指向其他組件的參考,也可以注入對 `ScriptableObject` 的參考。這是拿來 [存放資料,*且獨立於類別實體*的容器](https://docs.unity3d.com/Manual/class-ScriptableObject.html) 。難道說我們可以用它來存放玩家的血量值,而不用放在 `Player` 組件裡面嗎?答對了!現在馬上就來試試吧。 119 | 120 | ```csharp 121 | [CreateAssetMenu] 122 | public sealed class BoundedFloat : ScriptableObject 123 | { 124 | public float maxValue; 125 | public float value; 126 | } 127 | ``` 128 | 129 | ```csharp 130 | public sealed class StatusBar : MonoBehaviour 131 | { 132 | [SerializeField] private Slider slider; 133 | [SerializeField] private BoundedFloat data; 134 | 135 | void Update() 136 | { 137 | slider.maxValue = data.maxValue; 138 | slider.value = data.value; 139 | } 140 | } 141 | ``` 142 | 143 | ```csharp 144 | public sealed class Player : MonoBehaviour 145 | { 146 | [Header("Stats")] 147 | [SerializeField] private BoundedFloat health; 148 | [SerializeField] private BoundedFloat mana; 149 | 150 | // ... 151 | } 152 | ``` 153 | 154 | ![ScriptableObjects](./Documentation/ScriptableObjects.png "你可以同時開啟多個 Inspector 視窗。") 155 | 156 | 我們把所有 *資料* 都移到 *資料容器* 裡面,並在組件裡面去參考它們。`ScriptableObject` 存在於 Unity 的資源(asset)清單中,而且可以從任何 prefab、物件及場景中參考它們。我們也同時可以整合針對血條與法力條的程式碼,因為這兩個東西都同樣只關心一個最大值跟一個現在值。在我們的所有介面組件中,再也沒有指向 `Player` 的參考了,反之亦同。介面與玩家組件都只參考了 *資料*。它們甚至不需要去管是不是同一份資料。 157 | 158 | ![拆解耦合](./Documentation/Decoupling.png) 159 | 160 | 這樣終於完成了嗎?讓我們再回顧一次問題點: 161 | 162 | - [x] 把每個組件的內容隔離開來描述 163 | - [x] 組件可以單獨進行測試 164 | - [x] 重複利用組件 165 | 166 | 閱讀程式碼時,我們可以理解 `Player` 的行為,但不需要去管介面的 `StatusBar`,反之亦同。兩者之間不再存有相依性。我們可以把 `Player` 丟進一個空場景中,隨便指定一些 [測試用的血量與法力值](https://en.wikipedia.org/wiki/Mock_object) 就能執行場景,毫無問題。基礎型別資料(Plain Old Data, POD)非常容易複製。 167 | 168 | 我們也可以把介面丟到一個空場景中,同樣任意指定一些測試數值,就執行場景。我們甚至可以利用變動測試數值,看看血條跟法力條實際動起來的感覺。這下介面設計師可以瘋狂美化他們想要做到的視覺效果,而且根本不用執行實際完整的遊戲了。介面的設計迭代從來沒這麼方便過! 169 | 170 | 我們還沒開始實作任何其他的遊戲組件,就已經開始在重複利用程式碼了。針對兩個數值條,我們只須使用一份程式,而且這個 `BoundedFloat` 大概之後在很多類似數值需求的場合有機會派上用場。 171 | 172 | ## 重構(Refactoring) 173 | 174 | Dependency injection 175 | 最美好的一個地方是,我們也可以把它用於既有專案上,並不需要從頭開始重寫。我們可以亦步亦趨把每個組件慢慢切出來,並將相依資料移到 176 | `ScriptableObject` 裡面,讓組件之間的直接聯結變成對資料的參考。一旦把一個組件完全解除耦合之後,我們就能輕易地單獨針對它做測試跟重構。 177 | 178 | ## 延伸閱讀 179 | 180 | - [Unite Austin 2017 - Game Architecture with Scriptable Objects](https://youtu.be/raQ3iHhE_Kk) by [@roboryantron](https://github.com/roboryantron) 181 | - [Unite 2016 - Overthrowing the MonoBehaviour Tyranny in a Glorious Scriptable Object Revolution](https://youtu.be/6vmRwLYWNRo) by [@richard-fine](https://github.com/richard-fine) 182 | -------------------------------------------------------------------------------- /Decoupling/README.md: -------------------------------------------------------------------------------- 1 | # Decoupling 2 | 3 | Requirements change. Projects grow. Software evolves. 4 | 5 | ## Problem 6 | 7 | Tight coupling between modules of a system means that it's: 8 | - difficult to reason about individual components in isolation. 9 | - difficult to test individual components in isolation. 10 | - difficult to reuse individual components. 11 | 12 | All of which make it difficult to understand, maintain, and evolve both individual components and the system as a whole. 13 | 14 | ![Tangled strings](https://cdn.pixabay.com/photo/2016/06/28/10/49/thread-1484387_640.jpg "Good luck figuring it out.") 15 | 16 | ## Solution 17 | 18 | We want our components to be [modular](https://en.wikipedia.org/wiki/Modular_programming) in order to be able to reason about, test, and reuse each of them individually. Modular components are easier to change or to replace, allowing our system to stay flexible and able to adapt to changing requirements. We achieve modularization by decoupling dependencies and defining minimal interfaces. 19 | 20 | ![Lego bricks](https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Lego_bricks.jpg/640px-Lego_bricks.jpg "Be LEGO, my friend.") 21 | 22 | ## Example 23 | 24 | Suppose we're making a game like [Diablo](https://en.wikipedia.org/wiki/Diablo_(video_game)) where we have a player character and a UI showing the player's current health and mana. How do we connect the health bar to the player's health value? The two components are on totally different game objects! 25 | 26 | ### Singletons 27 | 28 | We realize there can only be one player character and one UI in our game. That means we can apply the [singleton pattern](https://en.wikipedia.org/wiki/Singleton_pattern) to access the other component. [So smart!](https://youtu.be/wv4eTE0aUiQ) 29 | 30 | ```csharp 31 | public sealed class Player : MonoBehaviour 32 | { 33 | public static Player main { get; private set; } 34 | 35 | public float maxHealth; 36 | public float health; 37 | 38 | void Start() 39 | { 40 | main = this; 41 | } 42 | 43 | // ... 44 | } 45 | ``` 46 | 47 | ```csharp 48 | public sealed class HealthBar : MonoBehaviour 49 | { 50 | [SerializeField] private Slider slider; 51 | 52 | void Update() 53 | { 54 | var player = Player.main; 55 | slider.maxValue = player.maxHealth; 56 | slider.value = player.health; 57 | } 58 | } 59 | ``` 60 | 61 | ![Health bar](./Documentation/HealthBar.png "Brilliant!") 62 | 63 | Done. So easy. Let's move on to the [next task](https://www.reddit.com/r/restofthefuckingowl/). Soon enough we will have added inventory, equipment, items, gems, sockets, talent tree, character stats, spell book, buffs, and enemies to the game, and they all have to talk to each other. So we introduce more singletons. Piece of cake! 64 | 65 | ![Dependency graph](./Documentation/Dependencies.png "Ship it!") 66 | 67 | Okay, perhaps not so easy anymore. It is then, that our game designer comes up with this new spell which doubles the character attribute effects of each equipped piece of armor. Oh, and also this new berserk buff which times out within 20 seconds unless the player keeps killing enemies. We cry a little on the inside and add more singletons. By the time we receive yet another bug report about character stats not resetting properly once a combination of buff times out we're ready to quit our job to become baristas instead. 68 | 69 | How about let's not do that. What if I told you, each component can be isolated, modular, and still share information with other components? Enter [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection)! 70 | 71 | ### Dependency injection 72 | 73 | So we start reading about [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection), [separation of concerns](https://en.wikipedia.org/wiki/Separation_of_concerns), and [inversion of control](https://en.wikipedia.org/wiki/Inversion_of_control), and it's a lot of fancy talk and it seems really complicated and we have to download extra frameworks to make it work or switch to a new language entirely (hah, hah, *sigh*). 74 | 75 | The key insight here is to realize that the [inspector in Unity](https://docs.unity3d.com/Manual/UsingTheInspector.html) *is* a dependency injector. In fact, we've already been using it to inject dependencies. In the [example above](#singletons) the `HealthBar` component's reference to the UI `Slider` *is* a dependency that we *injected* using the inspector. It's as simple as assigning a field. Crazy, right? But that's all there is to dependency injection, really. 76 | 77 | ```csharp 78 | public sealed class Player : MonoBehaviour 79 | { 80 | public float maxHealth; 81 | public float health; 82 | 83 | // Look ma, no singleton! 84 | // ... 85 | } 86 | ``` 87 | 88 | ```csharp 89 | public sealed class HealthBar : MonoBehaviour 90 | { 91 | [SerializeField] private Slider slider; 92 | [SerializeField] private Player player; 93 | 94 | void Update() 95 | { 96 | slider.maxValue = player.maxHealth; 97 | slider.value = player.health; 98 | } 99 | } 100 | ``` 101 | 102 | ![Health bar version 2](./Documentation/HealthBar2.png "Did we gain anything though?") 103 | 104 | Okay, so we replaced the singleton with an injected reference to the player component. Great. High fives all around! Except... did we really gain anything? Let's evaluate against our problem definition. 105 | 106 | - [x] Reason about individual components in isolation 107 | - [ ] Test individual components in isolation 108 | - [ ] Reuse individual components 109 | 110 | Not much improvement, really. We can kind of guess what `HealthBar` does without looking at `Player`, but we still can't test it in an empty scene without also putting a `Player` into the scene. We also can't reuse `HealthBar`'s code for `ManaBar` or anything. We'll have to duplicate the code and replace every `health` with `mana` to make it work. Disappointing. 111 | 112 | Later on, we want to clean things up a bit by moving our UI into its own scene which gets loaded additively. That breaks our reference. How do we even connect the `HealthBar` to the `Player` now? They are in different scenes! By now, we're fed up with dependency injection and ready to throw it on the pile of useless ideas that only sound good in theory. 113 | 114 | Not so fast! 115 | 116 | ### ScriptableObjects 117 | 118 | Today's second insight is, that we can inject not only references to other components, but also to `ScriptableObject`s, which are [data containers we can use to store data, *independent of class instances*](https://docs.unity3d.com/Manual/class-ScriptableObject.html). Does that mean we can store the player's health independent of the `Player` component? It does! Does that mean we can reference the player's health independent of the `Player` component? Yes, it does! Let's take it for a spin. 119 | 120 | ```csharp 121 | [CreateAssetMenu] 122 | public sealed class BoundedFloat : ScriptableObject 123 | { 124 | public float maxValue; 125 | public float value; 126 | } 127 | ``` 128 | 129 | ```csharp 130 | public sealed class StatusBar : MonoBehaviour 131 | { 132 | [SerializeField] private Slider slider; 133 | [SerializeField] private BoundedFloat data; 134 | 135 | void Update() 136 | { 137 | slider.maxValue = data.maxValue; 138 | slider.value = data.value; 139 | } 140 | } 141 | ``` 142 | 143 | ```csharp 144 | public sealed class Player : MonoBehaviour 145 | { 146 | [Header("Stats")] 147 | [SerializeField] private BoundedFloat health; 148 | [SerializeField] private BoundedFloat mana; 149 | 150 | // ... 151 | } 152 | ``` 153 | 154 | ![ScriptableObjects](./Documentation/ScriptableObjects.png "Yes, you can open multiple inspector windows.") 155 | 156 | We move all the *data* into *data containers* and reference them from our components. `ScriptableObject`s live in the assets folder and can be referenced from any prefab, any instance, in any scene. We also unify the code for our health bar and our mana bar, because all they really care about is a maximum value and a value. Nothing in UI references our `Player` anymore and vice versa. Both just reference *data*. They don't even care whether it's the same data. 157 | 158 | ![Decoupling](./Documentation/Decoupling.png) 159 | 160 | Are we there yet? Let's evaluate again against our problem definition. 161 | 162 | - [x] Reason about individual components in isolation 163 | - [x] Test individual components in isolation 164 | - [x] Reuse individual components 165 | 166 | Reading the code, we can understand what the `Player` does without reading what the UI's `StatusBar`s are and vice versa. There is no dependency between them. We can throw the `Player` into an empty scene, hook it up to some [fake health and mana data](https://en.wikipedia.org/wiki/Mock_object), and run that. No problem. Plain old data is easy to clone. 167 | 168 | We can also throw the UI into an empty scene, hook it up to some fake data, and run that. We can even animate the values of our fake data and see how the health and mana bars change. Our UI designer can go nuts prettying it up without ever having to run the actual game. Iterating on UI design has never been faster! 169 | 170 | We haven't even started implementing all the other components for our game, but we're already reusing code. We only need one script for both status bars and we have a feeling that our `BoundedFloat` will come in handy for lots of other stats and attributes in the future. 171 | 172 | ## Refactoring 173 | 174 | One beautiful thing about dependency injection is that we can apply it to existing projects as well. We don't have to start over. We can gradually carve out individual components by moving dependent data into `ScriptableObject`s and replacing direct references between components with references to data, step by step. Once we have completely decoupled one component, we can test and refactor it easily in isolation. 175 | 176 | ## Further reading 177 | 178 | - [Unite Austin 2017 - Game Architecture with Scriptable Objects](https://youtu.be/raQ3iHhE_Kk) by [@roboryantron](https://github.com/roboryantron) 179 | - [Unite 2016 - Overthrowing the MonoBehaviour Tyranny in a Glorious Scriptable Object Revolution](https://youtu.be/6vmRwLYWNRo) by [@richard-fine](https://github.com/richard-fine) 180 | 181 | ## Translations 182 | 183 | - [台灣繁體中文 (zh-TW)](README-zh-TW.md) 184 | 185 | If you find this workshop useful and speak another language, I'd very much appreciate any help translating the chapters. Clone the repository, add a localized copy of the README.md, for example README-pt-BR.md, and send me a pull request. 186 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Jonas Boetel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README-zh-TW.md: -------------------------------------------------------------------------------- 1 | # 健全碼農工作坊 2 | 3 | ## 簡介 4 | 5 | 這個遊戲開發技術工作坊的主要目的是希望幫助程式設計師自我學習、成長,並及早培養好習慣。這份問卷的目的,是為了想辦法走出每天問「為什麼這爛掉了!?」的日常,並透過較長期的培養與學習,致力於降低這種鳥事發生的*頻率*。 6 | 7 | 本工作坊由 [Jonas Bötel](https://twitter.com/codelumpn) 發起,並由 [IGDShare 的 Johnson Lin](https://twitter.com/igdshare) 協助中文翻譯。 8 | 9 | ## 章節 10 | 1. [拆解耦合](/Decoupling/README-zh-TW.md) 11 | 12 | ## 翻譯 13 | 14 | 如果你覺得這個工作坊有其價值,並通曉另一個語言,我們非常歡迎任何幫助工作坊內容進行翻譯的協助。把 repository clone 下來後,增加一份特定語言在地化的 README.md,例如 README-pt-BR.md,並送 PR 給我們。 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Healthy Code Workshop 2 | 3 | ## Introduction 4 | 5 | The goal of this game development tech workshop is to help programmers learn, grow, and form good habits. We're here to look beyond the daily issues of "Why is this not working?!" and instead focus on reducing the *frequency* of those "Why?!" moments through long term education and growth. 6 | 7 | The organizers of the workshop are [Jonas Bötel](https://twitter.com/codelumpn) and [Johnson Lin](https://twitter.com/igdshare). The workshop will be held in both English and Traditional Chinese simultaneously. 8 | 9 | ## Chapters 10 | 1. [Decoupling](/Decoupling/) 11 | 12 | ## Translations 13 | 14 | - [台灣繁體中文 (zh-TW)](README-zh-TW.md) 15 | 16 | If you find this workshop useful and speak another language, I'd very much appreciate any help translating the chapters. Clone the repository, add a localized copy of the README.md, for example README-pt-BR.md, and send me a pull request. 17 | -------------------------------------------------------------------------------- /StateMachines/Readme.MD: -------------------------------------------------------------------------------- 1 | # State Machines 2 | - Animator instead of state machine 3 | - Timeline 4 | - Visualization 5 | 6 | --------------------------------------------------------------------------------