├── .gitignore ├── Assets ├── Example.meta ├── Example │ ├── Prefabs.meta │ ├── Prefabs │ │ ├── item_grid.prefab │ │ ├── item_grid.prefab.meta │ │ ├── item_horizontal.prefab │ │ ├── item_horizontal.prefab.meta │ │ ├── item_vertical.prefab │ │ └── item_vertical.prefab.meta │ ├── Scenes.meta │ ├── Scenes │ │ ├── ExampleScene.unity │ │ └── ExampleScene.unity.meta │ ├── Scripts.meta │ └── Scripts │ │ ├── TestCell.cs │ │ ├── TestCell.cs.meta │ │ ├── TestLayout.cs │ │ └── TestLayout.cs.meta ├── Scripts.meta ├── Scripts │ ├── Base.meta │ ├── Base │ │ ├── BaseCell.cs │ │ ├── BaseCell.cs.meta │ │ ├── BaseLoopModel.cs │ │ ├── BaseLoopModel.cs.meta │ │ ├── ILoopLayout.cs │ │ └── ILoopLayout.cs.meta │ ├── Consts.meta │ ├── Consts │ │ ├── CellEnum.cs │ │ └── CellEnum.cs.meta │ ├── LayoutGroup.meta │ ├── LayoutGroup │ │ ├── HorizontalLoopLayoutGroup.cs │ │ ├── HorizontalLoopLayoutGroup.cs.meta │ │ ├── LoopGridLayout.cs │ │ ├── LoopGridLayout.cs.meta │ │ ├── LoopHorizontalOrVerticalLayout.cs │ │ ├── LoopHorizontalOrVerticalLayout.cs.meta │ │ ├── ScrollRectLoop.cs │ │ ├── ScrollRectLoop.cs.meta │ │ ├── VerticalLoopLayoutGroup.cs │ │ └── VerticalLoopLayoutGroup.cs.meta │ ├── Tool.meta │ └── Tool │ │ ├── LoopCalUtil.cs │ │ ├── LoopCalUtil.cs.meta │ │ ├── LoopObjectPool.cs │ │ └── LoopObjectPool.cs.meta ├── Sprites.meta └── Sprites │ ├── sprite.png │ └── sprite.png.meta ├── 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.md └── gif └── scrollrectloop.gif /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Mm]emoryCaptures/ 12 | 13 | # Asset meta data should only be ignored when the corresponding asset is also ignored 14 | !/[Aa]ssets/**/*.meta 15 | 16 | # Uncomment this line if you wish to ignore the asset store tools plugin 17 | # /[Aa]ssets/AssetStoreTools* 18 | 19 | # Autogenerated Jetbrains Rider plugin 20 | [Aa]ssets/Plugins/Editor/JetBrains* 21 | 22 | # Visual Studio cache directory 23 | .vs/ 24 | 25 | # Gradle cache directory 26 | .gradle/ 27 | 28 | # Autogenerated VS/MD/Consulo solution and project files 29 | ExportedObj/ 30 | .consulo/ 31 | *.csproj 32 | *.unityproj 33 | *.sln 34 | *.suo 35 | *.tmp 36 | *.user 37 | *.userprefs 38 | *.pidb 39 | *.booproj 40 | *.svd 41 | *.pdb 42 | *.mdb 43 | *.opendb 44 | *.VC.db 45 | 46 | # Unity3D generated meta files 47 | *.pidb.meta 48 | *.pdb.meta 49 | *.mdb.meta 50 | 51 | # Unity3D generated file on crash reports 52 | sysinfo.txt 53 | 54 | # Builds 55 | *.apk 56 | *.unitypackage 57 | 58 | # Crashlytics generated file 59 | crashlytics-build.properties 60 | 61 | -------------------------------------------------------------------------------- /Assets/Example.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 781b541f483778e46a95f79b3775f913 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Example/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b492c33f4fcac9d478819d25ec2be104 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Example/Prefabs/item_grid.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &990211717765134174 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: 5762688573346229536} 12 | m_Layer: 5 13 | m_Name: item_grid 14 | m_TagString: Untagged 15 | m_Icon: {fileID: 0} 16 | m_NavMeshLayer: 0 17 | m_StaticEditorFlags: 0 18 | m_IsActive: 1 19 | --- !u!224 &5762688573346229536 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: 990211717765134174} 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: 7924789647552554578} 31 | - {fileID: 5164371614124426598} 32 | - {fileID: 9058430800392694823} 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | m_AnchorMin: {x: 0, y: 0} 37 | m_AnchorMax: {x: 0, y: 0} 38 | m_AnchoredPosition: {x: 0, y: 0} 39 | m_SizeDelta: {x: 0, y: 0} 40 | m_Pivot: {x: 0.5, y: 0.5} 41 | --- !u!1 &4418877091886249690 42 | GameObject: 43 | m_ObjectHideFlags: 0 44 | m_CorrespondingSourceObject: {fileID: 0} 45 | m_PrefabInstance: {fileID: 0} 46 | m_PrefabAsset: {fileID: 0} 47 | serializedVersion: 6 48 | m_Component: 49 | - component: {fileID: 7924789647552554578} 50 | - component: {fileID: 6047235564142145397} 51 | - component: {fileID: 8938395888403851} 52 | m_Layer: 5 53 | m_Name: Image (1) 54 | m_TagString: Untagged 55 | m_Icon: {fileID: 0} 56 | m_NavMeshLayer: 0 57 | m_StaticEditorFlags: 0 58 | m_IsActive: 1 59 | --- !u!224 &7924789647552554578 60 | RectTransform: 61 | m_ObjectHideFlags: 0 62 | m_CorrespondingSourceObject: {fileID: 0} 63 | m_PrefabInstance: {fileID: 0} 64 | m_PrefabAsset: {fileID: 0} 65 | m_GameObject: {fileID: 4418877091886249690} 66 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 67 | m_LocalPosition: {x: 0, y: 0, z: 0} 68 | m_LocalScale: {x: 1, y: 1, z: 1} 69 | m_Children: [] 70 | m_Father: {fileID: 5762688573346229536} 71 | m_RootOrder: 0 72 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 73 | m_AnchorMin: {x: 0, y: 0} 74 | m_AnchorMax: {x: 1, y: 1} 75 | m_AnchoredPosition: {x: 0, y: 0} 76 | m_SizeDelta: {x: 0, y: 0} 77 | m_Pivot: {x: 0.5, y: 0.5} 78 | --- !u!222 &6047235564142145397 79 | CanvasRenderer: 80 | m_ObjectHideFlags: 0 81 | m_CorrespondingSourceObject: {fileID: 0} 82 | m_PrefabInstance: {fileID: 0} 83 | m_PrefabAsset: {fileID: 0} 84 | m_GameObject: {fileID: 4418877091886249690} 85 | m_CullTransparentMesh: 0 86 | --- !u!114 &8938395888403851 87 | MonoBehaviour: 88 | m_ObjectHideFlags: 0 89 | m_CorrespondingSourceObject: {fileID: 0} 90 | m_PrefabInstance: {fileID: 0} 91 | m_PrefabAsset: {fileID: 0} 92 | m_GameObject: {fileID: 4418877091886249690} 93 | m_Enabled: 1 94 | m_EditorHideFlags: 0 95 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 96 | m_Name: 97 | m_EditorClassIdentifier: 98 | m_Material: {fileID: 0} 99 | m_Color: {r: 0.5226504, g: 0.8207547, b: 0.5490387, a: 0.5019608} 100 | m_RaycastTarget: 1 101 | m_OnCullStateChanged: 102 | m_PersistentCalls: 103 | m_Calls: [] 104 | m_Sprite: {fileID: 0} 105 | m_Type: 0 106 | m_PreserveAspect: 0 107 | m_FillCenter: 1 108 | m_FillMethod: 4 109 | m_FillAmount: 1 110 | m_FillClockwise: 1 111 | m_FillOrigin: 0 112 | m_UseSpriteMesh: 0 113 | m_PixelsPerUnitMultiplier: 1 114 | --- !u!1 &4774988505077117777 115 | GameObject: 116 | m_ObjectHideFlags: 0 117 | m_CorrespondingSourceObject: {fileID: 0} 118 | m_PrefabInstance: {fileID: 0} 119 | m_PrefabAsset: {fileID: 0} 120 | serializedVersion: 6 121 | m_Component: 122 | - component: {fileID: 9058430800392694823} 123 | - component: {fileID: 6678830212581995278} 124 | - component: {fileID: 1005869891869161691} 125 | m_Layer: 5 126 | m_Name: Text 127 | m_TagString: Untagged 128 | m_Icon: {fileID: 0} 129 | m_NavMeshLayer: 0 130 | m_StaticEditorFlags: 0 131 | m_IsActive: 1 132 | --- !u!224 &9058430800392694823 133 | RectTransform: 134 | m_ObjectHideFlags: 0 135 | m_CorrespondingSourceObject: {fileID: 0} 136 | m_PrefabInstance: {fileID: 0} 137 | m_PrefabAsset: {fileID: 0} 138 | m_GameObject: {fileID: 4774988505077117777} 139 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 140 | m_LocalPosition: {x: 0, y: 0, z: 0} 141 | m_LocalScale: {x: 1, y: 1, z: 1} 142 | m_Children: [] 143 | m_Father: {fileID: 5762688573346229536} 144 | m_RootOrder: 2 145 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 146 | m_AnchorMin: {x: 0.5, y: 0.5} 147 | m_AnchorMax: {x: 0.5, y: 0.5} 148 | m_AnchoredPosition: {x: 0, y: -45.000004} 149 | m_SizeDelta: {x: 100, y: 37.28} 150 | m_Pivot: {x: 0.5, y: 0.5} 151 | --- !u!222 &6678830212581995278 152 | CanvasRenderer: 153 | m_ObjectHideFlags: 0 154 | m_CorrespondingSourceObject: {fileID: 0} 155 | m_PrefabInstance: {fileID: 0} 156 | m_PrefabAsset: {fileID: 0} 157 | m_GameObject: {fileID: 4774988505077117777} 158 | m_CullTransparentMesh: 0 159 | --- !u!114 &1005869891869161691 160 | MonoBehaviour: 161 | m_ObjectHideFlags: 0 162 | m_CorrespondingSourceObject: {fileID: 0} 163 | m_PrefabInstance: {fileID: 0} 164 | m_PrefabAsset: {fileID: 0} 165 | m_GameObject: {fileID: 4774988505077117777} 166 | m_Enabled: 1 167 | m_EditorHideFlags: 0 168 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 169 | m_Name: 170 | m_EditorClassIdentifier: 171 | m_Material: {fileID: 0} 172 | m_Color: {r: 1, g: 1, b: 1, a: 1} 173 | m_RaycastTarget: 1 174 | m_OnCullStateChanged: 175 | m_PersistentCalls: 176 | m_Calls: [] 177 | m_FontData: 178 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 179 | m_FontSize: 30 180 | m_FontStyle: 0 181 | m_BestFit: 0 182 | m_MinSize: 0 183 | m_MaxSize: 40 184 | m_Alignment: 4 185 | m_AlignByGeometry: 0 186 | m_RichText: 1 187 | m_HorizontalOverflow: 0 188 | m_VerticalOverflow: 0 189 | m_LineSpacing: 1 190 | m_Text: 1 191 | --- !u!1 &6331089484714736373 192 | GameObject: 193 | m_ObjectHideFlags: 0 194 | m_CorrespondingSourceObject: {fileID: 0} 195 | m_PrefabInstance: {fileID: 0} 196 | m_PrefabAsset: {fileID: 0} 197 | serializedVersion: 6 198 | m_Component: 199 | - component: {fileID: 5164371614124426598} 200 | - component: {fileID: 5220464140594376147} 201 | - component: {fileID: 2107256830172059736} 202 | m_Layer: 5 203 | m_Name: Image 204 | m_TagString: Untagged 205 | m_Icon: {fileID: 0} 206 | m_NavMeshLayer: 0 207 | m_StaticEditorFlags: 0 208 | m_IsActive: 1 209 | --- !u!224 &5164371614124426598 210 | RectTransform: 211 | m_ObjectHideFlags: 0 212 | m_CorrespondingSourceObject: {fileID: 0} 213 | m_PrefabInstance: {fileID: 0} 214 | m_PrefabAsset: {fileID: 0} 215 | m_GameObject: {fileID: 6331089484714736373} 216 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 217 | m_LocalPosition: {x: 0, y: 0, z: 0} 218 | m_LocalScale: {x: 1, y: 1, z: 1} 219 | m_Children: [] 220 | m_Father: {fileID: 5762688573346229536} 221 | m_RootOrder: 1 222 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 223 | m_AnchorMin: {x: 0.5, y: 0.5} 224 | m_AnchorMax: {x: 0.5, y: 0.5} 225 | m_AnchoredPosition: {x: 0, y: 18.639988} 226 | m_SizeDelta: {x: 90, y: 90} 227 | m_Pivot: {x: 0.5, y: 0.5} 228 | --- !u!222 &5220464140594376147 229 | CanvasRenderer: 230 | m_ObjectHideFlags: 0 231 | m_CorrespondingSourceObject: {fileID: 0} 232 | m_PrefabInstance: {fileID: 0} 233 | m_PrefabAsset: {fileID: 0} 234 | m_GameObject: {fileID: 6331089484714736373} 235 | m_CullTransparentMesh: 0 236 | --- !u!114 &2107256830172059736 237 | MonoBehaviour: 238 | m_ObjectHideFlags: 0 239 | m_CorrespondingSourceObject: {fileID: 0} 240 | m_PrefabInstance: {fileID: 0} 241 | m_PrefabAsset: {fileID: 0} 242 | m_GameObject: {fileID: 6331089484714736373} 243 | m_Enabled: 1 244 | m_EditorHideFlags: 0 245 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 246 | m_Name: 247 | m_EditorClassIdentifier: 248 | m_Material: {fileID: 0} 249 | m_Color: {r: 1, g: 1, b: 1, a: 1} 250 | m_RaycastTarget: 1 251 | m_OnCullStateChanged: 252 | m_PersistentCalls: 253 | m_Calls: [] 254 | m_Sprite: {fileID: 21300000, guid: 311fdd9149bc8da44acbe01e7a131e49, type: 3} 255 | m_Type: 0 256 | m_PreserveAspect: 0 257 | m_FillCenter: 1 258 | m_FillMethod: 4 259 | m_FillAmount: 1 260 | m_FillClockwise: 1 261 | m_FillOrigin: 0 262 | m_UseSpriteMesh: 0 263 | m_PixelsPerUnitMultiplier: 1 264 | -------------------------------------------------------------------------------- /Assets/Example/Prefabs/item_grid.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dba2a0d09293e594398acd2acd15abbc 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Example/Prefabs/item_horizontal.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &662227178000246436 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: 2699125503846861048} 12 | - component: {fileID: 5828088029970874065} 13 | - component: {fileID: 5090747851481924246} 14 | - component: {fileID: 2495526173264962128} 15 | m_Layer: 5 16 | m_Name: Image (1) 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!224 &2699125503846861048 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: 662227178000246436} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 322446251261123542} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | m_AnchorMin: {x: 0, y: 0} 37 | m_AnchorMax: {x: 1, y: 1} 38 | m_AnchoredPosition: {x: 0, y: 0} 39 | m_SizeDelta: {x: 0, y: 0} 40 | m_Pivot: {x: 0.5, y: 0.5} 41 | --- !u!222 &5828088029970874065 42 | CanvasRenderer: 43 | m_ObjectHideFlags: 0 44 | m_CorrespondingSourceObject: {fileID: 0} 45 | m_PrefabInstance: {fileID: 0} 46 | m_PrefabAsset: {fileID: 0} 47 | m_GameObject: {fileID: 662227178000246436} 48 | m_CullTransparentMesh: 0 49 | --- !u!114 &5090747851481924246 50 | MonoBehaviour: 51 | m_ObjectHideFlags: 0 52 | m_CorrespondingSourceObject: {fileID: 0} 53 | m_PrefabInstance: {fileID: 0} 54 | m_PrefabAsset: {fileID: 0} 55 | m_GameObject: {fileID: 662227178000246436} 56 | m_Enabled: 1 57 | m_EditorHideFlags: 0 58 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 59 | m_Name: 60 | m_EditorClassIdentifier: 61 | m_Material: {fileID: 0} 62 | m_Color: {r: 0.52156866, g: 0.81960785, b: 0.54901963, a: 0.5019608} 63 | m_RaycastTarget: 1 64 | m_OnCullStateChanged: 65 | m_PersistentCalls: 66 | m_Calls: [] 67 | m_Sprite: {fileID: 0} 68 | m_Type: 0 69 | m_PreserveAspect: 0 70 | m_FillCenter: 1 71 | m_FillMethod: 4 72 | m_FillAmount: 1 73 | m_FillClockwise: 1 74 | m_FillOrigin: 0 75 | m_UseSpriteMesh: 0 76 | m_PixelsPerUnitMultiplier: 1 77 | --- !u!114 &2495526173264962128 78 | MonoBehaviour: 79 | m_ObjectHideFlags: 0 80 | m_CorrespondingSourceObject: {fileID: 0} 81 | m_PrefabInstance: {fileID: 0} 82 | m_PrefabAsset: {fileID: 0} 83 | m_GameObject: {fileID: 662227178000246436} 84 | m_Enabled: 1 85 | m_EditorHideFlags: 0 86 | m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} 87 | m_Name: 88 | m_EditorClassIdentifier: 89 | m_IgnoreLayout: 1 90 | m_MinWidth: -1 91 | m_MinHeight: -1 92 | m_PreferredWidth: -1 93 | m_PreferredHeight: -1 94 | m_FlexibleWidth: -1 95 | m_FlexibleHeight: -1 96 | m_LayoutPriority: 1 97 | --- !u!1 &3349183940376400638 98 | GameObject: 99 | m_ObjectHideFlags: 0 100 | m_CorrespondingSourceObject: {fileID: 0} 101 | m_PrefabInstance: {fileID: 0} 102 | m_PrefabAsset: {fileID: 0} 103 | serializedVersion: 6 104 | m_Component: 105 | - component: {fileID: 4604099960679670350} 106 | - component: {fileID: 3583326835843563502} 107 | - component: {fileID: 829447236121574193} 108 | - component: {fileID: 6961042700914875231} 109 | m_Layer: 5 110 | m_Name: Image 111 | m_TagString: Untagged 112 | m_Icon: {fileID: 0} 113 | m_NavMeshLayer: 0 114 | m_StaticEditorFlags: 0 115 | m_IsActive: 1 116 | --- !u!224 &4604099960679670350 117 | RectTransform: 118 | m_ObjectHideFlags: 0 119 | m_CorrespondingSourceObject: {fileID: 0} 120 | m_PrefabInstance: {fileID: 0} 121 | m_PrefabAsset: {fileID: 0} 122 | m_GameObject: {fileID: 3349183940376400638} 123 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 124 | m_LocalPosition: {x: 0, y: 0, z: 0} 125 | m_LocalScale: {x: 1, y: 1, z: 1} 126 | m_Children: [] 127 | m_Father: {fileID: 322446251261123542} 128 | m_RootOrder: 1 129 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 130 | m_AnchorMin: {x: 0, y: 0} 131 | m_AnchorMax: {x: 0, y: 0} 132 | m_AnchoredPosition: {x: 0, y: 0} 133 | m_SizeDelta: {x: 0, y: 0} 134 | m_Pivot: {x: 0.5, y: 0.5} 135 | --- !u!222 &3583326835843563502 136 | CanvasRenderer: 137 | m_ObjectHideFlags: 0 138 | m_CorrespondingSourceObject: {fileID: 0} 139 | m_PrefabInstance: {fileID: 0} 140 | m_PrefabAsset: {fileID: 0} 141 | m_GameObject: {fileID: 3349183940376400638} 142 | m_CullTransparentMesh: 0 143 | --- !u!114 &829447236121574193 144 | MonoBehaviour: 145 | m_ObjectHideFlags: 0 146 | m_CorrespondingSourceObject: {fileID: 0} 147 | m_PrefabInstance: {fileID: 0} 148 | m_PrefabAsset: {fileID: 0} 149 | m_GameObject: {fileID: 3349183940376400638} 150 | m_Enabled: 1 151 | m_EditorHideFlags: 0 152 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 153 | m_Name: 154 | m_EditorClassIdentifier: 155 | m_Material: {fileID: 0} 156 | m_Color: {r: 1, g: 1, b: 1, a: 1} 157 | m_RaycastTarget: 1 158 | m_OnCullStateChanged: 159 | m_PersistentCalls: 160 | m_Calls: [] 161 | m_Sprite: {fileID: 21300000, guid: 311fdd9149bc8da44acbe01e7a131e49, type: 3} 162 | m_Type: 0 163 | m_PreserveAspect: 0 164 | m_FillCenter: 1 165 | m_FillMethod: 4 166 | m_FillAmount: 1 167 | m_FillClockwise: 1 168 | m_FillOrigin: 0 169 | m_UseSpriteMesh: 0 170 | m_PixelsPerUnitMultiplier: 1 171 | --- !u!114 &6961042700914875231 172 | MonoBehaviour: 173 | m_ObjectHideFlags: 0 174 | m_CorrespondingSourceObject: {fileID: 0} 175 | m_PrefabInstance: {fileID: 0} 176 | m_PrefabAsset: {fileID: 0} 177 | m_GameObject: {fileID: 3349183940376400638} 178 | m_Enabled: 1 179 | m_EditorHideFlags: 0 180 | m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} 181 | m_Name: 182 | m_EditorClassIdentifier: 183 | m_IgnoreLayout: 0 184 | m_MinWidth: -1 185 | m_MinHeight: -1 186 | m_PreferredWidth: 100 187 | m_PreferredHeight: 100 188 | m_FlexibleWidth: -1 189 | m_FlexibleHeight: -1 190 | m_LayoutPriority: 1 191 | --- !u!1 &3485808779685488041 192 | GameObject: 193 | m_ObjectHideFlags: 0 194 | m_CorrespondingSourceObject: {fileID: 0} 195 | m_PrefabInstance: {fileID: 0} 196 | m_PrefabAsset: {fileID: 0} 197 | serializedVersion: 6 198 | m_Component: 199 | - component: {fileID: 322446251261123542} 200 | - component: {fileID: 1004280653765398723} 201 | m_Layer: 5 202 | m_Name: item_horizontal 203 | m_TagString: Untagged 204 | m_Icon: {fileID: 0} 205 | m_NavMeshLayer: 0 206 | m_StaticEditorFlags: 0 207 | m_IsActive: 1 208 | --- !u!224 &322446251261123542 209 | RectTransform: 210 | m_ObjectHideFlags: 0 211 | m_CorrespondingSourceObject: {fileID: 0} 212 | m_PrefabInstance: {fileID: 0} 213 | m_PrefabAsset: {fileID: 0} 214 | m_GameObject: {fileID: 3485808779685488041} 215 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 216 | m_LocalPosition: {x: 0, y: 0, z: 0} 217 | m_LocalScale: {x: 1, y: 1, z: 1} 218 | m_Children: 219 | - {fileID: 2699125503846861048} 220 | - {fileID: 4604099960679670350} 221 | - {fileID: 2010982843743502146} 222 | m_Father: {fileID: 0} 223 | m_RootOrder: 0 224 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 225 | m_AnchorMin: {x: 0, y: 1} 226 | m_AnchorMax: {x: 0, y: 1} 227 | m_AnchoredPosition: {x: -305.0597, y: 212.6} 228 | m_SizeDelta: {x: 372.76, y: 124} 229 | m_Pivot: {x: 0.5, y: 0.5} 230 | --- !u!114 &1004280653765398723 231 | MonoBehaviour: 232 | m_ObjectHideFlags: 0 233 | m_CorrespondingSourceObject: {fileID: 0} 234 | m_PrefabInstance: {fileID: 0} 235 | m_PrefabAsset: {fileID: 0} 236 | m_GameObject: {fileID: 3485808779685488041} 237 | m_Enabled: 1 238 | m_EditorHideFlags: 0 239 | m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} 240 | m_Name: 241 | m_EditorClassIdentifier: 242 | m_Padding: 243 | m_Left: 0 244 | m_Right: 0 245 | m_Top: 0 246 | m_Bottom: 0 247 | m_ChildAlignment: 0 248 | m_Spacing: 0 249 | m_ChildForceExpandWidth: 0 250 | m_ChildForceExpandHeight: 0 251 | m_ChildControlWidth: 1 252 | m_ChildControlHeight: 1 253 | m_ChildScaleWidth: 0 254 | m_ChildScaleHeight: 0 255 | --- !u!1 &4138241579388866310 256 | GameObject: 257 | m_ObjectHideFlags: 0 258 | m_CorrespondingSourceObject: {fileID: 0} 259 | m_PrefabInstance: {fileID: 0} 260 | m_PrefabAsset: {fileID: 0} 261 | serializedVersion: 6 262 | m_Component: 263 | - component: {fileID: 2010982843743502146} 264 | - component: {fileID: 3810402022573390934} 265 | - component: {fileID: 2759387349405953480} 266 | m_Layer: 5 267 | m_Name: Text 268 | m_TagString: Untagged 269 | m_Icon: {fileID: 0} 270 | m_NavMeshLayer: 0 271 | m_StaticEditorFlags: 0 272 | m_IsActive: 1 273 | --- !u!224 &2010982843743502146 274 | RectTransform: 275 | m_ObjectHideFlags: 0 276 | m_CorrespondingSourceObject: {fileID: 0} 277 | m_PrefabInstance: {fileID: 0} 278 | m_PrefabAsset: {fileID: 0} 279 | m_GameObject: {fileID: 4138241579388866310} 280 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 281 | m_LocalPosition: {x: 0, y: 0, z: 0} 282 | m_LocalScale: {x: 1, y: 1, z: 1} 283 | m_Children: [] 284 | m_Father: {fileID: 322446251261123542} 285 | m_RootOrder: 2 286 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 287 | m_AnchorMin: {x: 0, y: 0} 288 | m_AnchorMax: {x: 0, y: 0} 289 | m_AnchoredPosition: {x: 0, y: 0} 290 | m_SizeDelta: {x: 0, y: 0} 291 | m_Pivot: {x: 0.5, y: 0.5} 292 | --- !u!222 &3810402022573390934 293 | CanvasRenderer: 294 | m_ObjectHideFlags: 0 295 | m_CorrespondingSourceObject: {fileID: 0} 296 | m_PrefabInstance: {fileID: 0} 297 | m_PrefabAsset: {fileID: 0} 298 | m_GameObject: {fileID: 4138241579388866310} 299 | m_CullTransparentMesh: 0 300 | --- !u!114 &2759387349405953480 301 | MonoBehaviour: 302 | m_ObjectHideFlags: 0 303 | m_CorrespondingSourceObject: {fileID: 0} 304 | m_PrefabInstance: {fileID: 0} 305 | m_PrefabAsset: {fileID: 0} 306 | m_GameObject: {fileID: 4138241579388866310} 307 | m_Enabled: 1 308 | m_EditorHideFlags: 0 309 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 310 | m_Name: 311 | m_EditorClassIdentifier: 312 | m_Material: {fileID: 0} 313 | m_Color: {r: 1, g: 1, b: 1, a: 1} 314 | m_RaycastTarget: 1 315 | m_OnCullStateChanged: 316 | m_PersistentCalls: 317 | m_Calls: [] 318 | m_FontData: 319 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 320 | m_FontSize: 30 321 | m_FontStyle: 0 322 | m_BestFit: 0 323 | m_MinSize: 0 324 | m_MaxSize: 40 325 | m_Alignment: 0 326 | m_AlignByGeometry: 0 327 | m_RichText: 1 328 | m_HorizontalOverflow: 0 329 | m_VerticalOverflow: 0 330 | m_LineSpacing: 1 331 | m_Text: 332 | -------------------------------------------------------------------------------- /Assets/Example/Prefabs/item_horizontal.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4b71cecaca67f6343a8f495e370dab93 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Example/Prefabs/item_vertical.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3349183940376400638 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: 4604099960679670350} 12 | - component: {fileID: 3583326835843563502} 13 | - component: {fileID: 829447236121574193} 14 | - component: {fileID: 6961042700914875231} 15 | m_Layer: 5 16 | m_Name: Image 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!224 &4604099960679670350 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: 3349183940376400638} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 322446251261123542} 34 | m_RootOrder: 1 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | m_AnchorMin: {x: 0, y: 0} 37 | m_AnchorMax: {x: 0, y: 0} 38 | m_AnchoredPosition: {x: 0, y: 0} 39 | m_SizeDelta: {x: 0, y: 0} 40 | m_Pivot: {x: 0.5, y: 0.5} 41 | --- !u!222 &3583326835843563502 42 | CanvasRenderer: 43 | m_ObjectHideFlags: 0 44 | m_CorrespondingSourceObject: {fileID: 0} 45 | m_PrefabInstance: {fileID: 0} 46 | m_PrefabAsset: {fileID: 0} 47 | m_GameObject: {fileID: 3349183940376400638} 48 | m_CullTransparentMesh: 0 49 | --- !u!114 &829447236121574193 50 | MonoBehaviour: 51 | m_ObjectHideFlags: 0 52 | m_CorrespondingSourceObject: {fileID: 0} 53 | m_PrefabInstance: {fileID: 0} 54 | m_PrefabAsset: {fileID: 0} 55 | m_GameObject: {fileID: 3349183940376400638} 56 | m_Enabled: 1 57 | m_EditorHideFlags: 0 58 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 59 | m_Name: 60 | m_EditorClassIdentifier: 61 | m_Material: {fileID: 0} 62 | m_Color: {r: 1, g: 1, b: 1, a: 1} 63 | m_RaycastTarget: 1 64 | m_OnCullStateChanged: 65 | m_PersistentCalls: 66 | m_Calls: [] 67 | m_Sprite: {fileID: 21300000, guid: 311fdd9149bc8da44acbe01e7a131e49, type: 3} 68 | m_Type: 0 69 | m_PreserveAspect: 0 70 | m_FillCenter: 1 71 | m_FillMethod: 4 72 | m_FillAmount: 1 73 | m_FillClockwise: 1 74 | m_FillOrigin: 0 75 | m_UseSpriteMesh: 0 76 | m_PixelsPerUnitMultiplier: 1 77 | --- !u!114 &6961042700914875231 78 | MonoBehaviour: 79 | m_ObjectHideFlags: 0 80 | m_CorrespondingSourceObject: {fileID: 0} 81 | m_PrefabInstance: {fileID: 0} 82 | m_PrefabAsset: {fileID: 0} 83 | m_GameObject: {fileID: 3349183940376400638} 84 | m_Enabled: 1 85 | m_EditorHideFlags: 0 86 | m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} 87 | m_Name: 88 | m_EditorClassIdentifier: 89 | m_IgnoreLayout: 0 90 | m_MinWidth: -1 91 | m_MinHeight: -1 92 | m_PreferredWidth: 100 93 | m_PreferredHeight: 100 94 | m_FlexibleWidth: -1 95 | m_FlexibleHeight: -1 96 | m_LayoutPriority: 1 97 | --- !u!1 &3485808779685488041 98 | GameObject: 99 | m_ObjectHideFlags: 0 100 | m_CorrespondingSourceObject: {fileID: 0} 101 | m_PrefabInstance: {fileID: 0} 102 | m_PrefabAsset: {fileID: 0} 103 | serializedVersion: 6 104 | m_Component: 105 | - component: {fileID: 322446251261123542} 106 | - component: {fileID: 1160352309130408626} 107 | m_Layer: 5 108 | m_Name: item_vertical 109 | m_TagString: Untagged 110 | m_Icon: {fileID: 0} 111 | m_NavMeshLayer: 0 112 | m_StaticEditorFlags: 0 113 | m_IsActive: 1 114 | --- !u!224 &322446251261123542 115 | RectTransform: 116 | m_ObjectHideFlags: 0 117 | m_CorrespondingSourceObject: {fileID: 0} 118 | m_PrefabInstance: {fileID: 0} 119 | m_PrefabAsset: {fileID: 0} 120 | m_GameObject: {fileID: 3485808779685488041} 121 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 122 | m_LocalPosition: {x: 0, y: 0, z: 0} 123 | m_LocalScale: {x: 1, y: 1, z: 1} 124 | m_Children: 125 | - {fileID: 6409704876539700071} 126 | - {fileID: 4604099960679670350} 127 | - {fileID: 2010982843743502146} 128 | m_Father: {fileID: 0} 129 | m_RootOrder: 0 130 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 131 | m_AnchorMin: {x: 0, y: 1} 132 | m_AnchorMax: {x: 0, y: 1} 133 | m_AnchoredPosition: {x: -305.0597, y: 212.6} 134 | m_SizeDelta: {x: 372.76, y: 151.6} 135 | m_Pivot: {x: 0.5, y: 0.5} 136 | --- !u!114 &1160352309130408626 137 | MonoBehaviour: 138 | m_ObjectHideFlags: 0 139 | m_CorrespondingSourceObject: {fileID: 0} 140 | m_PrefabInstance: {fileID: 0} 141 | m_PrefabAsset: {fileID: 0} 142 | m_GameObject: {fileID: 3485808779685488041} 143 | m_Enabled: 1 144 | m_EditorHideFlags: 0 145 | m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} 146 | m_Name: 147 | m_EditorClassIdentifier: 148 | m_Padding: 149 | m_Left: 0 150 | m_Right: 0 151 | m_Top: 0 152 | m_Bottom: 0 153 | m_ChildAlignment: 4 154 | m_Spacing: 0 155 | m_ChildForceExpandWidth: 0 156 | m_ChildForceExpandHeight: 0 157 | m_ChildControlWidth: 1 158 | m_ChildControlHeight: 1 159 | m_ChildScaleWidth: 0 160 | m_ChildScaleHeight: 0 161 | --- !u!1 &4138241579388866310 162 | GameObject: 163 | m_ObjectHideFlags: 0 164 | m_CorrespondingSourceObject: {fileID: 0} 165 | m_PrefabInstance: {fileID: 0} 166 | m_PrefabAsset: {fileID: 0} 167 | serializedVersion: 6 168 | m_Component: 169 | - component: {fileID: 2010982843743502146} 170 | - component: {fileID: 3810402022573390934} 171 | - component: {fileID: 2759387349405953480} 172 | - component: {fileID: 4773307245422136448} 173 | m_Layer: 5 174 | m_Name: Text 175 | m_TagString: Untagged 176 | m_Icon: {fileID: 0} 177 | m_NavMeshLayer: 0 178 | m_StaticEditorFlags: 0 179 | m_IsActive: 1 180 | --- !u!224 &2010982843743502146 181 | RectTransform: 182 | m_ObjectHideFlags: 0 183 | m_CorrespondingSourceObject: {fileID: 0} 184 | m_PrefabInstance: {fileID: 0} 185 | m_PrefabAsset: {fileID: 0} 186 | m_GameObject: {fileID: 4138241579388866310} 187 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 188 | m_LocalPosition: {x: 0, y: 0, z: 0} 189 | m_LocalScale: {x: 1, y: 1, z: 1} 190 | m_Children: [] 191 | m_Father: {fileID: 322446251261123542} 192 | m_RootOrder: 2 193 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 194 | m_AnchorMin: {x: 0, y: 0} 195 | m_AnchorMax: {x: 0, y: 0} 196 | m_AnchoredPosition: {x: 0, y: 0} 197 | m_SizeDelta: {x: 0, y: 0} 198 | m_Pivot: {x: 0.5, y: 0.5} 199 | --- !u!222 &3810402022573390934 200 | CanvasRenderer: 201 | m_ObjectHideFlags: 0 202 | m_CorrespondingSourceObject: {fileID: 0} 203 | m_PrefabInstance: {fileID: 0} 204 | m_PrefabAsset: {fileID: 0} 205 | m_GameObject: {fileID: 4138241579388866310} 206 | m_CullTransparentMesh: 0 207 | --- !u!114 &2759387349405953480 208 | MonoBehaviour: 209 | m_ObjectHideFlags: 0 210 | m_CorrespondingSourceObject: {fileID: 0} 211 | m_PrefabInstance: {fileID: 0} 212 | m_PrefabAsset: {fileID: 0} 213 | m_GameObject: {fileID: 4138241579388866310} 214 | m_Enabled: 1 215 | m_EditorHideFlags: 0 216 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 217 | m_Name: 218 | m_EditorClassIdentifier: 219 | m_Material: {fileID: 0} 220 | m_Color: {r: 1, g: 1, b: 1, a: 1} 221 | m_RaycastTarget: 1 222 | m_OnCullStateChanged: 223 | m_PersistentCalls: 224 | m_Calls: [] 225 | m_FontData: 226 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 227 | m_FontSize: 30 228 | m_FontStyle: 0 229 | m_BestFit: 0 230 | m_MinSize: 0 231 | m_MaxSize: 40 232 | m_Alignment: 0 233 | m_AlignByGeometry: 0 234 | m_RichText: 1 235 | m_HorizontalOverflow: 0 236 | m_VerticalOverflow: 0 237 | m_LineSpacing: 1 238 | m_Text: 111111111111111111111112312dsadsadsadasdsadsadada 239 | --- !u!114 &4773307245422136448 240 | MonoBehaviour: 241 | m_ObjectHideFlags: 0 242 | m_CorrespondingSourceObject: {fileID: 0} 243 | m_PrefabInstance: {fileID: 0} 244 | m_PrefabAsset: {fileID: 0} 245 | m_GameObject: {fileID: 4138241579388866310} 246 | m_Enabled: 1 247 | m_EditorHideFlags: 0 248 | m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} 249 | m_Name: 250 | m_EditorClassIdentifier: 251 | m_IgnoreLayout: 0 252 | m_MinWidth: -1 253 | m_MinHeight: -1 254 | m_PreferredWidth: 252 255 | m_PreferredHeight: -1 256 | m_FlexibleWidth: -1 257 | m_FlexibleHeight: -1 258 | m_LayoutPriority: 1 259 | --- !u!1 &5793651359163155261 260 | GameObject: 261 | m_ObjectHideFlags: 0 262 | m_CorrespondingSourceObject: {fileID: 0} 263 | m_PrefabInstance: {fileID: 0} 264 | m_PrefabAsset: {fileID: 0} 265 | serializedVersion: 6 266 | m_Component: 267 | - component: {fileID: 6409704876539700071} 268 | - component: {fileID: 6974787061617583151} 269 | - component: {fileID: 2433094580758773285} 270 | - component: {fileID: 6109999528377516182} 271 | m_Layer: 5 272 | m_Name: Image (1) 273 | m_TagString: Untagged 274 | m_Icon: {fileID: 0} 275 | m_NavMeshLayer: 0 276 | m_StaticEditorFlags: 0 277 | m_IsActive: 1 278 | --- !u!224 &6409704876539700071 279 | RectTransform: 280 | m_ObjectHideFlags: 0 281 | m_CorrespondingSourceObject: {fileID: 0} 282 | m_PrefabInstance: {fileID: 0} 283 | m_PrefabAsset: {fileID: 0} 284 | m_GameObject: {fileID: 5793651359163155261} 285 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 286 | m_LocalPosition: {x: 0, y: 0, z: 0} 287 | m_LocalScale: {x: 1, y: 1, z: 1} 288 | m_Children: [] 289 | m_Father: {fileID: 322446251261123542} 290 | m_RootOrder: 0 291 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 292 | m_AnchorMin: {x: 0, y: 0} 293 | m_AnchorMax: {x: 1, y: 1} 294 | m_AnchoredPosition: {x: 0, y: 0} 295 | m_SizeDelta: {x: 0, y: 0} 296 | m_Pivot: {x: 0.5, y: 0.5} 297 | --- !u!222 &6974787061617583151 298 | CanvasRenderer: 299 | m_ObjectHideFlags: 0 300 | m_CorrespondingSourceObject: {fileID: 0} 301 | m_PrefabInstance: {fileID: 0} 302 | m_PrefabAsset: {fileID: 0} 303 | m_GameObject: {fileID: 5793651359163155261} 304 | m_CullTransparentMesh: 0 305 | --- !u!114 &2433094580758773285 306 | MonoBehaviour: 307 | m_ObjectHideFlags: 0 308 | m_CorrespondingSourceObject: {fileID: 0} 309 | m_PrefabInstance: {fileID: 0} 310 | m_PrefabAsset: {fileID: 0} 311 | m_GameObject: {fileID: 5793651359163155261} 312 | m_Enabled: 1 313 | m_EditorHideFlags: 0 314 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 315 | m_Name: 316 | m_EditorClassIdentifier: 317 | m_Material: {fileID: 0} 318 | m_Color: {r: 0.52156866, g: 0.81960785, b: 0.54901963, a: 0.5019608} 319 | m_RaycastTarget: 1 320 | m_OnCullStateChanged: 321 | m_PersistentCalls: 322 | m_Calls: [] 323 | m_Sprite: {fileID: 0} 324 | m_Type: 0 325 | m_PreserveAspect: 0 326 | m_FillCenter: 1 327 | m_FillMethod: 4 328 | m_FillAmount: 1 329 | m_FillClockwise: 1 330 | m_FillOrigin: 0 331 | m_UseSpriteMesh: 0 332 | m_PixelsPerUnitMultiplier: 1 333 | --- !u!114 &6109999528377516182 334 | MonoBehaviour: 335 | m_ObjectHideFlags: 0 336 | m_CorrespondingSourceObject: {fileID: 0} 337 | m_PrefabInstance: {fileID: 0} 338 | m_PrefabAsset: {fileID: 0} 339 | m_GameObject: {fileID: 5793651359163155261} 340 | m_Enabled: 1 341 | m_EditorHideFlags: 0 342 | m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} 343 | m_Name: 344 | m_EditorClassIdentifier: 345 | m_IgnoreLayout: 1 346 | m_MinWidth: -1 347 | m_MinHeight: -1 348 | m_PreferredWidth: -1 349 | m_PreferredHeight: -1 350 | m_FlexibleWidth: -1 351 | m_FlexibleHeight: -1 352 | m_LayoutPriority: 1 353 | -------------------------------------------------------------------------------- /Assets/Example/Prefabs/item_vertical.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 67d7f1df812f6a24d86d1117944d112f 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Example/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d0efa5e38e6e7c94f8b2e564bd460134 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Example/Scenes/ExampleScene.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: 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: 0} 41 | m_IndirectSpecularColor: {r: 0, g: 0, b: 0, 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: 1 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 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_ExtractAmbientOcclusion: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 1 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 2 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ExportTrainingData: 0 98 | m_TrainingDataDestination: TrainingData 99 | m_LightProbeSampleCountMultiplier: 4 100 | m_LightingDataAsset: {fileID: 0} 101 | m_UseShadowmask: 1 102 | --- !u!196 &4 103 | NavMeshSettings: 104 | serializedVersion: 2 105 | m_ObjectHideFlags: 0 106 | m_BuildSettings: 107 | serializedVersion: 2 108 | agentTypeID: 0 109 | agentRadius: 0.5 110 | agentHeight: 2 111 | agentSlope: 45 112 | agentClimb: 0.4 113 | ledgeDropHeight: 0 114 | maxJumpAcrossDistance: 0 115 | minRegionArea: 2 116 | manualCellSize: 0 117 | cellSize: 0.16666667 118 | manualTileSize: 0 119 | tileSize: 256 120 | accuratePlacement: 0 121 | debug: 122 | m_Flags: 0 123 | m_NavMeshData: {fileID: 0} 124 | --- !u!1 &149825291 125 | GameObject: 126 | m_ObjectHideFlags: 0 127 | m_CorrespondingSourceObject: {fileID: 0} 128 | m_PrefabInstance: {fileID: 0} 129 | m_PrefabAsset: {fileID: 0} 130 | serializedVersion: 6 131 | m_Component: 132 | - component: {fileID: 149825292} 133 | - component: {fileID: 149825295} 134 | - component: {fileID: 149825294} 135 | - component: {fileID: 149825293} 136 | m_Layer: 5 137 | m_Name: Viewport 138 | m_TagString: Untagged 139 | m_Icon: {fileID: 0} 140 | m_NavMeshLayer: 0 141 | m_StaticEditorFlags: 0 142 | m_IsActive: 1 143 | --- !u!224 &149825292 144 | RectTransform: 145 | m_ObjectHideFlags: 0 146 | m_CorrespondingSourceObject: {fileID: 0} 147 | m_PrefabInstance: {fileID: 0} 148 | m_PrefabAsset: {fileID: 0} 149 | m_GameObject: {fileID: 149825291} 150 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 151 | m_LocalPosition: {x: 0, y: 0, z: 0} 152 | m_LocalScale: {x: 1, y: 1, z: 1} 153 | m_Children: 154 | - {fileID: 1688140172} 155 | m_Father: {fileID: 1077929772} 156 | m_RootOrder: 0 157 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 158 | m_AnchorMin: {x: 0, y: 0} 159 | m_AnchorMax: {x: 1, y: 1} 160 | m_AnchoredPosition: {x: 0, y: 0} 161 | m_SizeDelta: {x: 0, y: 0} 162 | m_Pivot: {x: 0, y: 1} 163 | --- !u!114 &149825293 164 | MonoBehaviour: 165 | m_ObjectHideFlags: 0 166 | m_CorrespondingSourceObject: {fileID: 0} 167 | m_PrefabInstance: {fileID: 0} 168 | m_PrefabAsset: {fileID: 0} 169 | m_GameObject: {fileID: 149825291} 170 | m_Enabled: 1 171 | m_EditorHideFlags: 0 172 | m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} 173 | m_Name: 174 | m_EditorClassIdentifier: 175 | m_ShowMaskGraphic: 0 176 | --- !u!114 &149825294 177 | MonoBehaviour: 178 | m_ObjectHideFlags: 0 179 | m_CorrespondingSourceObject: {fileID: 0} 180 | m_PrefabInstance: {fileID: 0} 181 | m_PrefabAsset: {fileID: 0} 182 | m_GameObject: {fileID: 149825291} 183 | m_Enabled: 1 184 | m_EditorHideFlags: 0 185 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 186 | m_Name: 187 | m_EditorClassIdentifier: 188 | m_Material: {fileID: 0} 189 | m_Color: {r: 1, g: 1, b: 1, a: 1} 190 | m_RaycastTarget: 1 191 | m_OnCullStateChanged: 192 | m_PersistentCalls: 193 | m_Calls: [] 194 | m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} 195 | m_Type: 1 196 | m_PreserveAspect: 0 197 | m_FillCenter: 1 198 | m_FillMethod: 4 199 | m_FillAmount: 1 200 | m_FillClockwise: 1 201 | m_FillOrigin: 0 202 | m_UseSpriteMesh: 0 203 | m_PixelsPerUnitMultiplier: 1 204 | --- !u!222 &149825295 205 | CanvasRenderer: 206 | m_ObjectHideFlags: 0 207 | m_CorrespondingSourceObject: {fileID: 0} 208 | m_PrefabInstance: {fileID: 0} 209 | m_PrefabAsset: {fileID: 0} 210 | m_GameObject: {fileID: 149825291} 211 | m_CullTransparentMesh: 0 212 | --- !u!1 &240305138 213 | GameObject: 214 | m_ObjectHideFlags: 0 215 | m_CorrespondingSourceObject: {fileID: 0} 216 | m_PrefabInstance: {fileID: 0} 217 | m_PrefabAsset: {fileID: 0} 218 | serializedVersion: 6 219 | m_Component: 220 | - component: {fileID: 240305139} 221 | - component: {fileID: 240305142} 222 | - component: {fileID: 240305141} 223 | - component: {fileID: 240305140} 224 | m_Layer: 5 225 | m_Name: Viewport 226 | m_TagString: Untagged 227 | m_Icon: {fileID: 0} 228 | m_NavMeshLayer: 0 229 | m_StaticEditorFlags: 0 230 | m_IsActive: 1 231 | --- !u!224 &240305139 232 | RectTransform: 233 | m_ObjectHideFlags: 0 234 | m_CorrespondingSourceObject: {fileID: 0} 235 | m_PrefabInstance: {fileID: 0} 236 | m_PrefabAsset: {fileID: 0} 237 | m_GameObject: {fileID: 240305138} 238 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 239 | m_LocalPosition: {x: 0, y: 0, z: 0} 240 | m_LocalScale: {x: 1, y: 1, z: 1} 241 | m_Children: 242 | - {fileID: 858578205} 243 | m_Father: {fileID: 1043046527} 244 | m_RootOrder: 0 245 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 246 | m_AnchorMin: {x: 0, y: 0} 247 | m_AnchorMax: {x: 1, y: 1} 248 | m_AnchoredPosition: {x: 0, y: 0} 249 | m_SizeDelta: {x: 0, y: 0} 250 | m_Pivot: {x: 0, y: 1} 251 | --- !u!114 &240305140 252 | MonoBehaviour: 253 | m_ObjectHideFlags: 0 254 | m_CorrespondingSourceObject: {fileID: 0} 255 | m_PrefabInstance: {fileID: 0} 256 | m_PrefabAsset: {fileID: 0} 257 | m_GameObject: {fileID: 240305138} 258 | m_Enabled: 1 259 | m_EditorHideFlags: 0 260 | m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} 261 | m_Name: 262 | m_EditorClassIdentifier: 263 | m_ShowMaskGraphic: 0 264 | --- !u!114 &240305141 265 | MonoBehaviour: 266 | m_ObjectHideFlags: 0 267 | m_CorrespondingSourceObject: {fileID: 0} 268 | m_PrefabInstance: {fileID: 0} 269 | m_PrefabAsset: {fileID: 0} 270 | m_GameObject: {fileID: 240305138} 271 | m_Enabled: 1 272 | m_EditorHideFlags: 0 273 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 274 | m_Name: 275 | m_EditorClassIdentifier: 276 | m_Material: {fileID: 0} 277 | m_Color: {r: 1, g: 1, b: 1, a: 1} 278 | m_RaycastTarget: 1 279 | m_OnCullStateChanged: 280 | m_PersistentCalls: 281 | m_Calls: [] 282 | m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} 283 | m_Type: 1 284 | m_PreserveAspect: 0 285 | m_FillCenter: 1 286 | m_FillMethod: 4 287 | m_FillAmount: 1 288 | m_FillClockwise: 1 289 | m_FillOrigin: 0 290 | m_UseSpriteMesh: 0 291 | m_PixelsPerUnitMultiplier: 1 292 | --- !u!222 &240305142 293 | CanvasRenderer: 294 | m_ObjectHideFlags: 0 295 | m_CorrespondingSourceObject: {fileID: 0} 296 | m_PrefabInstance: {fileID: 0} 297 | m_PrefabAsset: {fileID: 0} 298 | m_GameObject: {fileID: 240305138} 299 | m_CullTransparentMesh: 0 300 | --- !u!1 &858578204 301 | GameObject: 302 | m_ObjectHideFlags: 0 303 | m_CorrespondingSourceObject: {fileID: 0} 304 | m_PrefabInstance: {fileID: 0} 305 | m_PrefabAsset: {fileID: 0} 306 | serializedVersion: 6 307 | m_Component: 308 | - component: {fileID: 858578205} 309 | - component: {fileID: 858578207} 310 | - component: {fileID: 858578206} 311 | m_Layer: 5 312 | m_Name: Content 313 | m_TagString: Untagged 314 | m_Icon: {fileID: 0} 315 | m_NavMeshLayer: 0 316 | m_StaticEditorFlags: 0 317 | m_IsActive: 1 318 | --- !u!224 &858578205 319 | RectTransform: 320 | m_ObjectHideFlags: 0 321 | m_CorrespondingSourceObject: {fileID: 0} 322 | m_PrefabInstance: {fileID: 0} 323 | m_PrefabAsset: {fileID: 0} 324 | m_GameObject: {fileID: 858578204} 325 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 326 | m_LocalPosition: {x: 0, y: 0, z: 0} 327 | m_LocalScale: {x: 1, y: 1, z: 1} 328 | m_Children: [] 329 | m_Father: {fileID: 240305139} 330 | m_RootOrder: 0 331 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 332 | m_AnchorMin: {x: 0, y: 1} 333 | m_AnchorMax: {x: 0, y: 1} 334 | m_AnchoredPosition: {x: 0, y: 0} 335 | m_SizeDelta: {x: 0, y: 0} 336 | m_Pivot: {x: 0, y: 1} 337 | --- !u!114 &858578206 338 | MonoBehaviour: 339 | m_ObjectHideFlags: 0 340 | m_CorrespondingSourceObject: {fileID: 0} 341 | m_PrefabInstance: {fileID: 0} 342 | m_PrefabAsset: {fileID: 0} 343 | m_GameObject: {fileID: 858578204} 344 | m_Enabled: 1 345 | m_EditorHideFlags: 0 346 | m_Script: {fileID: 11500000, guid: 5ec79269c82ff7a4f91d4bbf3f96d223, type: 3} 347 | m_Name: 348 | m_EditorClassIdentifier: 349 | m_Padding: 350 | m_Left: 0 351 | m_Right: 0 352 | m_Top: 0 353 | m_Bottom: 0 354 | m_ChildAlignment: 0 355 | m_StartCorner: 0 356 | m_StartAxis: 0 357 | m_CellSize: {x: 100, y: 127.28} 358 | m_Spacing: {x: 10, y: 10} 359 | m_Constraint: 1 360 | m_ConstraintCount: 1 361 | --- !u!114 &858578207 362 | MonoBehaviour: 363 | m_ObjectHideFlags: 0 364 | m_CorrespondingSourceObject: {fileID: 0} 365 | m_PrefabInstance: {fileID: 0} 366 | m_PrefabAsset: {fileID: 0} 367 | m_GameObject: {fileID: 858578204} 368 | m_Enabled: 1 369 | m_EditorHideFlags: 0 370 | m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} 371 | m_Name: 372 | m_EditorClassIdentifier: 373 | m_HorizontalFit: 2 374 | m_VerticalFit: 2 375 | --- !u!1 &963194225 376 | GameObject: 377 | m_ObjectHideFlags: 0 378 | m_CorrespondingSourceObject: {fileID: 0} 379 | m_PrefabInstance: {fileID: 0} 380 | m_PrefabAsset: {fileID: 0} 381 | serializedVersion: 6 382 | m_Component: 383 | - component: {fileID: 963194228} 384 | - component: {fileID: 963194227} 385 | - component: {fileID: 963194226} 386 | m_Layer: 0 387 | m_Name: Main Camera 388 | m_TagString: MainCamera 389 | m_Icon: {fileID: 0} 390 | m_NavMeshLayer: 0 391 | m_StaticEditorFlags: 0 392 | m_IsActive: 1 393 | --- !u!81 &963194226 394 | AudioListener: 395 | m_ObjectHideFlags: 0 396 | m_CorrespondingSourceObject: {fileID: 0} 397 | m_PrefabInstance: {fileID: 0} 398 | m_PrefabAsset: {fileID: 0} 399 | m_GameObject: {fileID: 963194225} 400 | m_Enabled: 1 401 | --- !u!20 &963194227 402 | Camera: 403 | m_ObjectHideFlags: 0 404 | m_CorrespondingSourceObject: {fileID: 0} 405 | m_PrefabInstance: {fileID: 0} 406 | m_PrefabAsset: {fileID: 0} 407 | m_GameObject: {fileID: 963194225} 408 | m_Enabled: 1 409 | serializedVersion: 2 410 | m_ClearFlags: 2 411 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 412 | m_projectionMatrixMode: 1 413 | m_GateFitMode: 2 414 | m_FOVAxisMode: 0 415 | m_SensorSize: {x: 36, y: 24} 416 | m_LensShift: {x: 0, y: 0} 417 | m_FocalLength: 50 418 | m_NormalizedViewPortRect: 419 | serializedVersion: 2 420 | x: 0 421 | y: 0 422 | width: 1 423 | height: 1 424 | near clip plane: 0.3 425 | far clip plane: 1000 426 | field of view: 60 427 | orthographic: 1 428 | orthographic size: 5 429 | m_Depth: -1 430 | m_CullingMask: 431 | serializedVersion: 2 432 | m_Bits: 4294967295 433 | m_RenderingPath: -1 434 | m_TargetTexture: {fileID: 0} 435 | m_TargetDisplay: 0 436 | m_TargetEye: 3 437 | m_HDR: 1 438 | m_AllowMSAA: 1 439 | m_AllowDynamicResolution: 0 440 | m_ForceIntoRT: 0 441 | m_OcclusionCulling: 1 442 | m_StereoConvergence: 10 443 | m_StereoSeparation: 0.022 444 | --- !u!4 &963194228 445 | Transform: 446 | m_ObjectHideFlags: 0 447 | m_CorrespondingSourceObject: {fileID: 0} 448 | m_PrefabInstance: {fileID: 0} 449 | m_PrefabAsset: {fileID: 0} 450 | m_GameObject: {fileID: 963194225} 451 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 452 | m_LocalPosition: {x: 0, y: 1, z: -10} 453 | m_LocalScale: {x: 1, y: 1, z: 1} 454 | m_Children: [] 455 | m_Father: {fileID: 0} 456 | m_RootOrder: 0 457 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 458 | --- !u!1 &998288812 459 | GameObject: 460 | m_ObjectHideFlags: 0 461 | m_CorrespondingSourceObject: {fileID: 0} 462 | m_PrefabInstance: {fileID: 0} 463 | m_PrefabAsset: {fileID: 0} 464 | serializedVersion: 6 465 | m_Component: 466 | - component: {fileID: 998288813} 467 | - component: {fileID: 998288816} 468 | - component: {fileID: 998288815} 469 | - component: {fileID: 998288814} 470 | m_Layer: 5 471 | m_Name: AddCellBtn 472 | m_TagString: Untagged 473 | m_Icon: {fileID: 0} 474 | m_NavMeshLayer: 0 475 | m_StaticEditorFlags: 0 476 | m_IsActive: 1 477 | --- !u!224 &998288813 478 | RectTransform: 479 | m_ObjectHideFlags: 0 480 | m_CorrespondingSourceObject: {fileID: 0} 481 | m_PrefabInstance: {fileID: 0} 482 | m_PrefabAsset: {fileID: 0} 483 | m_GameObject: {fileID: 998288812} 484 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 485 | m_LocalPosition: {x: 0, y: 0, z: 0} 486 | m_LocalScale: {x: 1, y: 1, z: 1} 487 | m_Children: 488 | - {fileID: 1691066859} 489 | m_Father: {fileID: 1621698413} 490 | m_RootOrder: 1 491 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 492 | m_AnchorMin: {x: 0.5, y: 0.5} 493 | m_AnchorMax: {x: 0.5, y: 0.5} 494 | m_AnchoredPosition: {x: 528, y: -143} 495 | m_SizeDelta: {x: 160, y: 30} 496 | m_Pivot: {x: 0.5, y: 0.5} 497 | --- !u!114 &998288814 498 | MonoBehaviour: 499 | m_ObjectHideFlags: 0 500 | m_CorrespondingSourceObject: {fileID: 0} 501 | m_PrefabInstance: {fileID: 0} 502 | m_PrefabAsset: {fileID: 0} 503 | m_GameObject: {fileID: 998288812} 504 | m_Enabled: 1 505 | m_EditorHideFlags: 0 506 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 507 | m_Name: 508 | m_EditorClassIdentifier: 509 | m_Navigation: 510 | m_Mode: 3 511 | m_SelectOnUp: {fileID: 0} 512 | m_SelectOnDown: {fileID: 0} 513 | m_SelectOnLeft: {fileID: 0} 514 | m_SelectOnRight: {fileID: 0} 515 | m_Transition: 1 516 | m_Colors: 517 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 518 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 519 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 520 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 521 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 522 | m_ColorMultiplier: 1 523 | m_FadeDuration: 0.1 524 | m_SpriteState: 525 | m_HighlightedSprite: {fileID: 0} 526 | m_PressedSprite: {fileID: 0} 527 | m_SelectedSprite: {fileID: 0} 528 | m_DisabledSprite: {fileID: 0} 529 | m_AnimationTriggers: 530 | m_NormalTrigger: Normal 531 | m_HighlightedTrigger: Highlighted 532 | m_PressedTrigger: Pressed 533 | m_SelectedTrigger: Selected 534 | m_DisabledTrigger: Disabled 535 | m_Interactable: 1 536 | m_TargetGraphic: {fileID: 998288815} 537 | m_OnClick: 538 | m_PersistentCalls: 539 | m_Calls: [] 540 | --- !u!114 &998288815 541 | MonoBehaviour: 542 | m_ObjectHideFlags: 0 543 | m_CorrespondingSourceObject: {fileID: 0} 544 | m_PrefabInstance: {fileID: 0} 545 | m_PrefabAsset: {fileID: 0} 546 | m_GameObject: {fileID: 998288812} 547 | m_Enabled: 1 548 | m_EditorHideFlags: 0 549 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 550 | m_Name: 551 | m_EditorClassIdentifier: 552 | m_Material: {fileID: 0} 553 | m_Color: {r: 1, g: 1, b: 1, a: 1} 554 | m_RaycastTarget: 1 555 | m_OnCullStateChanged: 556 | m_PersistentCalls: 557 | m_Calls: [] 558 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 559 | m_Type: 1 560 | m_PreserveAspect: 0 561 | m_FillCenter: 1 562 | m_FillMethod: 4 563 | m_FillAmount: 1 564 | m_FillClockwise: 1 565 | m_FillOrigin: 0 566 | m_UseSpriteMesh: 0 567 | m_PixelsPerUnitMultiplier: 1 568 | --- !u!222 &998288816 569 | CanvasRenderer: 570 | m_ObjectHideFlags: 0 571 | m_CorrespondingSourceObject: {fileID: 0} 572 | m_PrefabInstance: {fileID: 0} 573 | m_PrefabAsset: {fileID: 0} 574 | m_GameObject: {fileID: 998288812} 575 | m_CullTransparentMesh: 0 576 | --- !u!1 &1026782657 577 | GameObject: 578 | m_ObjectHideFlags: 0 579 | m_CorrespondingSourceObject: {fileID: 0} 580 | m_PrefabInstance: {fileID: 0} 581 | m_PrefabAsset: {fileID: 0} 582 | serializedVersion: 6 583 | m_Component: 584 | - component: {fileID: 1026782658} 585 | - component: {fileID: 1026782661} 586 | - component: {fileID: 1026782660} 587 | - component: {fileID: 1026782659} 588 | m_Layer: 5 589 | m_Name: Viewport 590 | m_TagString: Untagged 591 | m_Icon: {fileID: 0} 592 | m_NavMeshLayer: 0 593 | m_StaticEditorFlags: 0 594 | m_IsActive: 1 595 | --- !u!224 &1026782658 596 | RectTransform: 597 | m_ObjectHideFlags: 0 598 | m_CorrespondingSourceObject: {fileID: 0} 599 | m_PrefabInstance: {fileID: 0} 600 | m_PrefabAsset: {fileID: 0} 601 | m_GameObject: {fileID: 1026782657} 602 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 603 | m_LocalPosition: {x: 0, y: 0, z: 0} 604 | m_LocalScale: {x: 1, y: 1, z: 1} 605 | m_Children: 606 | - {fileID: 1227782315} 607 | m_Father: {fileID: 1841724984} 608 | m_RootOrder: 0 609 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 610 | m_AnchorMin: {x: 0, y: 0} 611 | m_AnchorMax: {x: 1, y: 1} 612 | m_AnchoredPosition: {x: 0, y: 0} 613 | m_SizeDelta: {x: 0, y: 0} 614 | m_Pivot: {x: 0, y: 1} 615 | --- !u!114 &1026782659 616 | MonoBehaviour: 617 | m_ObjectHideFlags: 0 618 | m_CorrespondingSourceObject: {fileID: 0} 619 | m_PrefabInstance: {fileID: 0} 620 | m_PrefabAsset: {fileID: 0} 621 | m_GameObject: {fileID: 1026782657} 622 | m_Enabled: 1 623 | m_EditorHideFlags: 0 624 | m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} 625 | m_Name: 626 | m_EditorClassIdentifier: 627 | m_ShowMaskGraphic: 0 628 | --- !u!114 &1026782660 629 | MonoBehaviour: 630 | m_ObjectHideFlags: 0 631 | m_CorrespondingSourceObject: {fileID: 0} 632 | m_PrefabInstance: {fileID: 0} 633 | m_PrefabAsset: {fileID: 0} 634 | m_GameObject: {fileID: 1026782657} 635 | m_Enabled: 1 636 | m_EditorHideFlags: 0 637 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 638 | m_Name: 639 | m_EditorClassIdentifier: 640 | m_Material: {fileID: 0} 641 | m_Color: {r: 1, g: 1, b: 1, a: 1} 642 | m_RaycastTarget: 1 643 | m_OnCullStateChanged: 644 | m_PersistentCalls: 645 | m_Calls: [] 646 | m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} 647 | m_Type: 1 648 | m_PreserveAspect: 0 649 | m_FillCenter: 1 650 | m_FillMethod: 4 651 | m_FillAmount: 1 652 | m_FillClockwise: 1 653 | m_FillOrigin: 0 654 | m_UseSpriteMesh: 0 655 | m_PixelsPerUnitMultiplier: 1 656 | --- !u!222 &1026782661 657 | CanvasRenderer: 658 | m_ObjectHideFlags: 0 659 | m_CorrespondingSourceObject: {fileID: 0} 660 | m_PrefabInstance: {fileID: 0} 661 | m_PrefabAsset: {fileID: 0} 662 | m_GameObject: {fileID: 1026782657} 663 | m_CullTransparentMesh: 0 664 | --- !u!1 &1043046526 665 | GameObject: 666 | m_ObjectHideFlags: 0 667 | m_CorrespondingSourceObject: {fileID: 0} 668 | m_PrefabInstance: {fileID: 0} 669 | m_PrefabAsset: {fileID: 0} 670 | serializedVersion: 6 671 | m_Component: 672 | - component: {fileID: 1043046527} 673 | - component: {fileID: 1043046532} 674 | - component: {fileID: 1043046531} 675 | - component: {fileID: 1043046530} 676 | - component: {fileID: 1043046529} 677 | - component: {fileID: 1043046528} 678 | m_Layer: 5 679 | m_Name: GridExample 680 | m_TagString: Untagged 681 | m_Icon: {fileID: 0} 682 | m_NavMeshLayer: 0 683 | m_StaticEditorFlags: 0 684 | m_IsActive: 1 685 | --- !u!224 &1043046527 686 | RectTransform: 687 | m_ObjectHideFlags: 0 688 | m_CorrespondingSourceObject: {fileID: 0} 689 | m_PrefabInstance: {fileID: 0} 690 | m_PrefabAsset: {fileID: 0} 691 | m_GameObject: {fileID: 1043046526} 692 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 693 | m_LocalPosition: {x: 0, y: 0, z: 0} 694 | m_LocalScale: {x: 1, y: 1, z: 1} 695 | m_Children: 696 | - {fileID: 240305139} 697 | m_Father: {fileID: 1621698413} 698 | m_RootOrder: 4 699 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 700 | m_AnchorMin: {x: 0.5, y: 0.5} 701 | m_AnchorMax: {x: 0.5, y: 0.5} 702 | m_AnchoredPosition: {x: 237, y: 0} 703 | m_SizeDelta: {x: 100, y: 347.2} 704 | m_Pivot: {x: 0.5, y: 0.5} 705 | --- !u!114 &1043046528 706 | MonoBehaviour: 707 | m_ObjectHideFlags: 0 708 | m_CorrespondingSourceObject: {fileID: 0} 709 | m_PrefabInstance: {fileID: 0} 710 | m_PrefabAsset: {fileID: 0} 711 | m_GameObject: {fileID: 1043046526} 712 | m_Enabled: 1 713 | m_EditorHideFlags: 0 714 | m_Script: {fileID: 11500000, guid: bb690b6be6b3585468a1c84a3a8b1d10, type: 3} 715 | m_Name: 716 | m_EditorClassIdentifier: 717 | TestTrans: {fileID: 5762688573346229536, guid: dba2a0d09293e594398acd2acd15abbc, 718 | type: 3} 719 | TestAddCellBtn: {fileID: 998288814} 720 | TestFocusBtn: {fileID: 1286330600} 721 | modelType: 2 722 | --- !u!114 &1043046529 723 | MonoBehaviour: 724 | m_ObjectHideFlags: 0 725 | m_CorrespondingSourceObject: {fileID: 0} 726 | m_PrefabInstance: {fileID: 0} 727 | m_PrefabAsset: {fileID: 0} 728 | m_GameObject: {fileID: 1043046526} 729 | m_Enabled: 1 730 | m_EditorHideFlags: 0 731 | m_Script: {fileID: 11500000, guid: fe6a2f507d8634749a4b054de1f4aac9, type: 3} 732 | m_Name: 733 | m_EditorClassIdentifier: 734 | --- !u!114 &1043046530 735 | MonoBehaviour: 736 | m_ObjectHideFlags: 0 737 | m_CorrespondingSourceObject: {fileID: 0} 738 | m_PrefabInstance: {fileID: 0} 739 | m_PrefabAsset: {fileID: 0} 740 | m_GameObject: {fileID: 1043046526} 741 | m_Enabled: 1 742 | m_EditorHideFlags: 0 743 | m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} 744 | m_Name: 745 | m_EditorClassIdentifier: 746 | m_Content: {fileID: 858578205} 747 | m_Horizontal: 0 748 | m_Vertical: 1 749 | m_MovementType: 1 750 | m_Elasticity: 0.1 751 | m_Inertia: 1 752 | m_DecelerationRate: 0.135 753 | m_ScrollSensitivity: 1 754 | m_Viewport: {fileID: 240305139} 755 | m_HorizontalScrollbar: {fileID: 0} 756 | m_VerticalScrollbar: {fileID: 0} 757 | m_HorizontalScrollbarVisibility: 2 758 | m_VerticalScrollbarVisibility: 2 759 | m_HorizontalScrollbarSpacing: -3 760 | m_VerticalScrollbarSpacing: -3 761 | m_OnValueChanged: 762 | m_PersistentCalls: 763 | m_Calls: [] 764 | --- !u!114 &1043046531 765 | MonoBehaviour: 766 | m_ObjectHideFlags: 0 767 | m_CorrespondingSourceObject: {fileID: 0} 768 | m_PrefabInstance: {fileID: 0} 769 | m_PrefabAsset: {fileID: 0} 770 | m_GameObject: {fileID: 1043046526} 771 | m_Enabled: 1 772 | m_EditorHideFlags: 0 773 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 774 | m_Name: 775 | m_EditorClassIdentifier: 776 | m_Material: {fileID: 0} 777 | m_Color: {r: 1, g: 1, b: 1, a: 0.392} 778 | m_RaycastTarget: 1 779 | m_OnCullStateChanged: 780 | m_PersistentCalls: 781 | m_Calls: [] 782 | m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} 783 | m_Type: 1 784 | m_PreserveAspect: 0 785 | m_FillCenter: 1 786 | m_FillMethod: 4 787 | m_FillAmount: 1 788 | m_FillClockwise: 1 789 | m_FillOrigin: 0 790 | m_UseSpriteMesh: 0 791 | m_PixelsPerUnitMultiplier: 1 792 | --- !u!222 &1043046532 793 | CanvasRenderer: 794 | m_ObjectHideFlags: 0 795 | m_CorrespondingSourceObject: {fileID: 0} 796 | m_PrefabInstance: {fileID: 0} 797 | m_PrefabAsset: {fileID: 0} 798 | m_GameObject: {fileID: 1043046526} 799 | m_CullTransparentMesh: 0 800 | --- !u!1 &1077929771 801 | GameObject: 802 | m_ObjectHideFlags: 0 803 | m_CorrespondingSourceObject: {fileID: 0} 804 | m_PrefabInstance: {fileID: 0} 805 | m_PrefabAsset: {fileID: 0} 806 | serializedVersion: 6 807 | m_Component: 808 | - component: {fileID: 1077929772} 809 | - component: {fileID: 1077929777} 810 | - component: {fileID: 1077929776} 811 | - component: {fileID: 1077929775} 812 | - component: {fileID: 1077929774} 813 | - component: {fileID: 1077929773} 814 | m_Layer: 5 815 | m_Name: HorizontalExample 816 | m_TagString: Untagged 817 | m_Icon: {fileID: 0} 818 | m_NavMeshLayer: 0 819 | m_StaticEditorFlags: 0 820 | m_IsActive: 1 821 | --- !u!224 &1077929772 822 | RectTransform: 823 | m_ObjectHideFlags: 0 824 | m_CorrespondingSourceObject: {fileID: 0} 825 | m_PrefabInstance: {fileID: 0} 826 | m_PrefabAsset: {fileID: 0} 827 | m_GameObject: {fileID: 1077929771} 828 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 829 | m_LocalPosition: {x: 0, y: 0, z: 0} 830 | m_LocalScale: {x: 1, y: 1, z: 1} 831 | m_Children: 832 | - {fileID: 149825292} 833 | m_Father: {fileID: 1621698413} 834 | m_RootOrder: 3 835 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 836 | m_AnchorMin: {x: 0.5, y: 0.5} 837 | m_AnchorMax: {x: 0.5, y: 0.5} 838 | m_AnchoredPosition: {x: -307, y: -110.88} 839 | m_SizeDelta: {x: 390.3, y: 134} 840 | m_Pivot: {x: 0.5, y: 0.5} 841 | --- !u!114 &1077929773 842 | MonoBehaviour: 843 | m_ObjectHideFlags: 0 844 | m_CorrespondingSourceObject: {fileID: 0} 845 | m_PrefabInstance: {fileID: 0} 846 | m_PrefabAsset: {fileID: 0} 847 | m_GameObject: {fileID: 1077929771} 848 | m_Enabled: 1 849 | m_EditorHideFlags: 0 850 | m_Script: {fileID: 11500000, guid: bb690b6be6b3585468a1c84a3a8b1d10, type: 3} 851 | m_Name: 852 | m_EditorClassIdentifier: 853 | TestTrans: {fileID: 322446251261123542, guid: 4b71cecaca67f6343a8f495e370dab93, 854 | type: 3} 855 | TestAddCellBtn: {fileID: 998288814} 856 | TestFocusBtn: {fileID: 1286330600} 857 | modelType: 1 858 | --- !u!114 &1077929774 859 | MonoBehaviour: 860 | m_ObjectHideFlags: 0 861 | m_CorrespondingSourceObject: {fileID: 0} 862 | m_PrefabInstance: {fileID: 0} 863 | m_PrefabAsset: {fileID: 0} 864 | m_GameObject: {fileID: 1077929771} 865 | m_Enabled: 1 866 | m_EditorHideFlags: 0 867 | m_Script: {fileID: 11500000, guid: fe6a2f507d8634749a4b054de1f4aac9, type: 3} 868 | m_Name: 869 | m_EditorClassIdentifier: 870 | --- !u!114 &1077929775 871 | MonoBehaviour: 872 | m_ObjectHideFlags: 0 873 | m_CorrespondingSourceObject: {fileID: 0} 874 | m_PrefabInstance: {fileID: 0} 875 | m_PrefabAsset: {fileID: 0} 876 | m_GameObject: {fileID: 1077929771} 877 | m_Enabled: 1 878 | m_EditorHideFlags: 0 879 | m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} 880 | m_Name: 881 | m_EditorClassIdentifier: 882 | m_Content: {fileID: 1688140172} 883 | m_Horizontal: 1 884 | m_Vertical: 0 885 | m_MovementType: 1 886 | m_Elasticity: 0.1 887 | m_Inertia: 1 888 | m_DecelerationRate: 0.135 889 | m_ScrollSensitivity: 1 890 | m_Viewport: {fileID: 149825292} 891 | m_HorizontalScrollbar: {fileID: 0} 892 | m_VerticalScrollbar: {fileID: 0} 893 | m_HorizontalScrollbarVisibility: 2 894 | m_VerticalScrollbarVisibility: 2 895 | m_HorizontalScrollbarSpacing: -3 896 | m_VerticalScrollbarSpacing: -3 897 | m_OnValueChanged: 898 | m_PersistentCalls: 899 | m_Calls: [] 900 | --- !u!114 &1077929776 901 | MonoBehaviour: 902 | m_ObjectHideFlags: 0 903 | m_CorrespondingSourceObject: {fileID: 0} 904 | m_PrefabInstance: {fileID: 0} 905 | m_PrefabAsset: {fileID: 0} 906 | m_GameObject: {fileID: 1077929771} 907 | m_Enabled: 1 908 | m_EditorHideFlags: 0 909 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 910 | m_Name: 911 | m_EditorClassIdentifier: 912 | m_Material: {fileID: 0} 913 | m_Color: {r: 1, g: 1, b: 1, a: 0.392} 914 | m_RaycastTarget: 1 915 | m_OnCullStateChanged: 916 | m_PersistentCalls: 917 | m_Calls: [] 918 | m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} 919 | m_Type: 1 920 | m_PreserveAspect: 0 921 | m_FillCenter: 1 922 | m_FillMethod: 4 923 | m_FillAmount: 1 924 | m_FillClockwise: 1 925 | m_FillOrigin: 0 926 | m_UseSpriteMesh: 0 927 | m_PixelsPerUnitMultiplier: 1 928 | --- !u!222 &1077929777 929 | CanvasRenderer: 930 | m_ObjectHideFlags: 0 931 | m_CorrespondingSourceObject: {fileID: 0} 932 | m_PrefabInstance: {fileID: 0} 933 | m_PrefabAsset: {fileID: 0} 934 | m_GameObject: {fileID: 1077929771} 935 | m_CullTransparentMesh: 0 936 | --- !u!1 &1227782314 937 | GameObject: 938 | m_ObjectHideFlags: 0 939 | m_CorrespondingSourceObject: {fileID: 0} 940 | m_PrefabInstance: {fileID: 0} 941 | m_PrefabAsset: {fileID: 0} 942 | serializedVersion: 6 943 | m_Component: 944 | - component: {fileID: 1227782315} 945 | - component: {fileID: 1227782317} 946 | - component: {fileID: 1227782316} 947 | m_Layer: 5 948 | m_Name: Content 949 | m_TagString: Untagged 950 | m_Icon: {fileID: 0} 951 | m_NavMeshLayer: 0 952 | m_StaticEditorFlags: 0 953 | m_IsActive: 1 954 | --- !u!224 &1227782315 955 | RectTransform: 956 | m_ObjectHideFlags: 0 957 | m_CorrespondingSourceObject: {fileID: 0} 958 | m_PrefabInstance: {fileID: 0} 959 | m_PrefabAsset: {fileID: 0} 960 | m_GameObject: {fileID: 1227782314} 961 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 962 | m_LocalPosition: {x: 0, y: 0, z: 0} 963 | m_LocalScale: {x: 1, y: 1, z: 1} 964 | m_Children: [] 965 | m_Father: {fileID: 1026782658} 966 | m_RootOrder: 0 967 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 968 | m_AnchorMin: {x: 0, y: 1} 969 | m_AnchorMax: {x: 0, y: 1} 970 | m_AnchoredPosition: {x: 0, y: 0} 971 | m_SizeDelta: {x: 390.3, y: 0} 972 | m_Pivot: {x: 0, y: 1} 973 | --- !u!114 &1227782316 974 | MonoBehaviour: 975 | m_ObjectHideFlags: 0 976 | m_CorrespondingSourceObject: {fileID: 0} 977 | m_PrefabInstance: {fileID: 0} 978 | m_PrefabAsset: {fileID: 0} 979 | m_GameObject: {fileID: 1227782314} 980 | m_Enabled: 1 981 | m_EditorHideFlags: 0 982 | m_Script: {fileID: 11500000, guid: ff079320a7e57134baabc494417bdac8, type: 3} 983 | m_Name: 984 | m_EditorClassIdentifier: 985 | m_Padding: 986 | m_Left: 0 987 | m_Right: 0 988 | m_Top: 0 989 | m_Bottom: 0 990 | m_ChildAlignment: 0 991 | m_Spacing: 10 992 | m_ChildForceExpandWidth: 0 993 | m_ChildForceExpandHeight: 0 994 | m_ChildControlWidth: 0 995 | m_ChildControlHeight: 1 996 | m_ChildScaleWidth: 0 997 | m_ChildScaleHeight: 0 998 | --- !u!114 &1227782317 999 | MonoBehaviour: 1000 | m_ObjectHideFlags: 0 1001 | m_CorrespondingSourceObject: {fileID: 0} 1002 | m_PrefabInstance: {fileID: 0} 1003 | m_PrefabAsset: {fileID: 0} 1004 | m_GameObject: {fileID: 1227782314} 1005 | m_Enabled: 1 1006 | m_EditorHideFlags: 0 1007 | m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} 1008 | m_Name: 1009 | m_EditorClassIdentifier: 1010 | m_HorizontalFit: 0 1011 | m_VerticalFit: 2 1012 | --- !u!1 &1286330598 1013 | GameObject: 1014 | m_ObjectHideFlags: 0 1015 | m_CorrespondingSourceObject: {fileID: 0} 1016 | m_PrefabInstance: {fileID: 0} 1017 | m_PrefabAsset: {fileID: 0} 1018 | serializedVersion: 6 1019 | m_Component: 1020 | - component: {fileID: 1286330599} 1021 | - component: {fileID: 1286330602} 1022 | - component: {fileID: 1286330601} 1023 | - component: {fileID: 1286330600} 1024 | m_Layer: 5 1025 | m_Name: ScrollToIndexBtn 1026 | m_TagString: Untagged 1027 | m_Icon: {fileID: 0} 1028 | m_NavMeshLayer: 0 1029 | m_StaticEditorFlags: 0 1030 | m_IsActive: 1 1031 | --- !u!224 &1286330599 1032 | RectTransform: 1033 | m_ObjectHideFlags: 0 1034 | m_CorrespondingSourceObject: {fileID: 0} 1035 | m_PrefabInstance: {fileID: 0} 1036 | m_PrefabAsset: {fileID: 0} 1037 | m_GameObject: {fileID: 1286330598} 1038 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1039 | m_LocalPosition: {x: 0, y: 0, z: 0} 1040 | m_LocalScale: {x: 1, y: 1, z: 1} 1041 | m_Children: 1042 | - {fileID: 1792531645} 1043 | m_Father: {fileID: 1621698413} 1044 | m_RootOrder: 2 1045 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1046 | m_AnchorMin: {x: 0.5, y: 0.5} 1047 | m_AnchorMax: {x: 0.5, y: 0.5} 1048 | m_AnchoredPosition: {x: 528, y: -94.5} 1049 | m_SizeDelta: {x: 160, y: 30} 1050 | m_Pivot: {x: 0.5, y: 0.5} 1051 | --- !u!114 &1286330600 1052 | MonoBehaviour: 1053 | m_ObjectHideFlags: 0 1054 | m_CorrespondingSourceObject: {fileID: 0} 1055 | m_PrefabInstance: {fileID: 0} 1056 | m_PrefabAsset: {fileID: 0} 1057 | m_GameObject: {fileID: 1286330598} 1058 | m_Enabled: 1 1059 | m_EditorHideFlags: 0 1060 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 1061 | m_Name: 1062 | m_EditorClassIdentifier: 1063 | m_Navigation: 1064 | m_Mode: 3 1065 | m_SelectOnUp: {fileID: 0} 1066 | m_SelectOnDown: {fileID: 0} 1067 | m_SelectOnLeft: {fileID: 0} 1068 | m_SelectOnRight: {fileID: 0} 1069 | m_Transition: 1 1070 | m_Colors: 1071 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 1072 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1073 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 1074 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1075 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 1076 | m_ColorMultiplier: 1 1077 | m_FadeDuration: 0.1 1078 | m_SpriteState: 1079 | m_HighlightedSprite: {fileID: 0} 1080 | m_PressedSprite: {fileID: 0} 1081 | m_SelectedSprite: {fileID: 0} 1082 | m_DisabledSprite: {fileID: 0} 1083 | m_AnimationTriggers: 1084 | m_NormalTrigger: Normal 1085 | m_HighlightedTrigger: Highlighted 1086 | m_PressedTrigger: Pressed 1087 | m_SelectedTrigger: Selected 1088 | m_DisabledTrigger: Disabled 1089 | m_Interactable: 1 1090 | m_TargetGraphic: {fileID: 1286330601} 1091 | m_OnClick: 1092 | m_PersistentCalls: 1093 | m_Calls: [] 1094 | --- !u!114 &1286330601 1095 | MonoBehaviour: 1096 | m_ObjectHideFlags: 0 1097 | m_CorrespondingSourceObject: {fileID: 0} 1098 | m_PrefabInstance: {fileID: 0} 1099 | m_PrefabAsset: {fileID: 0} 1100 | m_GameObject: {fileID: 1286330598} 1101 | m_Enabled: 1 1102 | m_EditorHideFlags: 0 1103 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 1104 | m_Name: 1105 | m_EditorClassIdentifier: 1106 | m_Material: {fileID: 0} 1107 | m_Color: {r: 1, g: 1, b: 1, a: 1} 1108 | m_RaycastTarget: 1 1109 | m_OnCullStateChanged: 1110 | m_PersistentCalls: 1111 | m_Calls: [] 1112 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 1113 | m_Type: 1 1114 | m_PreserveAspect: 0 1115 | m_FillCenter: 1 1116 | m_FillMethod: 4 1117 | m_FillAmount: 1 1118 | m_FillClockwise: 1 1119 | m_FillOrigin: 0 1120 | m_UseSpriteMesh: 0 1121 | m_PixelsPerUnitMultiplier: 1 1122 | --- !u!222 &1286330602 1123 | CanvasRenderer: 1124 | m_ObjectHideFlags: 0 1125 | m_CorrespondingSourceObject: {fileID: 0} 1126 | m_PrefabInstance: {fileID: 0} 1127 | m_PrefabAsset: {fileID: 0} 1128 | m_GameObject: {fileID: 1286330598} 1129 | m_CullTransparentMesh: 0 1130 | --- !u!1 &1436397845 1131 | GameObject: 1132 | m_ObjectHideFlags: 0 1133 | m_CorrespondingSourceObject: {fileID: 0} 1134 | m_PrefabInstance: {fileID: 0} 1135 | m_PrefabAsset: {fileID: 0} 1136 | serializedVersion: 6 1137 | m_Component: 1138 | - component: {fileID: 1436397848} 1139 | - component: {fileID: 1436397847} 1140 | - component: {fileID: 1436397846} 1141 | m_Layer: 0 1142 | m_Name: EventSystem 1143 | m_TagString: Untagged 1144 | m_Icon: {fileID: 0} 1145 | m_NavMeshLayer: 0 1146 | m_StaticEditorFlags: 0 1147 | m_IsActive: 1 1148 | --- !u!114 &1436397846 1149 | MonoBehaviour: 1150 | m_ObjectHideFlags: 0 1151 | m_CorrespondingSourceObject: {fileID: 0} 1152 | m_PrefabInstance: {fileID: 0} 1153 | m_PrefabAsset: {fileID: 0} 1154 | m_GameObject: {fileID: 1436397845} 1155 | m_Enabled: 1 1156 | m_EditorHideFlags: 0 1157 | m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} 1158 | m_Name: 1159 | m_EditorClassIdentifier: 1160 | m_HorizontalAxis: Horizontal 1161 | m_VerticalAxis: Vertical 1162 | m_SubmitButton: Submit 1163 | m_CancelButton: Cancel 1164 | m_InputActionsPerSecond: 10 1165 | m_RepeatDelay: 0.5 1166 | m_ForceModuleActive: 0 1167 | --- !u!114 &1436397847 1168 | MonoBehaviour: 1169 | m_ObjectHideFlags: 0 1170 | m_CorrespondingSourceObject: {fileID: 0} 1171 | m_PrefabInstance: {fileID: 0} 1172 | m_PrefabAsset: {fileID: 0} 1173 | m_GameObject: {fileID: 1436397845} 1174 | m_Enabled: 1 1175 | m_EditorHideFlags: 0 1176 | m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} 1177 | m_Name: 1178 | m_EditorClassIdentifier: 1179 | m_FirstSelected: {fileID: 0} 1180 | m_sendNavigationEvents: 1 1181 | m_DragThreshold: 10 1182 | --- !u!4 &1436397848 1183 | Transform: 1184 | m_ObjectHideFlags: 0 1185 | m_CorrespondingSourceObject: {fileID: 0} 1186 | m_PrefabInstance: {fileID: 0} 1187 | m_PrefabAsset: {fileID: 0} 1188 | m_GameObject: {fileID: 1436397845} 1189 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1190 | m_LocalPosition: {x: 0, y: 0, z: 0} 1191 | m_LocalScale: {x: 1, y: 1, z: 1} 1192 | m_Children: [] 1193 | m_Father: {fileID: 0} 1194 | m_RootOrder: 2 1195 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1196 | --- !u!1 &1621698409 1197 | GameObject: 1198 | m_ObjectHideFlags: 0 1199 | m_CorrespondingSourceObject: {fileID: 0} 1200 | m_PrefabInstance: {fileID: 0} 1201 | m_PrefabAsset: {fileID: 0} 1202 | serializedVersion: 6 1203 | m_Component: 1204 | - component: {fileID: 1621698413} 1205 | - component: {fileID: 1621698412} 1206 | - component: {fileID: 1621698411} 1207 | - component: {fileID: 1621698410} 1208 | m_Layer: 5 1209 | m_Name: Canvas 1210 | m_TagString: Untagged 1211 | m_Icon: {fileID: 0} 1212 | m_NavMeshLayer: 0 1213 | m_StaticEditorFlags: 0 1214 | m_IsActive: 1 1215 | --- !u!114 &1621698410 1216 | MonoBehaviour: 1217 | m_ObjectHideFlags: 0 1218 | m_CorrespondingSourceObject: {fileID: 0} 1219 | m_PrefabInstance: {fileID: 0} 1220 | m_PrefabAsset: {fileID: 0} 1221 | m_GameObject: {fileID: 1621698409} 1222 | m_Enabled: 1 1223 | m_EditorHideFlags: 0 1224 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 1225 | m_Name: 1226 | m_EditorClassIdentifier: 1227 | m_IgnoreReversedGraphics: 1 1228 | m_BlockingObjects: 0 1229 | m_BlockingMask: 1230 | serializedVersion: 2 1231 | m_Bits: 4294967295 1232 | --- !u!114 &1621698411 1233 | MonoBehaviour: 1234 | m_ObjectHideFlags: 0 1235 | m_CorrespondingSourceObject: {fileID: 0} 1236 | m_PrefabInstance: {fileID: 0} 1237 | m_PrefabAsset: {fileID: 0} 1238 | m_GameObject: {fileID: 1621698409} 1239 | m_Enabled: 1 1240 | m_EditorHideFlags: 0 1241 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 1242 | m_Name: 1243 | m_EditorClassIdentifier: 1244 | m_UiScaleMode: 1 1245 | m_ReferencePixelsPerUnit: 100 1246 | m_ScaleFactor: 1 1247 | m_ReferenceResolution: {x: 1280, y: 720} 1248 | m_ScreenMatchMode: 0 1249 | m_MatchWidthOrHeight: 0 1250 | m_PhysicalUnit: 3 1251 | m_FallbackScreenDPI: 96 1252 | m_DefaultSpriteDPI: 96 1253 | m_DynamicPixelsPerUnit: 1 1254 | --- !u!223 &1621698412 1255 | Canvas: 1256 | m_ObjectHideFlags: 0 1257 | m_CorrespondingSourceObject: {fileID: 0} 1258 | m_PrefabInstance: {fileID: 0} 1259 | m_PrefabAsset: {fileID: 0} 1260 | m_GameObject: {fileID: 1621698409} 1261 | m_Enabled: 1 1262 | serializedVersion: 3 1263 | m_RenderMode: 1 1264 | m_Camera: {fileID: 963194227} 1265 | m_PlaneDistance: 100 1266 | m_PixelPerfect: 0 1267 | m_ReceivesEvents: 1 1268 | m_OverrideSorting: 0 1269 | m_OverridePixelPerfect: 0 1270 | m_SortingBucketNormalizedSize: 0 1271 | m_AdditionalShaderChannelsFlag: 0 1272 | m_SortingLayerID: 0 1273 | m_SortingOrder: 0 1274 | m_TargetDisplay: 0 1275 | --- !u!224 &1621698413 1276 | RectTransform: 1277 | m_ObjectHideFlags: 0 1278 | m_CorrespondingSourceObject: {fileID: 0} 1279 | m_PrefabInstance: {fileID: 0} 1280 | m_PrefabAsset: {fileID: 0} 1281 | m_GameObject: {fileID: 1621698409} 1282 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1283 | m_LocalPosition: {x: 0, y: 0, z: 0} 1284 | m_LocalScale: {x: 0, y: 0, z: 0} 1285 | m_Children: 1286 | - {fileID: 1841724984} 1287 | - {fileID: 998288813} 1288 | - {fileID: 1286330599} 1289 | - {fileID: 1077929772} 1290 | - {fileID: 1043046527} 1291 | m_Father: {fileID: 0} 1292 | m_RootOrder: 1 1293 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1294 | m_AnchorMin: {x: 0, y: 0} 1295 | m_AnchorMax: {x: 0, y: 0} 1296 | m_AnchoredPosition: {x: 0, y: 0} 1297 | m_SizeDelta: {x: 0, y: 0} 1298 | m_Pivot: {x: 0, y: 0} 1299 | --- !u!1 &1688140171 1300 | GameObject: 1301 | m_ObjectHideFlags: 0 1302 | m_CorrespondingSourceObject: {fileID: 0} 1303 | m_PrefabInstance: {fileID: 0} 1304 | m_PrefabAsset: {fileID: 0} 1305 | serializedVersion: 6 1306 | m_Component: 1307 | - component: {fileID: 1688140172} 1308 | - component: {fileID: 1688140174} 1309 | - component: {fileID: 1688140173} 1310 | m_Layer: 5 1311 | m_Name: Content 1312 | m_TagString: Untagged 1313 | m_Icon: {fileID: 0} 1314 | m_NavMeshLayer: 0 1315 | m_StaticEditorFlags: 0 1316 | m_IsActive: 1 1317 | --- !u!224 &1688140172 1318 | RectTransform: 1319 | m_ObjectHideFlags: 0 1320 | m_CorrespondingSourceObject: {fileID: 0} 1321 | m_PrefabInstance: {fileID: 0} 1322 | m_PrefabAsset: {fileID: 0} 1323 | m_GameObject: {fileID: 1688140171} 1324 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1325 | m_LocalPosition: {x: 0, y: 0, z: 0} 1326 | m_LocalScale: {x: 1, y: 1, z: 1} 1327 | m_Children: [] 1328 | m_Father: {fileID: 149825292} 1329 | m_RootOrder: 0 1330 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1331 | m_AnchorMin: {x: 0, y: 1} 1332 | m_AnchorMax: {x: 0, y: 1} 1333 | m_AnchoredPosition: {x: 0, y: 0} 1334 | m_SizeDelta: {x: 0, y: 134} 1335 | m_Pivot: {x: 0, y: 1} 1336 | --- !u!114 &1688140173 1337 | MonoBehaviour: 1338 | m_ObjectHideFlags: 0 1339 | m_CorrespondingSourceObject: {fileID: 0} 1340 | m_PrefabInstance: {fileID: 0} 1341 | m_PrefabAsset: {fileID: 0} 1342 | m_GameObject: {fileID: 1688140171} 1343 | m_Enabled: 1 1344 | m_EditorHideFlags: 0 1345 | m_Script: {fileID: 11500000, guid: d8ad7c72336558544a92d423a288a34d, type: 3} 1346 | m_Name: 1347 | m_EditorClassIdentifier: 1348 | m_Padding: 1349 | m_Left: 0 1350 | m_Right: 0 1351 | m_Top: 0 1352 | m_Bottom: 0 1353 | m_ChildAlignment: 0 1354 | m_Spacing: 10 1355 | m_ChildForceExpandWidth: 0 1356 | m_ChildForceExpandHeight: 0 1357 | m_ChildControlWidth: 1 1358 | m_ChildControlHeight: 1 1359 | m_ChildScaleWidth: 0 1360 | m_ChildScaleHeight: 0 1361 | --- !u!114 &1688140174 1362 | MonoBehaviour: 1363 | m_ObjectHideFlags: 0 1364 | m_CorrespondingSourceObject: {fileID: 0} 1365 | m_PrefabInstance: {fileID: 0} 1366 | m_PrefabAsset: {fileID: 0} 1367 | m_GameObject: {fileID: 1688140171} 1368 | m_Enabled: 1 1369 | m_EditorHideFlags: 0 1370 | m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} 1371 | m_Name: 1372 | m_EditorClassIdentifier: 1373 | m_HorizontalFit: 2 1374 | m_VerticalFit: 0 1375 | --- !u!1 &1691066858 1376 | GameObject: 1377 | m_ObjectHideFlags: 0 1378 | m_CorrespondingSourceObject: {fileID: 0} 1379 | m_PrefabInstance: {fileID: 0} 1380 | m_PrefabAsset: {fileID: 0} 1381 | serializedVersion: 6 1382 | m_Component: 1383 | - component: {fileID: 1691066859} 1384 | - component: {fileID: 1691066861} 1385 | - component: {fileID: 1691066860} 1386 | m_Layer: 5 1387 | m_Name: Text 1388 | m_TagString: Untagged 1389 | m_Icon: {fileID: 0} 1390 | m_NavMeshLayer: 0 1391 | m_StaticEditorFlags: 0 1392 | m_IsActive: 1 1393 | --- !u!224 &1691066859 1394 | RectTransform: 1395 | m_ObjectHideFlags: 0 1396 | m_CorrespondingSourceObject: {fileID: 0} 1397 | m_PrefabInstance: {fileID: 0} 1398 | m_PrefabAsset: {fileID: 0} 1399 | m_GameObject: {fileID: 1691066858} 1400 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1401 | m_LocalPosition: {x: 0, y: 0, z: 0} 1402 | m_LocalScale: {x: 1, y: 1, z: 1} 1403 | m_Children: [] 1404 | m_Father: {fileID: 998288813} 1405 | m_RootOrder: 0 1406 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1407 | m_AnchorMin: {x: 0, y: 0} 1408 | m_AnchorMax: {x: 1, y: 1} 1409 | m_AnchoredPosition: {x: 0, y: 0} 1410 | m_SizeDelta: {x: 0, y: 0} 1411 | m_Pivot: {x: 0.5, y: 0.5} 1412 | --- !u!114 &1691066860 1413 | MonoBehaviour: 1414 | m_ObjectHideFlags: 0 1415 | m_CorrespondingSourceObject: {fileID: 0} 1416 | m_PrefabInstance: {fileID: 0} 1417 | m_PrefabAsset: {fileID: 0} 1418 | m_GameObject: {fileID: 1691066858} 1419 | m_Enabled: 1 1420 | m_EditorHideFlags: 0 1421 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 1422 | m_Name: 1423 | m_EditorClassIdentifier: 1424 | m_Material: {fileID: 0} 1425 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 1426 | m_RaycastTarget: 1 1427 | m_OnCullStateChanged: 1428 | m_PersistentCalls: 1429 | m_Calls: [] 1430 | m_FontData: 1431 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 1432 | m_FontSize: 14 1433 | m_FontStyle: 0 1434 | m_BestFit: 0 1435 | m_MinSize: 10 1436 | m_MaxSize: 40 1437 | m_Alignment: 4 1438 | m_AlignByGeometry: 0 1439 | m_RichText: 1 1440 | m_HorizontalOverflow: 0 1441 | m_VerticalOverflow: 0 1442 | m_LineSpacing: 1 1443 | m_Text: 'AddCell 1444 | 1445 | ' 1446 | --- !u!222 &1691066861 1447 | CanvasRenderer: 1448 | m_ObjectHideFlags: 0 1449 | m_CorrespondingSourceObject: {fileID: 0} 1450 | m_PrefabInstance: {fileID: 0} 1451 | m_PrefabAsset: {fileID: 0} 1452 | m_GameObject: {fileID: 1691066858} 1453 | m_CullTransparentMesh: 0 1454 | --- !u!1 &1792531644 1455 | GameObject: 1456 | m_ObjectHideFlags: 0 1457 | m_CorrespondingSourceObject: {fileID: 0} 1458 | m_PrefabInstance: {fileID: 0} 1459 | m_PrefabAsset: {fileID: 0} 1460 | serializedVersion: 6 1461 | m_Component: 1462 | - component: {fileID: 1792531645} 1463 | - component: {fileID: 1792531647} 1464 | - component: {fileID: 1792531646} 1465 | m_Layer: 5 1466 | m_Name: Text 1467 | m_TagString: Untagged 1468 | m_Icon: {fileID: 0} 1469 | m_NavMeshLayer: 0 1470 | m_StaticEditorFlags: 0 1471 | m_IsActive: 1 1472 | --- !u!224 &1792531645 1473 | RectTransform: 1474 | m_ObjectHideFlags: 0 1475 | m_CorrespondingSourceObject: {fileID: 0} 1476 | m_PrefabInstance: {fileID: 0} 1477 | m_PrefabAsset: {fileID: 0} 1478 | m_GameObject: {fileID: 1792531644} 1479 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1480 | m_LocalPosition: {x: 0, y: 0, z: 0} 1481 | m_LocalScale: {x: 1, y: 1, z: 1} 1482 | m_Children: [] 1483 | m_Father: {fileID: 1286330599} 1484 | m_RootOrder: 0 1485 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1486 | m_AnchorMin: {x: 0, y: 0} 1487 | m_AnchorMax: {x: 1, y: 1} 1488 | m_AnchoredPosition: {x: 0, y: 0} 1489 | m_SizeDelta: {x: 0, y: 0} 1490 | m_Pivot: {x: 0.5, y: 0.5} 1491 | --- !u!114 &1792531646 1492 | MonoBehaviour: 1493 | m_ObjectHideFlags: 0 1494 | m_CorrespondingSourceObject: {fileID: 0} 1495 | m_PrefabInstance: {fileID: 0} 1496 | m_PrefabAsset: {fileID: 0} 1497 | m_GameObject: {fileID: 1792531644} 1498 | m_Enabled: 1 1499 | m_EditorHideFlags: 0 1500 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 1501 | m_Name: 1502 | m_EditorClassIdentifier: 1503 | m_Material: {fileID: 0} 1504 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 1505 | m_RaycastTarget: 1 1506 | m_OnCullStateChanged: 1507 | m_PersistentCalls: 1508 | m_Calls: [] 1509 | m_FontData: 1510 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 1511 | m_FontSize: 14 1512 | m_FontStyle: 0 1513 | m_BestFit: 0 1514 | m_MinSize: 10 1515 | m_MaxSize: 40 1516 | m_Alignment: 4 1517 | m_AlignByGeometry: 0 1518 | m_RichText: 1 1519 | m_HorizontalOverflow: 0 1520 | m_VerticalOverflow: 0 1521 | m_LineSpacing: 1 1522 | m_Text: ScrollToIndex 1523 | --- !u!222 &1792531647 1524 | CanvasRenderer: 1525 | m_ObjectHideFlags: 0 1526 | m_CorrespondingSourceObject: {fileID: 0} 1527 | m_PrefabInstance: {fileID: 0} 1528 | m_PrefabAsset: {fileID: 0} 1529 | m_GameObject: {fileID: 1792531644} 1530 | m_CullTransparentMesh: 0 1531 | --- !u!1 &1841724983 1532 | GameObject: 1533 | m_ObjectHideFlags: 0 1534 | m_CorrespondingSourceObject: {fileID: 0} 1535 | m_PrefabInstance: {fileID: 0} 1536 | m_PrefabAsset: {fileID: 0} 1537 | serializedVersion: 6 1538 | m_Component: 1539 | - component: {fileID: 1841724984} 1540 | - component: {fileID: 1841724989} 1541 | - component: {fileID: 1841724988} 1542 | - component: {fileID: 1841724987} 1543 | - component: {fileID: 1841724986} 1544 | - component: {fileID: 1841724985} 1545 | m_Layer: 5 1546 | m_Name: VerticalExample 1547 | m_TagString: Untagged 1548 | m_Icon: {fileID: 0} 1549 | m_NavMeshLayer: 0 1550 | m_StaticEditorFlags: 0 1551 | m_IsActive: 1 1552 | --- !u!224 &1841724984 1553 | RectTransform: 1554 | m_ObjectHideFlags: 0 1555 | m_CorrespondingSourceObject: {fileID: 0} 1556 | m_PrefabInstance: {fileID: 0} 1557 | m_PrefabAsset: {fileID: 0} 1558 | m_GameObject: {fileID: 1841724983} 1559 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1560 | m_LocalPosition: {x: 0, y: 0, z: 0} 1561 | m_LocalScale: {x: 1, y: 1, z: 1} 1562 | m_Children: 1563 | - {fileID: 1026782658} 1564 | m_Father: {fileID: 1621698413} 1565 | m_RootOrder: 0 1566 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1567 | m_AnchorMin: {x: 0.5, y: 0.5} 1568 | m_AnchorMax: {x: 0.5, y: 0.5} 1569 | m_AnchoredPosition: {x: -307, y: 176} 1570 | m_SizeDelta: {x: 390.3, y: 291.9} 1571 | m_Pivot: {x: 0.5, y: 0.5} 1572 | --- !u!114 &1841724985 1573 | MonoBehaviour: 1574 | m_ObjectHideFlags: 0 1575 | m_CorrespondingSourceObject: {fileID: 0} 1576 | m_PrefabInstance: {fileID: 0} 1577 | m_PrefabAsset: {fileID: 0} 1578 | m_GameObject: {fileID: 1841724983} 1579 | m_Enabled: 1 1580 | m_EditorHideFlags: 0 1581 | m_Script: {fileID: 11500000, guid: bb690b6be6b3585468a1c84a3a8b1d10, type: 3} 1582 | m_Name: 1583 | m_EditorClassIdentifier: 1584 | TestTrans: {fileID: 322446251261123542, guid: 67d7f1df812f6a24d86d1117944d112f, 1585 | type: 3} 1586 | TestAddCellBtn: {fileID: 998288814} 1587 | TestFocusBtn: {fileID: 1286330600} 1588 | modelType: 1 1589 | --- !u!114 &1841724986 1590 | MonoBehaviour: 1591 | m_ObjectHideFlags: 0 1592 | m_CorrespondingSourceObject: {fileID: 0} 1593 | m_PrefabInstance: {fileID: 0} 1594 | m_PrefabAsset: {fileID: 0} 1595 | m_GameObject: {fileID: 1841724983} 1596 | m_Enabled: 1 1597 | m_EditorHideFlags: 0 1598 | m_Script: {fileID: 11500000, guid: fe6a2f507d8634749a4b054de1f4aac9, type: 3} 1599 | m_Name: 1600 | m_EditorClassIdentifier: 1601 | --- !u!114 &1841724987 1602 | MonoBehaviour: 1603 | m_ObjectHideFlags: 0 1604 | m_CorrespondingSourceObject: {fileID: 0} 1605 | m_PrefabInstance: {fileID: 0} 1606 | m_PrefabAsset: {fileID: 0} 1607 | m_GameObject: {fileID: 1841724983} 1608 | m_Enabled: 1 1609 | m_EditorHideFlags: 0 1610 | m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} 1611 | m_Name: 1612 | m_EditorClassIdentifier: 1613 | m_Content: {fileID: 1227782315} 1614 | m_Horizontal: 0 1615 | m_Vertical: 1 1616 | m_MovementType: 1 1617 | m_Elasticity: 0.1 1618 | m_Inertia: 1 1619 | m_DecelerationRate: 0.135 1620 | m_ScrollSensitivity: 1 1621 | m_Viewport: {fileID: 1026782658} 1622 | m_HorizontalScrollbar: {fileID: 0} 1623 | m_VerticalScrollbar: {fileID: 0} 1624 | m_HorizontalScrollbarVisibility: 2 1625 | m_VerticalScrollbarVisibility: 2 1626 | m_HorizontalScrollbarSpacing: -3 1627 | m_VerticalScrollbarSpacing: -3 1628 | m_OnValueChanged: 1629 | m_PersistentCalls: 1630 | m_Calls: [] 1631 | --- !u!114 &1841724988 1632 | MonoBehaviour: 1633 | m_ObjectHideFlags: 0 1634 | m_CorrespondingSourceObject: {fileID: 0} 1635 | m_PrefabInstance: {fileID: 0} 1636 | m_PrefabAsset: {fileID: 0} 1637 | m_GameObject: {fileID: 1841724983} 1638 | m_Enabled: 1 1639 | m_EditorHideFlags: 0 1640 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 1641 | m_Name: 1642 | m_EditorClassIdentifier: 1643 | m_Material: {fileID: 0} 1644 | m_Color: {r: 1, g: 1, b: 1, a: 0.392} 1645 | m_RaycastTarget: 1 1646 | m_OnCullStateChanged: 1647 | m_PersistentCalls: 1648 | m_Calls: [] 1649 | m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} 1650 | m_Type: 1 1651 | m_PreserveAspect: 0 1652 | m_FillCenter: 1 1653 | m_FillMethod: 4 1654 | m_FillAmount: 1 1655 | m_FillClockwise: 1 1656 | m_FillOrigin: 0 1657 | m_UseSpriteMesh: 0 1658 | m_PixelsPerUnitMultiplier: 1 1659 | --- !u!222 &1841724989 1660 | CanvasRenderer: 1661 | m_ObjectHideFlags: 0 1662 | m_CorrespondingSourceObject: {fileID: 0} 1663 | m_PrefabInstance: {fileID: 0} 1664 | m_PrefabAsset: {fileID: 0} 1665 | m_GameObject: {fileID: 1841724983} 1666 | m_CullTransparentMesh: 0 1667 | -------------------------------------------------------------------------------- /Assets/Example/Scenes/ExampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b8655ab 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Example/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb1d13b46ad4c3741a4ac6e9dd400d51 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Example/Scripts/TestCell.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEngine.UI; 6 | 7 | public class TestCell : BaseCell 8 | { 9 | private Text _testTxt; 10 | private void Awake() 11 | { 12 | BuildUI(); 13 | } 14 | 15 | private void BuildUI() 16 | { 17 | _testTxt = transform.Find("Text").GetComponent(); 18 | } 19 | 20 | public override void BuildData(BaseLoopModel model) 21 | { 22 | var testModel = model as TestModel; 23 | _testTxt.text = testModel.content; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Assets/Example/Scripts/TestCell.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 13efdb778d241e742ba372da7a94c914 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Example/Scripts/TestLayout.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEngine.UI; 6 | 7 | public class TestModel : BaseLoopModel 8 | { 9 | public string content; 10 | public override CellEnum CellType => CellEnum.Test; 11 | } 12 | 13 | 14 | public class TestLayout : MonoBehaviour 15 | { 16 | public RectTransform TestTrans; 17 | private ScrollRectLoop _rectLoop; 18 | 19 | public Button TestAddCellBtn; 20 | public Button TestFocusBtn; 21 | 22 | public int modelType = 1; 23 | 24 | private void Awake() 25 | { 26 | _rectLoop = GetComponent(); 27 | _rectLoop.RegisterCell(CellEnum.Test,TestTrans.gameObject,typeof(TestCell)); 28 | TestAddCellBtn.onClick.AddListener(() => 29 | { 30 | List models = null; 31 | if (modelType == 1) 32 | { 33 | models = GetTestModels(); 34 | } 35 | else 36 | { 37 | models = GetGridModels(); 38 | } 39 | _rectLoop.LoopModels = models; 40 | _rectLoop.RefreshView(); 41 | }); 42 | 43 | TestFocusBtn.onClick.AddListener(() => 44 | { 45 | _rectLoop.ScrollToIndex(5,true); 46 | }); 47 | } 48 | 49 | // Start is called before the first frame update 50 | void Start() 51 | { 52 | 53 | } 54 | 55 | private List GetTestModels() 56 | { 57 | var result = new List(); 58 | result.Add(new TestModel(){content = "111111111111"}); 59 | result.Add(new TestModel(){content = "22222222222222222222222222"}); 60 | result.Add(new TestModel(){content = "3333333333333333333333333333333333"}); 61 | result.Add(new TestModel(){content = "444444444444444444444444444444444444444444"}); 62 | result.Add(new TestModel(){content = "5555555555555555555555555555555555555555555555555555"}); 63 | result.Add(new TestModel(){content = "6666666666666666666666666666666666666666666666666666666666666666"}); 64 | result.Add(new TestModel(){content = "777777777777777777777777777777777777777777777777777777777777777777777777777777777777777"}); 65 | result.Add(new TestModel(){content = "888888888888888888888888888888888888888888888888888888888888888"}); 66 | result.Add(new TestModel(){content = "999999999999999999999999999999999999999999"}); 67 | result.Add(new TestModel(){content = "十十十十十十十十十十十十十十十十十十"}); 68 | result.Add(new TestModel(){content = "十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一十一"}); 69 | result.Add(new TestModel(){content = "十二十二十二十二十二十二十二十二十二十二十二十二十二十二十二十二十二十二十二十二"}); 70 | return result; 71 | } 72 | 73 | private List GetGridModels() 74 | { 75 | var result = new List(); 76 | result.Add(new TestModel(){content = "1"}); 77 | result.Add(new TestModel(){content = "2"}); 78 | result.Add(new TestModel(){content = "3"}); 79 | result.Add(new TestModel(){content = "4"}); 80 | result.Add(new TestModel(){content = "5"}); 81 | result.Add(new TestModel(){content = "6"}); 82 | result.Add(new TestModel(){content = "7"}); 83 | result.Add(new TestModel(){content = "8"}); 84 | result.Add(new TestModel(){content = "9"}); 85 | result.Add(new TestModel(){content = "10"}); 86 | result.Add(new TestModel(){content = "11"}); 87 | result.Add(new TestModel(){content = "12"}); 88 | return result; 89 | } 90 | 91 | // Update is called once per frame 92 | void Update() 93 | { 94 | 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Assets/Example/Scripts/TestLayout.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bb690b6be6b3585468a1c84a3a8b1d10 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9c68756c438fd4646a671951625a26cb 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/Base.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8dac4b70b57464041aa8f096cdc6bf3f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/Base/BaseCell.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | 6 | public abstract class BaseCell : MonoBehaviour 7 | { 8 | public int RenderIndex { get; set; } 9 | public CellEnum CellType { get; set; } 10 | // Start is called before the first frame update 11 | public abstract void BuildData(BaseLoopModel model); 12 | 13 | public virtual void OnReset() 14 | { 15 | 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Assets/Scripts/Base/BaseCell.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dc41d71db8dadf74aa3384e21212a2e9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Base/BaseLoopModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public abstract class BaseLoopModel 6 | { 7 | private Rect _cellRect; 8 | private Vector2 _startOffsets = new Vector2(); 9 | private Vector2 _sizes = new Vector2(); 10 | 11 | public Vector2 Sizes => _sizes; 12 | 13 | public abstract CellEnum CellType { get; } 14 | 15 | public void RefreshCellRect() 16 | { 17 | _cellRect = new Rect(_startOffsets[0],_startOffsets[1],_sizes[0],_sizes[1]); 18 | } 19 | 20 | public void RefreshCellSizeData(int axis, float startOffset, float size) 21 | { 22 | _startOffsets[axis] = startOffset; 23 | _sizes[axis] = size; 24 | if (axis == 1) 25 | { 26 | RefreshCellRect(); 27 | } 28 | } 29 | 30 | public float GetOffset(int axis) 31 | { 32 | return _startOffsets[axis]; 33 | } 34 | 35 | public float GetSize(int axis) 36 | { 37 | return _sizes[axis]; 38 | } 39 | 40 | public Rect GetCellRect() 41 | { 42 | return _cellRect; 43 | } 44 | } -------------------------------------------------------------------------------- /Assets/Scripts/Base/BaseLoopModel.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 90bcb2f4a64310945a7cc96704e135d7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Base/ILoopLayout.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | 6 | public interface ILoopLayout 7 | { 8 | LoopObjectPool ObjectPool { set; } 9 | List LoopModels { set; } 10 | void AddCalculateCompleteEvent(Action action); 11 | void SetChildAlongAxis(RectTransform child, BaseLoopModel model, int axis); 12 | } 13 | -------------------------------------------------------------------------------- /Assets/Scripts/Base/ILoopLayout.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c6dbf2e0493621f4486cecc6acf1eb13 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Consts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4c07043df09efc040a009a606ee89344 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/Consts/CellEnum.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public enum CellEnum 6 | { 7 | Test, 8 | } 9 | -------------------------------------------------------------------------------- /Assets/Scripts/Consts/CellEnum.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 972b9bc87fbdf544eab1df86a6180e51 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5d69a3b18a6a93a44a48343ef06be0e2 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/HorizontalLoopLayoutGroup.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class HorizontalLoopLayoutGroup : LoopHorizontalOrVerticalLayout 6 | { 7 | protected HorizontalLoopLayoutGroup() 8 | {} 9 | 10 | public override void CalculateLayoutInputHorizontal() 11 | { 12 | base.CalculateLayoutInputHorizontal(); 13 | CalcAlongAxis(0, false); 14 | } 15 | 16 | public override void CalculateLayoutInputVertical() 17 | { 18 | CalcAlongAxis(1, false); 19 | } 20 | 21 | public override void SetLayoutHorizontal() 22 | { 23 | SetChildrenAlongAxis(0, false); 24 | } 25 | 26 | public override void SetLayoutVertical() 27 | { 28 | SetChildrenAlongAxis(1, false); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/HorizontalLoopLayoutGroup.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d8ad7c72336558544a92d423a288a34d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/LoopGridLayout.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEngine.UI; 6 | 7 | public class LoopGridLayout : LayoutGroup,ILoopLayout 8 | { 9 | /// 10 | /// Which corner is the starting corner for the grid. 11 | /// 12 | public enum Corner 13 | { 14 | /// 15 | /// Upper Left corner. 16 | /// 17 | UpperLeft = 0, 18 | 19 | /// 20 | /// Upper Right corner. 21 | /// 22 | UpperRight = 1, 23 | 24 | /// 25 | /// Lower Left corner. 26 | /// 27 | LowerLeft = 2, 28 | 29 | /// 30 | /// Lower Right corner. 31 | /// 32 | LowerRight = 3 33 | } 34 | 35 | /// 36 | /// The grid axis we are looking at. 37 | /// 38 | /// 39 | /// As the storage is a [][] we make access easier by passing a axis. 40 | /// 41 | public enum Axis 42 | { 43 | /// 44 | /// Horizontal axis 45 | /// 46 | Horizontal = 0, 47 | 48 | /// 49 | /// Vertical axis. 50 | /// 51 | Vertical = 1 52 | } 53 | 54 | /// 55 | /// Constraint type on either the number of columns or rows. 56 | /// 57 | public enum Constraint 58 | { 59 | /// 60 | /// Don't constrain the number of rows or columns. 61 | /// 62 | Flexible = 0, 63 | 64 | /// 65 | /// Constrain the number of columns to a specified number. 66 | /// 67 | FixedColumnCount = 1, 68 | 69 | /// 70 | /// Constraint the number of rows to a specified number. 71 | /// 72 | FixedRowCount = 2 73 | } 74 | 75 | [SerializeField] protected Corner m_StartCorner = Corner.UpperLeft; 76 | 77 | /// 78 | /// Which corner should the first cell be placed in? 79 | /// 80 | public Corner startCorner 81 | { 82 | get { return m_StartCorner; } 83 | set { SetProperty(ref m_StartCorner, value); } 84 | } 85 | 86 | [SerializeField] protected Axis m_StartAxis = Axis.Horizontal; 87 | 88 | /// 89 | /// Which axis should cells be placed along first 90 | /// 91 | /// 92 | /// When startAxis is set to horizontal, an entire row will be filled out before proceeding to the next row. When set to vertical, an entire column will be filled out before proceeding to the next column. 93 | /// 94 | public Axis startAxis 95 | { 96 | get { return m_StartAxis; } 97 | set { SetProperty(ref m_StartAxis, value); } 98 | } 99 | 100 | [SerializeField] protected Vector2 m_CellSize = new Vector2(100, 100); 101 | 102 | /// 103 | /// The size to use for each cell in the grid. 104 | /// 105 | public Vector2 cellSize 106 | { 107 | get { return m_CellSize; } 108 | set { SetProperty(ref m_CellSize, value); } 109 | } 110 | 111 | [SerializeField] protected Vector2 m_Spacing = Vector2.zero; 112 | 113 | /// 114 | /// The spacing to use between layout elements in the grid on both axises. 115 | /// 116 | public Vector2 spacing 117 | { 118 | get { return m_Spacing; } 119 | set { SetProperty(ref m_Spacing, value); } 120 | } 121 | 122 | [SerializeField] protected Constraint m_Constraint = Constraint.Flexible; 123 | 124 | /// 125 | /// Which constraint to use for the GridLayoutGroup. 126 | /// 127 | /// 128 | /// Specifying a constraint can make the GridLayoutGroup work better in conjunction with a [[ContentSizeFitter]] component. When GridLayoutGroup is used on a RectTransform with a manually specified size, there's no need to specify a constraint. 129 | /// 130 | public Constraint constraint 131 | { 132 | get { return m_Constraint; } 133 | set { SetProperty(ref m_Constraint, value); } 134 | } 135 | 136 | [SerializeField] protected int m_ConstraintCount = 2; 137 | 138 | /// 139 | /// How many cells there should be along the constrained axis. 140 | /// 141 | public int constraintCount 142 | { 143 | get { return m_ConstraintCount; } 144 | set { SetProperty(ref m_ConstraintCount, Mathf.Max(1, value)); } 145 | } 146 | 147 | protected LoopGridLayout() 148 | { 149 | } 150 | 151 | #if UNITY_EDITOR 152 | protected override void OnValidate() 153 | { 154 | base.OnValidate(); 155 | constraintCount = constraintCount; 156 | } 157 | 158 | #endif 159 | private List _loopModels; 160 | 161 | public List LoopModels 162 | { 163 | get => _loopModels; 164 | set 165 | { 166 | _loopModels = value; 167 | SetDirty(); 168 | } 169 | } 170 | 171 | public LoopObjectPool ObjectPool { get; set; } 172 | 173 | 174 | private Action _onLayoutCalculateCompleteEvent; 175 | public void AddCalculateCompleteEvent(Action action) 176 | { 177 | _onLayoutCalculateCompleteEvent = action; 178 | } 179 | 180 | private ContentSizeFitter _contentSizeFitter; 181 | 182 | private ContentSizeFitter contentSizeFitter => 183 | _contentSizeFitter ?? (_contentSizeFitter = GetComponent()); 184 | 185 | protected new void SetDirty() 186 | { 187 | enabled = true; 188 | contentSizeFitter.enabled = true; 189 | LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform); 190 | enabled = false; 191 | contentSizeFitter.enabled = false; 192 | _onLayoutCalculateCompleteEvent?.Invoke(); 193 | } 194 | 195 | protected override void OnTransformChildrenChanged() {} 196 | 197 | protected override void OnDidApplyAnimationProperties() { } 198 | 199 | protected override void OnRectTransformDimensionsChange() { } 200 | 201 | protected override void OnEnable() { } 202 | 203 | protected override void OnDisable() { } 204 | 205 | /// 206 | /// Called by the layout system to calculate the horizontal layout size. 207 | /// Also see ILayoutElement 208 | /// 209 | public override void CalculateLayoutInputHorizontal() 210 | { 211 | if (ObjectPool == null || _loopModels == null) 212 | { 213 | return; 214 | } 215 | 216 | base.CalculateLayoutInputHorizontal(); 217 | 218 | int minColumns = 0; 219 | int preferredColumns = 0; 220 | if (m_Constraint == Constraint.FixedColumnCount) 221 | { 222 | minColumns = preferredColumns = m_ConstraintCount; 223 | } 224 | else if (m_Constraint == Constraint.FixedRowCount) 225 | { 226 | minColumns = preferredColumns = Mathf.CeilToInt(LoopModels.Count / (float) m_ConstraintCount - 0.001f); 227 | } 228 | else 229 | { 230 | minColumns = 1; 231 | preferredColumns = Mathf.CeilToInt(Mathf.Sqrt(LoopModels.Count)); 232 | } 233 | 234 | SetLayoutInputForAxis( 235 | padding.horizontal + (cellSize.x + spacing.x) * minColumns - spacing.x, 236 | padding.horizontal + (cellSize.x + spacing.x) * preferredColumns - spacing.x, 237 | -1, 0); 238 | } 239 | 240 | /// 241 | /// Called by the layout system to calculate the vertical layout size. 242 | /// Also see ILayoutElement 243 | /// 244 | public override void CalculateLayoutInputVertical() 245 | { 246 | if (ObjectPool == null || _loopModels == null) 247 | { 248 | return; 249 | } 250 | 251 | int minRows = 0; 252 | if (m_Constraint == Constraint.FixedColumnCount) 253 | { 254 | minRows = Mathf.CeilToInt(LoopModels.Count / (float) m_ConstraintCount - 0.001f); 255 | } 256 | else if (m_Constraint == Constraint.FixedRowCount) 257 | { 258 | minRows = m_ConstraintCount; 259 | } 260 | else 261 | { 262 | float width = rectTransform.rect.width; 263 | int cellCountX = Mathf.Max(1, 264 | Mathf.FloorToInt((width - padding.horizontal + spacing.x + 0.001f) / (cellSize.x + spacing.x))); 265 | minRows = Mathf.CeilToInt(LoopModels.Count / (float) cellCountX); 266 | } 267 | 268 | float minSpace = padding.vertical + (cellSize.y + spacing.y) * minRows - spacing.y; 269 | SetLayoutInputForAxis(minSpace, minSpace, -1, 1); 270 | } 271 | 272 | public override void SetLayoutHorizontal() 273 | { 274 | SetCellsAlongAxis(0); 275 | } 276 | 277 | public override void SetLayoutVertical() 278 | { 279 | SetCellsAlongAxis(1); 280 | } 281 | 282 | private void SetCellsAlongAxis(int axis) 283 | { 284 | if (ObjectPool == null || _loopModels == null) 285 | { 286 | return; 287 | } 288 | 289 | if (axis == 0) 290 | { 291 | var allPrefabs = ObjectPool.GetAllPrefabs(); 292 | foreach (GameObject prefab in allPrefabs) 293 | { 294 | var rect = prefab.transform as RectTransform; 295 | m_Tracker.Add(this, rect, 296 | DrivenTransformProperties.Anchors | 297 | DrivenTransformProperties.AnchoredPosition | 298 | DrivenTransformProperties.SizeDelta); 299 | 300 | rect.anchorMin = Vector2.up; 301 | rect.anchorMax = Vector2.up; 302 | rect.sizeDelta = cellSize; 303 | } 304 | return; 305 | } 306 | 307 | float width = rectTransform.rect.size.x; 308 | float height = rectTransform.rect.size.y; 309 | 310 | int cellCountX = 1; 311 | int cellCountY = 1; 312 | if (m_Constraint == Constraint.FixedColumnCount) 313 | { 314 | cellCountX = m_ConstraintCount; 315 | 316 | if (LoopModels.Count > cellCountX) 317 | cellCountY = LoopModels.Count / cellCountX + (LoopModels.Count % cellCountX > 0 ? 1 : 0); 318 | } 319 | else if (m_Constraint == Constraint.FixedRowCount) 320 | { 321 | cellCountY = m_ConstraintCount; 322 | 323 | if (LoopModels.Count > cellCountY) 324 | cellCountX = LoopModels.Count / cellCountY + (LoopModels.Count % cellCountY > 0 ? 1 : 0); 325 | } 326 | else 327 | { 328 | if (cellSize.x + spacing.x <= 0) 329 | cellCountX = int.MaxValue; 330 | else 331 | cellCountX = Mathf.Max(1, 332 | Mathf.FloorToInt((width - padding.horizontal + spacing.x + 0.001f) / (cellSize.x + spacing.x))); 333 | 334 | if (cellSize.y + spacing.y <= 0) 335 | cellCountY = int.MaxValue; 336 | else 337 | cellCountY = Mathf.Max(1, 338 | Mathf.FloorToInt((height - padding.vertical + spacing.y + 0.001f) / (cellSize.y + spacing.y))); 339 | } 340 | 341 | int cornerX = (int) startCorner % 2; 342 | int cornerY = (int) startCorner / 2; 343 | 344 | int cellsPerMainAxis, actualCellCountX, actualCellCountY; 345 | if (startAxis == Axis.Horizontal) 346 | { 347 | cellsPerMainAxis = cellCountX; 348 | actualCellCountX = Mathf.Clamp(cellCountX, 1, LoopModels.Count); 349 | actualCellCountY = 350 | Mathf.Clamp(cellCountY, 1, Mathf.CeilToInt(LoopModels.Count / (float) cellsPerMainAxis)); 351 | } 352 | else 353 | { 354 | cellsPerMainAxis = cellCountY; 355 | actualCellCountY = Mathf.Clamp(cellCountY, 1, LoopModels.Count); 356 | actualCellCountX = 357 | Mathf.Clamp(cellCountX, 1, Mathf.CeilToInt(LoopModels.Count / (float) cellsPerMainAxis)); 358 | } 359 | 360 | Vector2 requiredSpace = new Vector2( 361 | actualCellCountX * cellSize.x + (actualCellCountX - 1) * spacing.x, 362 | actualCellCountY * cellSize.y + (actualCellCountY - 1) * spacing.y 363 | ); 364 | Vector2 startOffset = new Vector2( 365 | GetStartOffset(0, requiredSpace.x), 366 | GetStartOffset(1, requiredSpace.y) 367 | ); 368 | 369 | for (int i = 0; i < LoopModels.Count; i++) 370 | { 371 | int positionX; 372 | int positionY; 373 | if (startAxis == Axis.Horizontal) 374 | { 375 | positionX = i % cellsPerMainAxis; 376 | positionY = i / cellsPerMainAxis; 377 | } 378 | else 379 | { 380 | positionX = i / cellsPerMainAxis; 381 | positionY = i % cellsPerMainAxis; 382 | } 383 | 384 | if (cornerX == 1) 385 | positionX = actualCellCountX - 1 - positionX; 386 | if (cornerY == 1) 387 | positionY = actualCellCountY - 1 - positionY; 388 | 389 | var go = ObjectPool.GetObject(_loopModels[i].CellType); 390 | var child = go.transform as RectTransform; 391 | 392 | SetChildAlongAxis(child, 0, startOffset.x + (cellSize[0] + spacing[0]) * positionX, cellSize[0]); 393 | // _loopModels[i].RefreshCellRect(child, 0); 394 | _loopModels[i].RefreshCellSizeData(0, startOffset.x + (cellSize[0] + spacing[0]) * positionX, cellSize[0]); 395 | SetChildAlongAxis(child, 1, startOffset.y + (cellSize[1] + spacing[1]) * positionY, cellSize[1]); 396 | // _loopModels[i].RefreshCellRect(child, 1); 397 | _loopModels[i].RefreshCellSizeData(1, startOffset.y + (cellSize[1] + spacing[1]) * positionY, cellSize[1]); 398 | 399 | ObjectPool.ReturnObject(go); 400 | } 401 | } 402 | 403 | public void SetChildAlongAxis(RectTransform child,BaseLoopModel model,int axis) 404 | { 405 | SetChildAlongAxis(child, axis, model.GetOffset(axis),model.GetSize(axis)); 406 | } 407 | } -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/LoopGridLayout.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5ec79269c82ff7a4f91d4bbf3f96d223 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/LoopHorizontalOrVerticalLayout.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEngine.UI; 6 | 7 | public abstract class LoopHorizontalOrVerticalLayout : HorizontalOrVerticalLayoutGroup,ILoopLayout 8 | { 9 | private List _loopModels; 10 | 11 | private ContentSizeFitter _contentSizeFitter; 12 | 13 | private ContentSizeFitter contentSizeFitter => 14 | _contentSizeFitter ?? (_contentSizeFitter = GetComponent()); 15 | 16 | public List LoopModels 17 | { 18 | get => _loopModels; 19 | set 20 | { 21 | _loopModels = value; 22 | SetDirty(); 23 | } 24 | } 25 | 26 | public LoopObjectPool ObjectPool { get; set; } 27 | 28 | private Action _onLayoutCalculateCompleteEvent; 29 | public void AddCalculateCompleteEvent(Action action) 30 | { 31 | _onLayoutCalculateCompleteEvent = action; 32 | } 33 | 34 | private new void SetDirty() 35 | { 36 | enabled = true; 37 | contentSizeFitter.enabled = true; 38 | LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform); 39 | enabled = false; 40 | contentSizeFitter.enabled = false; 41 | _onLayoutCalculateCompleteEvent?.Invoke(); 42 | } 43 | 44 | protected override void OnTransformChildrenChanged() { } 45 | 46 | protected override void OnDidApplyAnimationProperties() { } 47 | 48 | protected override void OnRectTransformDimensionsChange() { } 49 | 50 | protected override void OnEnable() { } 51 | 52 | protected override void OnDisable() { } 53 | 54 | protected new void CalcAlongAxis(int axis, bool isVertical) 55 | { 56 | if (ObjectPool==null || _loopModels == null) 57 | { 58 | return; 59 | } 60 | 61 | float combinedPadding = (axis == 0 ? padding.horizontal : padding.vertical); 62 | bool controlSize = (axis == 0 ? m_ChildControlWidth : m_ChildControlHeight); 63 | bool childForceExpandSize = (axis == 0 ? childForceExpandWidth : childForceExpandHeight); 64 | 65 | float totalMin = combinedPadding; 66 | float totalPreferred = combinedPadding; 67 | float totalFlexible = 0; 68 | 69 | bool alongOtherAxis = (isVertical ^ (axis == 1)); 70 | for (int i = 0; i < _loopModels.Count; i++) 71 | { 72 | var go = ObjectPool.GetObject(_loopModels[i].CellType); 73 | LoopCalUtil.RefreshViewAndRebuild(axis,go,_loopModels[i]); 74 | 75 | float min, preferred, flexible; 76 | LoopCalUtil.GetChildSizes(go.transform as RectTransform, axis, controlSize, childForceExpandSize, out min, out preferred, out flexible); 77 | 78 | if (alongOtherAxis) 79 | { 80 | totalMin = Mathf.Max(min + combinedPadding, totalMin); 81 | totalPreferred = Mathf.Max(preferred + combinedPadding, totalPreferred); 82 | totalFlexible = Mathf.Max(flexible, totalFlexible); 83 | } 84 | else 85 | { 86 | totalMin += min + spacing; 87 | totalPreferred += preferred + spacing; 88 | 89 | // Increment flexible size with element's flexible size. 90 | totalFlexible += flexible; 91 | } 92 | ObjectPool.ReturnObject(go); 93 | } 94 | 95 | if (!alongOtherAxis && rectChildren.Count > 0) 96 | { 97 | totalMin -= spacing; 98 | totalPreferred -= spacing; 99 | } 100 | 101 | totalPreferred = Mathf.Max(totalMin, totalPreferred); 102 | SetLayoutInputForAxis(totalMin, totalPreferred, totalFlexible, axis); 103 | } 104 | 105 | protected new void SetChildrenAlongAxis(int axis, bool isVertical) 106 | { 107 | if (ObjectPool == null || _loopModels == null) 108 | { 109 | return; 110 | } 111 | 112 | float size = rectTransform.rect.size[axis]; 113 | bool controlSize = (axis == 0 ? m_ChildControlWidth : m_ChildControlHeight); 114 | bool childForceExpandSize = (axis == 0 ? childForceExpandWidth : childForceExpandHeight); 115 | float alignmentOnAxis = GetAlignmentOnAxis(axis); 116 | 117 | bool alongOtherAxis = (isVertical ^ (axis == 1)); 118 | if (alongOtherAxis) 119 | { 120 | float innerSize = size - (axis == 0 ? padding.horizontal : padding.vertical); 121 | for (int i = 0; i < _loopModels.Count; i++) 122 | { 123 | var go = ObjectPool.GetObject(_loopModels[i].CellType); 124 | var child = go.transform as RectTransform; 125 | float min, preferred, flexible; 126 | LoopCalUtil.RefreshViewAndRebuild(axis,go,_loopModels[i]); 127 | LoopCalUtil.GetChildSizes(child,axis, controlSize, childForceExpandSize, out min, out preferred, out flexible); 128 | 129 | float requiredSpace = Mathf.Clamp(innerSize, min, flexible > 0 ? size : preferred); 130 | float startOffset = GetStartOffset(axis, requiredSpace); 131 | if (controlSize) 132 | { 133 | _loopModels[i].RefreshCellSizeData(axis, startOffset, requiredSpace); 134 | } 135 | else 136 | { 137 | float offsetInCell = (requiredSpace - child.sizeDelta[axis]) * alignmentOnAxis; 138 | _loopModels[i].RefreshCellSizeData(axis, startOffset + offsetInCell, child.sizeDelta[axis]); 139 | } 140 | ObjectPool.ReturnObject(go); 141 | } 142 | } 143 | else 144 | { 145 | float pos = (axis == 0 ? padding.left : padding.top); 146 | if (GetTotalFlexibleSize(axis) == 0 && GetTotalPreferredSize(axis) < size) 147 | pos = GetStartOffset(axis, 148 | GetTotalPreferredSize(axis) - (axis == 0 ? padding.horizontal : padding.vertical)); 149 | 150 | float minMaxLerp = 0; 151 | if (GetTotalMinSize(axis) != GetTotalPreferredSize(axis)) 152 | minMaxLerp = Mathf.Clamp01((size - GetTotalMinSize(axis)) / 153 | (GetTotalPreferredSize(axis) - GetTotalMinSize(axis))); 154 | 155 | float itemFlexibleMultiplier = 0; 156 | if (size > GetTotalPreferredSize(axis)) 157 | { 158 | if (GetTotalFlexibleSize(axis) > 0) 159 | itemFlexibleMultiplier = (size - GetTotalPreferredSize(axis)) / GetTotalFlexibleSize(axis); 160 | } 161 | 162 | for (int i = 0; i < _loopModels.Count; i++) 163 | { 164 | var go = ObjectPool.GetObject(_loopModels[i].CellType); 165 | var child = go.transform as RectTransform; 166 | float min, preferred, flexible; 167 | LoopCalUtil.RefreshViewAndRebuild(axis,go,_loopModels[i]); 168 | LoopCalUtil.GetChildSizes(child,axis, controlSize, childForceExpandSize, out min, out preferred, out flexible); 169 | 170 | float childSize = Mathf.Lerp(min, preferred, minMaxLerp); 171 | childSize += flexible * itemFlexibleMultiplier; 172 | if (controlSize) 173 | { 174 | 175 | _loopModels[i].RefreshCellSizeData(axis,pos,childSize); 176 | } 177 | else 178 | { 179 | float offsetInCell = (childSize - child.sizeDelta[axis]) * alignmentOnAxis; 180 | _loopModels[i].RefreshCellSizeData(axis, pos + offsetInCell, child.sizeDelta[axis]); 181 | 182 | } 183 | 184 | pos += childSize + spacing; 185 | ObjectPool.ReturnObject(go); 186 | } 187 | } 188 | 189 | } 190 | 191 | public void SetChildAlongAxis(RectTransform child,BaseLoopModel model,int axis) 192 | { 193 | SetChildAlongAxis(child, axis, model.GetOffset(axis),model.GetSize(axis)); 194 | } 195 | } -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/LoopHorizontalOrVerticalLayout.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 714a6469e3d9f1341a22bcd5a795436c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/ScrollRectLoop.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using UnityEngine; 6 | using UnityEngine.EventSystems; 7 | using UnityEngine.UI; 8 | 9 | [RequireComponent(typeof(ScrollRect))] 10 | public class ScrollRectLoop : MonoBehaviour,IBeginDragHandler 11 | { 12 | private ScrollRect _scroll; 13 | public List LoopModels; 14 | public ScrollRect ScrollRectComp 15 | { 16 | get => _scroll ?? (_scroll = GetComponent()); 17 | } 18 | 19 | private RectTransform rectTransform => transform as RectTransform; 20 | 21 | private RectTransform _contentRectTransform; 22 | private RectTransform contentRectTransform 23 | { 24 | get=> _contentRectTransform ?? (_contentRectTransform = ScrollRectComp.content); 25 | } 26 | 27 | private HashSet _showIndexes = new HashSet(); 28 | private List _currentRenderCell = new List(); 29 | private HashSet _rendingIndexes = new HashSet(); 30 | private LoopObjectPool _objectPool = new LoopObjectPool(); 31 | 32 | private ILoopLayout _loopLayout; 33 | 34 | private void ReturnObject(GameObject go) 35 | { 36 | _objectPool.ReturnObject(go); 37 | } 38 | 39 | private BaseCell GetObject(CellEnum cellEnum) 40 | { 41 | var go = _objectPool.GetObject(cellEnum); 42 | 43 | return go.GetComponent(); 44 | } 45 | 46 | private void Awake() 47 | { 48 | _loopLayout = contentRectTransform.GetComponent(); 49 | _loopLayout.ObjectPool = _objectPool; 50 | ScrollRectComp.onValueChanged.AddListener(OnScrollValueChange); 51 | _loopLayout.AddCalculateCompleteEvent(() => { RenderCells(true); }); 52 | _objectPool.SetLoopContent(contentRectTransform); 53 | } 54 | 55 | public void RegisterCell(CellEnum cellEnum, GameObject go, Type cellType) 56 | { 57 | var rect = go.transform as RectTransform; 58 | rect.anchorMin = Vector2.up; 59 | rect.anchorMax = Vector2.up; 60 | _objectPool.RegisterCell(cellEnum,go,cellType); 61 | } 62 | 63 | private void OnScrollValueChange(Vector2 normalization) 64 | { 65 | RenderCells(); 66 | } 67 | 68 | private void RenderCells(bool isRemoveAll = false) 69 | { 70 | var normalization = ScrollRectComp.normalizedPosition; 71 | GetVisualCell(normalization); 72 | RemoveCells(isRemoveAll); 73 | 74 | foreach (int index in _showIndexes) 75 | { 76 | if (!_rendingIndexes.Contains(index)) 77 | { 78 | var baseLoopModel = LoopModels[index]; 79 | var cell = GetObject(baseLoopModel.CellType); 80 | cell.RenderIndex = index; 81 | _currentRenderCell.Add(cell); 82 | cell.BuildData(baseLoopModel); 83 | _loopLayout.SetChildAlongAxis(cell.transform as RectTransform, baseLoopModel,0); 84 | _loopLayout.SetChildAlongAxis(cell.transform as RectTransform, baseLoopModel,1); 85 | } 86 | } 87 | } 88 | 89 | public void RefreshView() 90 | { 91 | _loopLayout.LoopModels = LoopModels; 92 | } 93 | 94 | private void RemoveCells(bool isRemoveAll = false) 95 | { 96 | _rendingIndexes.Clear(); 97 | if (isRemoveAll) 98 | { 99 | foreach (RectTransform rectTransform in contentRectTransform) 100 | { 101 | ReturnObject(rectTransform.gameObject); 102 | 103 | } 104 | // _showIndexes.Clear(); 105 | _currentRenderCell.Clear(); 106 | return; 107 | } 108 | 109 | var tmpRemove = new List(); 110 | foreach (BaseCell baseCell in _currentRenderCell) 111 | { 112 | if (!_showIndexes.Contains(baseCell.RenderIndex)) 113 | { 114 | tmpRemove.Add(baseCell); 115 | ReturnObject(baseCell.gameObject); 116 | } 117 | else 118 | { 119 | _rendingIndexes.Add(baseCell.RenderIndex); 120 | } 121 | } 122 | 123 | foreach (BaseCell cell in tmpRemove) 124 | { 125 | _currentRenderCell.Remove(cell); 126 | } 127 | } 128 | 129 | private void GetVisualCell(Vector2 normalization) 130 | { 131 | _showIndexes.Clear(); 132 | if (LoopModels == null) 133 | { 134 | return; 135 | } 136 | var sizeDelta = contentRectTransform.sizeDelta; 137 | 138 | var scrollSizeDelta = rectTransform.sizeDelta; 139 | 140 | float scrollXFrom = normalization.x * (sizeDelta[0] - scrollSizeDelta[0]); 141 | float scrollYFrom = (1 - normalization.y) * (sizeDelta[1] - scrollSizeDelta[1]); 142 | float scrollXTo = scrollXFrom + scrollSizeDelta[0]; 143 | float scrollYTo = scrollYFrom + scrollSizeDelta[1]; 144 | 145 | var contentRect = new Rect(scrollXFrom, scrollYFrom, scrollXTo - scrollXFrom, scrollYTo - scrollYFrom); 146 | for (int i = 0; i < LoopModels.Count; i++) 147 | { 148 | var loopModel = LoopModels[i]; 149 | var cellRect = loopModel.GetCellRect(); 150 | if (contentRect.Overlaps(cellRect)) 151 | { 152 | _showIndexes.Add(i); 153 | } 154 | } 155 | } 156 | 157 | private Coroutine _smoothMoveCo; 158 | 159 | public void ScrollToIndex(int index,bool smoothMove = false,float duration = 0.1f) 160 | { 161 | var model = LoopModels[index]; 162 | var rect = model.GetCellRect(); 163 | var sizeDelta = contentRectTransform.sizeDelta; 164 | var scrollSizeDelta = rectTransform.sizeDelta; 165 | var normalizationDelta = sizeDelta - scrollSizeDelta; 166 | var xNormalization = rect.xMin/ normalizationDelta[0]; 167 | var yNormalization = rect.yMin / normalizationDelta[1]; 168 | if (smoothMove) 169 | { 170 | var targetNormalizationPos = new Vector2(xNormalization, 1 - yNormalization); 171 | _smoothMoveCo = StartCoroutine(SmoothMove(targetNormalizationPos,duration)); 172 | } 173 | else 174 | { 175 | ScrollRectComp.normalizedPosition = new Vector2(xNormalization,1-yNormalization); 176 | } 177 | } 178 | 179 | private IEnumerator SmoothMove(Vector2 targetPos,float duration) 180 | { 181 | var currentPos = ScrollRectComp.normalizedPosition; 182 | var time = 0f; 183 | while (true) 184 | { 185 | var t = time / duration; 186 | ScrollRectComp.normalizedPosition = Vector2.Lerp(currentPos,targetPos,t); 187 | time += Time.deltaTime; 188 | yield return null; 189 | if (time >= duration) 190 | { 191 | ScrollRectComp.normalizedPosition = targetPos; 192 | break; 193 | } 194 | } 195 | } 196 | 197 | 198 | 199 | private void OnDestroy() 200 | { 201 | _objectPool.ClearPool(); 202 | } 203 | 204 | public void OnBeginDrag(PointerEventData eventData) 205 | { 206 | if (_smoothMoveCo != null) 207 | { 208 | StopCoroutine(_smoothMoveCo); 209 | } 210 | } 211 | } 212 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/ScrollRectLoop.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fe6a2f507d8634749a4b054de1f4aac9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/VerticalLoopLayoutGroup.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class VerticalLoopLayoutGroup : LoopHorizontalOrVerticalLayout 6 | { 7 | protected VerticalLoopLayoutGroup() 8 | {} 9 | 10 | public override void CalculateLayoutInputHorizontal() 11 | { 12 | base.CalculateLayoutInputHorizontal(); 13 | CalcAlongAxis(0, true); 14 | } 15 | 16 | public override void CalculateLayoutInputVertical() 17 | { 18 | CalcAlongAxis(1, true); 19 | } 20 | 21 | public override void SetLayoutHorizontal() 22 | { 23 | SetChildrenAlongAxis(0, true); 24 | } 25 | 26 | public override void SetLayoutVertical() 27 | { 28 | SetChildrenAlongAxis(1, true); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Assets/Scripts/LayoutGroup/VerticalLoopLayoutGroup.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ff079320a7e57134baabc494417bdac8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Tool.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dcf87d431f10f584687f83fcfeb09e15 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/Tool/LoopCalUtil.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | 6 | public static class LoopCalUtil 7 | { 8 | public static void GetChildSizes(RectTransform cellTrans,int axis, bool controlSize, bool childForceExpand, 9 | out float min, out float preferred, out float flexible) 10 | { 11 | if (!controlSize) 12 | { 13 | min = cellTrans.sizeDelta[axis]; 14 | preferred = min; 15 | flexible = 0; 16 | } 17 | else 18 | { 19 | min = LayoutUtility.GetMinSize(cellTrans, axis); 20 | preferred = LayoutUtility.GetPreferredSize(cellTrans, axis); 21 | flexible = LayoutUtility.GetFlexibleSize(cellTrans, axis); 22 | } 23 | 24 | if (childForceExpand) 25 | flexible = Mathf.Max(flexible, 1); 26 | } 27 | 28 | public static void RefreshViewAndRebuild(int axis,GameObject go,BaseLoopModel model) 29 | { 30 | if (axis == 1) 31 | { 32 | var rectTrans = go.transform as RectTransform; 33 | rectTrans.sizeDelta = model.Sizes; 34 | } 35 | var baseCell = go.GetComponent(); 36 | baseCell.BuildData(model); 37 | var rect = go.transform as RectTransform; 38 | LayoutRebuilder.ForceRebuildLayoutImmediate(rect); 39 | } 40 | } -------------------------------------------------------------------------------- /Assets/Scripts/Tool/LoopCalUtil.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4a94753edb513f54ca93a17b8de8f2d9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Tool/LoopObjectPool.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using Object = UnityEngine.Object; 6 | 7 | public class LoopObjectPool 8 | { 9 | private Dictionary> _poolDic = new Dictionary>(); 10 | private Dictionary _prefabDic = new Dictionary(); 11 | private Dictionary _cellTypeDic = new Dictionary(); 12 | private RectTransform _contentTrans; 13 | private RectTransform _objectPoolContainer; 14 | 15 | 16 | public void SetLoopContent(RectTransform contentTrans) 17 | { 18 | _contentTrans = contentTrans; 19 | if (_objectPoolContainer == null) 20 | { 21 | var go = new GameObject("ObjectPoolContainer"); 22 | _objectPoolContainer = go.AddComponent(); 23 | _objectPoolContainer.SetParent(_contentTrans.parent); 24 | _objectPoolContainer.localPosition = Vector3.zero; 25 | _objectPoolContainer.localScale = Vector3.one; 26 | } 27 | } 28 | 29 | public void RegisterCell(CellEnum cellEnum,GameObject gameObject,Type cellType) 30 | { 31 | _prefabDic.Add(cellEnum,gameObject); 32 | _cellTypeDic.Add(cellEnum,cellType); 33 | } 34 | public GameObject GetObject(CellEnum cellEnum) 35 | { 36 | if (!_poolDic.TryGetValue(cellEnum, out var queue)) 37 | { 38 | queue = new Queue(); 39 | _poolDic.Add(cellEnum,queue); 40 | } 41 | 42 | var go = queue.Count != 0 ? queue.Dequeue() : CreateObject(cellEnum); 43 | go.SetActive(true); 44 | go.transform.SetParent(_contentTrans); 45 | go.transform.localScale = Vector3.one; 46 | go.transform.position = Vector3.zero; 47 | return go; 48 | } 49 | 50 | private GameObject CreateObject(CellEnum cellEnum) 51 | { 52 | GameObject prefab; 53 | if (_prefabDic.TryGetValue(cellEnum, out prefab)) 54 | { 55 | var go = Object.Instantiate(prefab, _contentTrans, true); 56 | go.transform.localScale = Vector3.one; 57 | go.transform.localPosition = Vector3.zero; 58 | var type = GetCellType(cellEnum); 59 | var cell = go.AddComponent(type) as BaseCell; 60 | cell.CellType = cellEnum; 61 | return go; 62 | } 63 | 64 | Debug.LogError($"没有声明枚举类型为{cellEnum.ToString()}的预制"); 65 | return null; 66 | } 67 | 68 | public void ReturnObject(GameObject go) 69 | { 70 | var cell = go.GetComponent(); 71 | var cellEnum = cell.CellType; 72 | cell.OnReset(); 73 | if (_poolDic.TryGetValue(cellEnum, out var queue)) 74 | { 75 | go.transform.SetParent(_objectPoolContainer); 76 | go.SetActive(false); 77 | queue.Enqueue(go); 78 | } 79 | } 80 | 81 | private Type GetCellType(CellEnum cellEnum) 82 | { 83 | if (_cellTypeDic.TryGetValue(cellEnum, out var type)) 84 | { 85 | if (type.IsSubclassOf(typeof(BaseCell))) 86 | { 87 | return type; 88 | } 89 | else 90 | { 91 | Debug.LogError($"所获取的cell类型非继承自BaseCell"); 92 | } 93 | } 94 | else 95 | { 96 | Debug.LogError($"请求了没有声明的cell"); 97 | 98 | } 99 | return null; 100 | 101 | } 102 | 103 | public void ClearPool() 104 | { 105 | _contentTrans = null; 106 | _prefabDic.Clear(); 107 | foreach (Queue queue in _poolDic.Values) 108 | { 109 | foreach (GameObject go in queue) 110 | { 111 | GameObject.Destroy(go); 112 | } 113 | } 114 | _poolDic.Clear(); 115 | _cellTypeDic.Clear(); 116 | } 117 | 118 | //这个方法是给一些对cell的rect有要求的用的,可以直接获取到所有register的cell原型 119 | public List GetAllPrefabs() 120 | { 121 | List result = new List(); 122 | foreach (KeyValuePair keyValuePair in _prefabDic) 123 | { 124 | var go = keyValuePair.Value; 125 | result.Add(go); 126 | } 127 | 128 | return result; 129 | } 130 | 131 | } 132 | -------------------------------------------------------------------------------- /Assets/Scripts/Tool/LoopObjectPool.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7180dbeab7deeff4791139564f6f615c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Sprites.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5e5c14cd1b9cb5f46954564628c649e5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Sprites/sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jechyang/ScrollRectLoop/11291f14e115eeb6a656305131cb19efe2a533fa/Assets/Sprites/sprite.png -------------------------------------------------------------------------------- /Assets/Sprites/sprite.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 311fdd9149bc8da44acbe01e7a131e49 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 10 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -100 37 | wrapU: 1 38 | wrapV: 1 39 | wrapW: -1 40 | nPOTScale: 0 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 1 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 1 53 | spriteTessellationDetail: -1 54 | textureType: 8 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | platformSettings: 61 | - serializedVersion: 3 62 | buildTarget: DefaultTexturePlatform 63 | maxTextureSize: 2048 64 | resizeAlgorithm: 0 65 | textureFormat: -1 66 | textureCompression: 1 67 | compressionQuality: 50 68 | crunchedCompression: 0 69 | allowsAlphaSplitting: 0 70 | overridden: 0 71 | androidETC2FallbackOverride: 0 72 | forceMaximumCompressionQuality_BC6H_BC7: 0 73 | - serializedVersion: 3 74 | buildTarget: Standalone 75 | maxTextureSize: 2048 76 | resizeAlgorithm: 0 77 | textureFormat: -1 78 | textureCompression: 1 79 | compressionQuality: 50 80 | crunchedCompression: 0 81 | allowsAlphaSplitting: 0 82 | overridden: 0 83 | androidETC2FallbackOverride: 0 84 | forceMaximumCompressionQuality_BC6H_BC7: 0 85 | - serializedVersion: 3 86 | buildTarget: Android 87 | maxTextureSize: 2048 88 | resizeAlgorithm: 0 89 | textureFormat: -1 90 | textureCompression: 1 91 | compressionQuality: 50 92 | crunchedCompression: 0 93 | allowsAlphaSplitting: 0 94 | overridden: 0 95 | androidETC2FallbackOverride: 0 96 | forceMaximumCompressionQuality_BC6H_BC7: 0 97 | spriteSheet: 98 | serializedVersion: 2 99 | sprites: [] 100 | outline: [] 101 | physicsShape: [] 102 | bones: [] 103 | spriteID: 5e97eb03825dee720800000000000000 104 | internalID: 0 105 | vertices: [] 106 | indices: 107 | edges: [] 108 | weights: [] 109 | secondaryTextures: [] 110 | spritePackingTag: 111 | pSDRemoveMatte: 0 112 | pSDShowRemoveMatteOption: 0 113 | userData: 114 | assetBundleName: 115 | assetBundleVariant: 116 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.collab-proxy": "1.2.16", 4 | "com.unity.ide.rider": "1.1.4", 5 | "com.unity.ide.vscode": "1.1.4", 6 | "com.unity.test-framework": "1.1.11", 7 | "com.unity.textmeshpro": "2.0.1", 8 | "com.unity.timeline": "1.2.10", 9 | "com.unity.ugui": "1.0.0", 10 | "com.unity.modules.ai": "1.0.0", 11 | "com.unity.modules.androidjni": "1.0.0", 12 | "com.unity.modules.animation": "1.0.0", 13 | "com.unity.modules.assetbundle": "1.0.0", 14 | "com.unity.modules.audio": "1.0.0", 15 | "com.unity.modules.cloth": "1.0.0", 16 | "com.unity.modules.director": "1.0.0", 17 | "com.unity.modules.imageconversion": "1.0.0", 18 | "com.unity.modules.imgui": "1.0.0", 19 | "com.unity.modules.jsonserialize": "1.0.0", 20 | "com.unity.modules.particlesystem": "1.0.0", 21 | "com.unity.modules.physics": "1.0.0", 22 | "com.unity.modules.physics2d": "1.0.0", 23 | "com.unity.modules.screencapture": "1.0.0", 24 | "com.unity.modules.terrain": "1.0.0", 25 | "com.unity.modules.terrainphysics": "1.0.0", 26 | "com.unity.modules.tilemap": "1.0.0", 27 | "com.unity.modules.ui": "1.0.0", 28 | "com.unity.modules.uielements": "1.0.0", 29 | "com.unity.modules.umbra": "1.0.0", 30 | "com.unity.modules.unityanalytics": "1.0.0", 31 | "com.unity.modules.unitywebrequest": "1.0.0", 32 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 33 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 34 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 35 | "com.unity.modules.unitywebrequestwww": "1.0.0", 36 | "com.unity.modules.vehicles": "1.0.0", 37 | "com.unity.modules.video": "1.0.0", 38 | "com.unity.modules.vr": "1.0.0", 39 | "com.unity.modules.wind": "1.0.0", 40 | "com.unity.modules.xr": "1.0.0" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /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: 9 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;asmref 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 1 30 | m_AssetPipelineMode: 1 31 | m_CacheServerMode: 0 32 | m_CacheServerEndpoint: 33 | m_CacheServerNamespacePrefix: default 34 | m_CacheServerEnableDownload: 1 35 | m_CacheServerEnableUpload: 1 36 | -------------------------------------------------------------------------------- /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: 13 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 | m_AllowEnlightenSupportForUpgradedProject: 0 64 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /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: 20 7 | productGUID: 1cc1f73fdd378fa48a518ca4beeb7614 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: ScrollRectLoop_Local 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 | iosUseCustomAppBackgroundBehavior: 0 56 | iosAllowHTTPDownload: 1 57 | allowedAutorotateToPortrait: 1 58 | allowedAutorotateToPortraitUpsideDown: 1 59 | allowedAutorotateToLandscapeRight: 1 60 | allowedAutorotateToLandscapeLeft: 1 61 | useOSAutorotation: 1 62 | use32BitDisplayBuffer: 1 63 | preserveFramebufferAlpha: 0 64 | disableDepthAndStencilBuffers: 0 65 | androidStartInFullscreen: 1 66 | androidRenderOutsideSafeArea: 1 67 | androidUseSwappy: 0 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 | useFlipModelSwapchain: 1 83 | resizableWindow: 0 84 | useMacAppStoreValidation: 0 85 | macAppStoreCategory: public.app-category.games 86 | gpuSkinning: 1 87 | xboxPIXTextureCapture: 0 88 | xboxEnableAvatar: 0 89 | xboxEnableKinect: 0 90 | xboxEnableKinectAutoTracking: 0 91 | xboxEnableFitness: 0 92 | visibleInBackground: 1 93 | allowFullscreenSwitch: 1 94 | fullscreenMode: 1 95 | xboxSpeechDB: 0 96 | xboxEnableHeadOrientation: 0 97 | xboxEnableGuest: 0 98 | xboxEnablePIXSampling: 0 99 | metalFramebufferOnly: 0 100 | xboxOneResolution: 0 101 | xboxOneSResolution: 0 102 | xboxOneXResolution: 3 103 | xboxOneMonoLoggingLevel: 0 104 | xboxOneLoggingLevel: 1 105 | xboxOneDisableEsram: 0 106 | xboxOnePresentImmediateThreshold: 0 107 | switchQueueCommandMemory: 0 108 | switchQueueControlMemory: 16384 109 | switchQueueComputeMemory: 262144 110 | switchNVNShaderPoolsGranularity: 33554432 111 | switchNVNDefaultPoolsGranularity: 16777216 112 | switchNVNOtherPoolsGranularity: 16777216 113 | vulkanNumSwapchainBuffers: 3 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 | vrSettings: 129 | cardboard: 130 | depthFormat: 0 131 | enableTransitionView: 0 132 | daydream: 133 | depthFormat: 0 134 | useSustainedPerformanceMode: 0 135 | enableVideoLayer: 0 136 | useProtectedVideoMemory: 0 137 | minimumSupportedHeadTracking: 0 138 | maximumSupportedHeadTracking: 1 139 | hololens: 140 | depthFormat: 1 141 | depthBufferSharingEnabled: 1 142 | lumin: 143 | depthFormat: 0 144 | frameTiming: 2 145 | enableGLCache: 0 146 | glCacheMaxBlobSize: 524288 147 | glCacheMaxFileSize: 8388608 148 | oculus: 149 | sharedDepthBuffer: 1 150 | dashSupport: 1 151 | lowOverheadMode: 0 152 | protectedContext: 0 153 | v2Signing: 1 154 | enable360StereoCapture: 0 155 | isWsaHolographicRemotingEnabled: 0 156 | enableFrameTimingStats: 0 157 | useHDRDisplay: 0 158 | D3DHDRBitDepth: 0 159 | m_ColorGamuts: 00000000 160 | targetPixelDensity: 30 161 | resolutionScalingMode: 0 162 | androidSupportedAspectRatio: 1 163 | androidMaxAspectRatio: 2.1 164 | applicationIdentifier: {} 165 | buildNumber: {} 166 | AndroidBundleVersionCode: 1 167 | AndroidMinSdkVersion: 19 168 | AndroidTargetSdkVersion: 0 169 | AndroidPreferredInstallLocation: 1 170 | aotOptions: 171 | stripEngineCode: 1 172 | iPhoneStrippingLevel: 0 173 | iPhoneScriptCallOptimization: 0 174 | ForceInternetPermission: 0 175 | ForceSDCardPermission: 0 176 | CreateWallpaper: 0 177 | APKExpansionFiles: 0 178 | keepLoadedShadersAlive: 0 179 | StripUnusedMeshComponents: 1 180 | VertexChannelCompressionMask: 4054 181 | iPhoneSdkVersion: 988 182 | iOSTargetOSVersionString: 10.0 183 | tvOSSdkVersion: 0 184 | tvOSRequireExtendedGameController: 0 185 | tvOSTargetOSVersionString: 10.0 186 | uIPrerenderedIcon: 0 187 | uIRequiresPersistentWiFi: 0 188 | uIRequiresFullScreen: 1 189 | uIStatusBarHidden: 1 190 | uIExitOnSuspend: 0 191 | uIStatusBarStyle: 0 192 | iPhoneSplashScreen: {fileID: 0} 193 | iPhoneHighResSplashScreen: {fileID: 0} 194 | iPhoneTallHighResSplashScreen: {fileID: 0} 195 | iPhone47inSplashScreen: {fileID: 0} 196 | iPhone55inPortraitSplashScreen: {fileID: 0} 197 | iPhone55inLandscapeSplashScreen: {fileID: 0} 198 | iPhone58inPortraitSplashScreen: {fileID: 0} 199 | iPhone58inLandscapeSplashScreen: {fileID: 0} 200 | iPadPortraitSplashScreen: {fileID: 0} 201 | iPadHighResPortraitSplashScreen: {fileID: 0} 202 | iPadLandscapeSplashScreen: {fileID: 0} 203 | iPadHighResLandscapeSplashScreen: {fileID: 0} 204 | iPhone65inPortraitSplashScreen: {fileID: 0} 205 | iPhone65inLandscapeSplashScreen: {fileID: 0} 206 | iPhone61inPortraitSplashScreen: {fileID: 0} 207 | iPhone61inLandscapeSplashScreen: {fileID: 0} 208 | appleTVSplashScreen: {fileID: 0} 209 | appleTVSplashScreen2x: {fileID: 0} 210 | tvOSSmallIconLayers: [] 211 | tvOSSmallIconLayers2x: [] 212 | tvOSLargeIconLayers: [] 213 | tvOSLargeIconLayers2x: [] 214 | tvOSTopShelfImageLayers: [] 215 | tvOSTopShelfImageLayers2x: [] 216 | tvOSTopShelfImageWideLayers: [] 217 | tvOSTopShelfImageWideLayers2x: [] 218 | iOSLaunchScreenType: 0 219 | iOSLaunchScreenPortrait: {fileID: 0} 220 | iOSLaunchScreenLandscape: {fileID: 0} 221 | iOSLaunchScreenBackgroundColor: 222 | serializedVersion: 2 223 | rgba: 0 224 | iOSLaunchScreenFillPct: 100 225 | iOSLaunchScreenSize: 100 226 | iOSLaunchScreenCustomXibPath: 227 | iOSLaunchScreeniPadType: 0 228 | iOSLaunchScreeniPadImage: {fileID: 0} 229 | iOSLaunchScreeniPadBackgroundColor: 230 | serializedVersion: 2 231 | rgba: 0 232 | iOSLaunchScreeniPadFillPct: 100 233 | iOSLaunchScreeniPadSize: 100 234 | iOSLaunchScreeniPadCustomXibPath: 235 | iOSUseLaunchScreenStoryboard: 0 236 | iOSLaunchScreenCustomStoryboardPath: 237 | iOSDeviceRequirements: [] 238 | iOSURLSchemes: [] 239 | iOSBackgroundModes: 0 240 | iOSMetalForceHardShadows: 0 241 | metalEditorSupport: 1 242 | metalAPIValidation: 1 243 | iOSRenderExtraFrameOnPause: 0 244 | appleDeveloperTeamID: 245 | iOSManualSigningProvisioningProfileID: 246 | tvOSManualSigningProvisioningProfileID: 247 | iOSManualSigningProvisioningProfileType: 0 248 | tvOSManualSigningProvisioningProfileType: 0 249 | appleEnableAutomaticSigning: 0 250 | iOSRequireARKit: 0 251 | iOSAutomaticallyDetectAndAddCapabilities: 1 252 | appleEnableProMotion: 0 253 | clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea 254 | templatePackageId: com.unity.template.3d@4.2.5 255 | templateDefaultScene: Assets/Scenes/SampleScene.unity 256 | AndroidTargetArchitectures: 1 257 | AndroidSplashScreenScale: 0 258 | androidSplashScreen: {fileID: 0} 259 | AndroidKeystoreName: 260 | AndroidKeyaliasName: 261 | AndroidBuildApkPerCpuArchitecture: 0 262 | AndroidTVCompatibility: 0 263 | AndroidIsGame: 1 264 | AndroidEnableTango: 0 265 | androidEnableBanner: 1 266 | androidUseLowAccuracyLocation: 0 267 | androidUseCustomKeystore: 0 268 | m_AndroidBanners: 269 | - width: 320 270 | height: 180 271 | banner: {fileID: 0} 272 | androidGamepadSupportLevel: 0 273 | AndroidValidateAppBundleSize: 1 274 | AndroidAppBundleSizeToValidate: 150 275 | m_BuildTargetIcons: [] 276 | m_BuildTargetPlatformIcons: [] 277 | m_BuildTargetBatching: 278 | - m_BuildTarget: Standalone 279 | m_StaticBatching: 1 280 | m_DynamicBatching: 0 281 | - m_BuildTarget: tvOS 282 | m_StaticBatching: 1 283 | m_DynamicBatching: 0 284 | - m_BuildTarget: Android 285 | m_StaticBatching: 1 286 | m_DynamicBatching: 0 287 | - m_BuildTarget: iPhone 288 | m_StaticBatching: 1 289 | m_DynamicBatching: 0 290 | - m_BuildTarget: WebGL 291 | m_StaticBatching: 0 292 | m_DynamicBatching: 0 293 | m_BuildTargetGraphicsJobs: 294 | - m_BuildTarget: MacStandaloneSupport 295 | m_GraphicsJobs: 0 296 | - m_BuildTarget: Switch 297 | m_GraphicsJobs: 1 298 | - m_BuildTarget: MetroSupport 299 | m_GraphicsJobs: 1 300 | - m_BuildTarget: AppleTVSupport 301 | m_GraphicsJobs: 0 302 | - m_BuildTarget: BJMSupport 303 | m_GraphicsJobs: 1 304 | - m_BuildTarget: LinuxStandaloneSupport 305 | m_GraphicsJobs: 1 306 | - m_BuildTarget: PS4Player 307 | m_GraphicsJobs: 1 308 | - m_BuildTarget: iOSSupport 309 | m_GraphicsJobs: 0 310 | - m_BuildTarget: WindowsStandaloneSupport 311 | m_GraphicsJobs: 1 312 | - m_BuildTarget: XboxOnePlayer 313 | m_GraphicsJobs: 1 314 | - m_BuildTarget: LuminSupport 315 | m_GraphicsJobs: 0 316 | - m_BuildTarget: AndroidPlayer 317 | m_GraphicsJobs: 0 318 | - m_BuildTarget: WebGLSupport 319 | m_GraphicsJobs: 0 320 | m_BuildTargetGraphicsJobMode: 321 | - m_BuildTarget: PS4Player 322 | m_GraphicsJobMode: 0 323 | - m_BuildTarget: XboxOnePlayer 324 | m_GraphicsJobMode: 0 325 | m_BuildTargetGraphicsAPIs: 326 | - m_BuildTarget: AndroidPlayer 327 | m_APIs: 150000000b000000 328 | m_Automatic: 0 329 | - m_BuildTarget: iOSSupport 330 | m_APIs: 10000000 331 | m_Automatic: 1 332 | - m_BuildTarget: AppleTVSupport 333 | m_APIs: 10000000 334 | m_Automatic: 0 335 | - m_BuildTarget: WebGLSupport 336 | m_APIs: 0b000000 337 | m_Automatic: 1 338 | m_BuildTargetVRSettings: 339 | - m_BuildTarget: Standalone 340 | m_Enabled: 0 341 | m_Devices: 342 | - Oculus 343 | - OpenVR 344 | openGLRequireES31: 0 345 | openGLRequireES31AEP: 0 346 | openGLRequireES32: 0 347 | m_TemplateCustomTags: {} 348 | mobileMTRendering: 349 | Android: 1 350 | iPhone: 1 351 | tvOS: 1 352 | m_BuildTargetGroupLightmapEncodingQuality: [] 353 | m_BuildTargetGroupLightmapSettings: [] 354 | playModeTestRunnerEnabled: 0 355 | runPlayModeTestAsEditModeTest: 0 356 | actionOnDotNetUnhandledException: 1 357 | enableInternalProfiler: 0 358 | logObjCUncaughtExceptions: 1 359 | enableCrashReportAPI: 0 360 | cameraUsageDescription: 361 | locationUsageDescription: 362 | microphoneUsageDescription: 363 | switchNetLibKey: 364 | switchSocketMemoryPoolSize: 6144 365 | switchSocketAllocatorPoolSize: 128 366 | switchSocketConcurrencyLimit: 14 367 | switchScreenResolutionBehavior: 2 368 | switchUseCPUProfiler: 0 369 | switchApplicationID: 0x01004b9000490000 370 | switchNSODependencies: 371 | switchTitleNames_0: 372 | switchTitleNames_1: 373 | switchTitleNames_2: 374 | switchTitleNames_3: 375 | switchTitleNames_4: 376 | switchTitleNames_5: 377 | switchTitleNames_6: 378 | switchTitleNames_7: 379 | switchTitleNames_8: 380 | switchTitleNames_9: 381 | switchTitleNames_10: 382 | switchTitleNames_11: 383 | switchTitleNames_12: 384 | switchTitleNames_13: 385 | switchTitleNames_14: 386 | switchPublisherNames_0: 387 | switchPublisherNames_1: 388 | switchPublisherNames_2: 389 | switchPublisherNames_3: 390 | switchPublisherNames_4: 391 | switchPublisherNames_5: 392 | switchPublisherNames_6: 393 | switchPublisherNames_7: 394 | switchPublisherNames_8: 395 | switchPublisherNames_9: 396 | switchPublisherNames_10: 397 | switchPublisherNames_11: 398 | switchPublisherNames_12: 399 | switchPublisherNames_13: 400 | switchPublisherNames_14: 401 | switchIcons_0: {fileID: 0} 402 | switchIcons_1: {fileID: 0} 403 | switchIcons_2: {fileID: 0} 404 | switchIcons_3: {fileID: 0} 405 | switchIcons_4: {fileID: 0} 406 | switchIcons_5: {fileID: 0} 407 | switchIcons_6: {fileID: 0} 408 | switchIcons_7: {fileID: 0} 409 | switchIcons_8: {fileID: 0} 410 | switchIcons_9: {fileID: 0} 411 | switchIcons_10: {fileID: 0} 412 | switchIcons_11: {fileID: 0} 413 | switchIcons_12: {fileID: 0} 414 | switchIcons_13: {fileID: 0} 415 | switchIcons_14: {fileID: 0} 416 | switchSmallIcons_0: {fileID: 0} 417 | switchSmallIcons_1: {fileID: 0} 418 | switchSmallIcons_2: {fileID: 0} 419 | switchSmallIcons_3: {fileID: 0} 420 | switchSmallIcons_4: {fileID: 0} 421 | switchSmallIcons_5: {fileID: 0} 422 | switchSmallIcons_6: {fileID: 0} 423 | switchSmallIcons_7: {fileID: 0} 424 | switchSmallIcons_8: {fileID: 0} 425 | switchSmallIcons_9: {fileID: 0} 426 | switchSmallIcons_10: {fileID: 0} 427 | switchSmallIcons_11: {fileID: 0} 428 | switchSmallIcons_12: {fileID: 0} 429 | switchSmallIcons_13: {fileID: 0} 430 | switchSmallIcons_14: {fileID: 0} 431 | switchManualHTML: 432 | switchAccessibleURLs: 433 | switchLegalInformation: 434 | switchMainThreadStackSize: 1048576 435 | switchPresenceGroupId: 436 | switchLogoHandling: 0 437 | switchReleaseVersion: 0 438 | switchDisplayVersion: 1.0.0 439 | switchStartupUserAccount: 0 440 | switchTouchScreenUsage: 0 441 | switchSupportedLanguagesMask: 0 442 | switchLogoType: 0 443 | switchApplicationErrorCodeCategory: 444 | switchUserAccountSaveDataSize: 0 445 | switchUserAccountSaveDataJournalSize: 0 446 | switchApplicationAttribute: 0 447 | switchCardSpecSize: -1 448 | switchCardSpecClock: -1 449 | switchRatingsMask: 0 450 | switchRatingsInt_0: 0 451 | switchRatingsInt_1: 0 452 | switchRatingsInt_2: 0 453 | switchRatingsInt_3: 0 454 | switchRatingsInt_4: 0 455 | switchRatingsInt_5: 0 456 | switchRatingsInt_6: 0 457 | switchRatingsInt_7: 0 458 | switchRatingsInt_8: 0 459 | switchRatingsInt_9: 0 460 | switchRatingsInt_10: 0 461 | switchRatingsInt_11: 0 462 | switchRatingsInt_12: 0 463 | switchLocalCommunicationIds_0: 464 | switchLocalCommunicationIds_1: 465 | switchLocalCommunicationIds_2: 466 | switchLocalCommunicationIds_3: 467 | switchLocalCommunicationIds_4: 468 | switchLocalCommunicationIds_5: 469 | switchLocalCommunicationIds_6: 470 | switchLocalCommunicationIds_7: 471 | switchParentalControl: 0 472 | switchAllowsScreenshot: 1 473 | switchAllowsVideoCapturing: 1 474 | switchAllowsRuntimeAddOnContentInstall: 0 475 | switchDataLossConfirmation: 0 476 | switchUserAccountLockEnabled: 0 477 | switchSystemResourceMemory: 16777216 478 | switchSupportedNpadStyles: 22 479 | switchNativeFsCacheSize: 32 480 | switchIsHoldTypeHorizontal: 0 481 | switchSupportedNpadCount: 8 482 | switchSocketConfigEnabled: 0 483 | switchTcpInitialSendBufferSize: 32 484 | switchTcpInitialReceiveBufferSize: 64 485 | switchTcpAutoSendBufferSizeMax: 256 486 | switchTcpAutoReceiveBufferSizeMax: 256 487 | switchUdpSendBufferSize: 9 488 | switchUdpReceiveBufferSize: 42 489 | switchSocketBufferEfficiency: 4 490 | switchSocketInitializeEnabled: 1 491 | switchNetworkInterfaceManagerInitializeEnabled: 1 492 | switchPlayerConnectionEnabled: 1 493 | ps4NPAgeRating: 12 494 | ps4NPTitleSecret: 495 | ps4NPTrophyPackPath: 496 | ps4ParentalLevel: 11 497 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 498 | ps4Category: 0 499 | ps4MasterVersion: 01.00 500 | ps4AppVersion: 01.00 501 | ps4AppType: 0 502 | ps4ParamSfxPath: 503 | ps4VideoOutPixelFormat: 0 504 | ps4VideoOutInitialWidth: 1920 505 | ps4VideoOutBaseModeInitialWidth: 1920 506 | ps4VideoOutReprojectionRate: 60 507 | ps4PronunciationXMLPath: 508 | ps4PronunciationSIGPath: 509 | ps4BackgroundImagePath: 510 | ps4StartupImagePath: 511 | ps4StartupImagesFolder: 512 | ps4IconImagesFolder: 513 | ps4SaveDataImagePath: 514 | ps4SdkOverride: 515 | ps4BGMPath: 516 | ps4ShareFilePath: 517 | ps4ShareOverlayImagePath: 518 | ps4PrivacyGuardImagePath: 519 | ps4NPtitleDatPath: 520 | ps4RemotePlayKeyAssignment: -1 521 | ps4RemotePlayKeyMappingDir: 522 | ps4PlayTogetherPlayerCount: 0 523 | ps4EnterButtonAssignment: 1 524 | ps4ApplicationParam1: 0 525 | ps4ApplicationParam2: 0 526 | ps4ApplicationParam3: 0 527 | ps4ApplicationParam4: 0 528 | ps4DownloadDataSize: 0 529 | ps4GarlicHeapSize: 2048 530 | ps4ProGarlicHeapSize: 2560 531 | playerPrefsMaxSize: 32768 532 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 533 | ps4pnSessions: 1 534 | ps4pnPresence: 1 535 | ps4pnFriends: 1 536 | ps4pnGameCustomData: 1 537 | playerPrefsSupport: 0 538 | enableApplicationExit: 0 539 | resetTempFolder: 1 540 | restrictedAudioUsageRights: 0 541 | ps4UseResolutionFallback: 0 542 | ps4ReprojectionSupport: 0 543 | ps4UseAudio3dBackend: 0 544 | ps4SocialScreenEnabled: 0 545 | ps4ScriptOptimizationLevel: 0 546 | ps4Audio3dVirtualSpeakerCount: 14 547 | ps4attribCpuUsage: 0 548 | ps4PatchPkgPath: 549 | ps4PatchLatestPkgPath: 550 | ps4PatchChangeinfoPath: 551 | ps4PatchDayOne: 0 552 | ps4attribUserManagement: 0 553 | ps4attribMoveSupport: 0 554 | ps4attrib3DSupport: 0 555 | ps4attribShareSupport: 0 556 | ps4attribExclusiveVR: 0 557 | ps4disableAutoHideSplash: 0 558 | ps4videoRecordingFeaturesUsed: 0 559 | ps4contentSearchFeaturesUsed: 0 560 | ps4attribEyeToEyeDistanceSettingVR: 0 561 | ps4IncludedModules: [] 562 | ps4attribVROutputEnabled: 0 563 | monoEnv: 564 | splashScreenBackgroundSourceLandscape: {fileID: 0} 565 | splashScreenBackgroundSourcePortrait: {fileID: 0} 566 | blurSplashScreenBackground: 1 567 | spritePackerPolicy: 568 | webGLMemorySize: 16 569 | webGLExceptionSupport: 1 570 | webGLNameFilesAsHashes: 0 571 | webGLDataCaching: 1 572 | webGLDebugSymbols: 0 573 | webGLEmscriptenArgs: 574 | webGLModulesDirectory: 575 | webGLTemplate: APPLICATION:Default 576 | webGLAnalyzeBuildSize: 0 577 | webGLUseEmbeddedResources: 0 578 | webGLCompressionFormat: 1 579 | webGLLinkerTarget: 1 580 | webGLThreadsSupport: 0 581 | webGLWasmStreaming: 0 582 | scriptingDefineSymbols: {} 583 | platformArchitecture: {} 584 | scriptingBackend: {} 585 | il2cppCompilerConfiguration: {} 586 | managedStrippingLevel: {} 587 | incrementalIl2cppBuild: {} 588 | allowUnsafeCode: 0 589 | additionalIl2CppArgs: 590 | scriptingRuntimeVersion: 1 591 | gcIncremental: 0 592 | gcWBarrierValidation: 0 593 | apiCompatibilityLevelPerPlatform: {} 594 | m_RenderingPath: 1 595 | m_MobileRenderingPath: 1 596 | metroPackageName: Template_3D 597 | metroPackageVersion: 598 | metroCertificatePath: 599 | metroCertificatePassword: 600 | metroCertificateSubject: 601 | metroCertificateIssuer: 602 | metroCertificateNotAfter: 0000000000000000 603 | metroApplicationDescription: Template_3D 604 | wsaImages: {} 605 | metroTileShortName: 606 | metroTileShowName: 0 607 | metroMediumTileShowName: 0 608 | metroLargeTileShowName: 0 609 | metroWideTileShowName: 0 610 | metroSupportStreamingInstall: 0 611 | metroLastRequiredScene: 0 612 | metroDefaultTileSize: 1 613 | metroTileForegroundText: 2 614 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 615 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 616 | a: 1} 617 | metroSplashScreenUseBackgroundColor: 0 618 | platformCapabilities: {} 619 | metroTargetDeviceFamilies: {} 620 | metroFTAName: 621 | metroFTAFileTypes: [] 622 | metroProtocolName: 623 | XboxOneProductId: 624 | XboxOneUpdateKey: 625 | XboxOneSandboxId: 626 | XboxOneContentId: 627 | XboxOneTitleId: 628 | XboxOneSCId: 629 | XboxOneGameOsOverridePath: 630 | XboxOnePackagingOverridePath: 631 | XboxOneAppManifestOverridePath: 632 | XboxOneVersion: 1.0.0.0 633 | XboxOnePackageEncryption: 0 634 | XboxOnePackageUpdateGranularity: 2 635 | XboxOneDescription: 636 | XboxOneLanguage: 637 | - enus 638 | XboxOneCapability: [] 639 | XboxOneGameRating: {} 640 | XboxOneIsContentPackage: 0 641 | XboxOneEnableGPUVariability: 1 642 | XboxOneSockets: {} 643 | XboxOneSplashScreen: {fileID: 0} 644 | XboxOneAllowedProductIds: [] 645 | XboxOnePersistentLocalStorageSize: 0 646 | XboxOneXTitleMemory: 8 647 | XboxOneOverrideIdentityName: 648 | vrEditorSettings: 649 | daydream: 650 | daydreamIconForeground: {fileID: 0} 651 | daydreamIconBackground: {fileID: 0} 652 | cloudServicesEnabled: 653 | UNet: 1 654 | luminIcon: 655 | m_Name: 656 | m_ModelFolderPath: 657 | m_PortalFolderPath: 658 | luminCert: 659 | m_CertPath: 660 | m_SignPackage: 1 661 | luminIsChannelApp: 0 662 | luminVersion: 663 | m_VersionCode: 1 664 | m_VersionName: 665 | apiCompatibilityLevel: 6 666 | cloudProjectId: 667 | framebufferDepthMemorylessMode: 0 668 | projectName: 669 | organizationId: 670 | cloudEnabled: 0 671 | enableNativePlatformBackendsForNewInputSystem: 0 672 | disableOldInputManagerSupport: 0 673 | legacyClampBlendShapeWeights: 0 674 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2019.3.1f1 2 | m_EditorVersionWithRevision: 2019.3.1f1 (89d6087839c2) 3 | -------------------------------------------------------------------------------- /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 | Stadia: 5 227 | Standalone: 5 228 | WebGL: 3 229 | Windows Store Apps: 5 230 | XboxOne: 5 231 | iPhone: 2 232 | tvOS: 2 233 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ScrollRectLoop 2 | 3 | ## 介绍 4 | 5 | 在阅读UGUI源码的时候发现LayoutGroup已经帮忙做了有关ChildSize处理,所以基于UGUI的LayoutSystem,写了这个循环滚动列表。 6 | 7 | 如果对UGUI的LayoutSystem不是很了解的话,可以先看官方文档或者戳这里查看我的源码阅读笔记 8 | 9 | https://jechyang.github.io/2020/09/14/LayoutGroup%E4%BB%A5%E5%8F%8AContentSizeFitter/ 10 | 11 | 如果使用过程中有什么问题或者好的建议都可以给我提issue或者在博客底下评论。 12 | 13 | ## 设计思路 14 | 15 | 循环滚动列表设计的主要思路就是Content大小的计算以及每个Cell(格子)的位置记录,得到相关信息之后就可以根据ScrollRect在ViewRect中区域确定所需要渲染的Cell了。 16 | 17 | 这里基于UGUI的HorzontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup,写了对应的Loop版本,然后主要就是更改RebuildLayout中的四个流程方法,本来是根据ChildrenGameObjects来计算各种sizes的(preferred/min/flex size),这里直接改成使用设置的Models来进行计算。得到了content的sizes(min/preferred/flex)之后就可以利用ContentSizeFitter控件将ContentSize设置上去了,同时也得到了child相关的位置信息,同样存储在model中,这样在scrollrect滚动的过程中就知道要刷新哪些cell了。 18 | 19 | 这里的size设置是遵循ugui的布局的,因此不规则的列表也可以很好地显示(聊天之类的按照文字确认高度),如果是规则列表的话直接使用LoopGridLayout即可。 20 | 21 | ## 效果展示 22 | 23 | ![img](https://github.com/jechyang/ScrollRectLoop/blob/master/gif/scrollrectloop.gif) 24 | 25 | ## 使用步骤及示例 26 | 27 | - ScrollRect的component的挂载 28 | 29 | 首先ScrollRect上要挂载ScrollRectLoop组件,然后Content上要挂载所需要的XXXXLoopLayout以及ContentSizeFitter(用来设置Content的大小) 30 | 31 | - 在CellEnum.cs里声明CellType 32 | 33 | ```c# 34 | public enum CellEnum 35 | { 36 | Test, 37 | } 38 | ``` 39 | 40 | - 编写CellType对应的CellComponent以及CellModel。 41 | 42 | CellComponent即我们会挂在Cell上的Component,需要继承自BaseCell,到时候会调用流程方法**BuildData**并传入对应的CellModel,如下 43 | 44 | ```c# 45 | public class TestCell : BaseCell 46 | { 47 | private Text _testTxt; 48 | private void Awake() 49 | { 50 | BuildUI(); 51 | } 52 | 53 | private void BuildUI() 54 | { 55 | _testTxt = transform.Find("Text").GetComponent(); 56 | } 57 | 58 | public override void BuildData(BaseLoopModel model) 59 | { 60 | var testModel = model as TestModel; 61 | _testTxt.text = testModel.content; 62 | } 63 | } 64 | ``` 65 | 66 | CellModel也需要继承自BaseModel,然后只需要重写所对应的**CellType**属性即可,如下所示 67 | 68 | ```c# 69 | public class TestModel : BaseLoopModel 70 | { 71 | public string content; 72 | public override CellEnum CellType => CellEnum.Test; 73 | } 74 | ``` 75 | 76 | - 使用ScrollRectLoopComponent注册CellType对应的Prefab以及CellComponent 77 | 78 | ```c# 79 | _rectLoop = GetComponent(); 80 | _rectLoop.RegisterCell(CellEnum.Test,TestTrans.gameObject,typeof(TestCell)); 81 | ``` 82 | 83 | - 设置ScrollRectLoop对应的models,调用refreshView方法 84 | 85 | ```c# 86 | var models = GetTestModels(); 87 | _rectLoop.LoopModels = models; 88 | _rectLoop.RefreshView(); 89 | ``` 90 | 91 | 这些东西都在项目中的example这个文件夹中,如果有不清楚的地方可以直接打开项目进行查看。 92 | 93 | ## 其他方法 94 | 95 | 可以使用**ScrollToIndex**方法来跳转到指定index的cell。即gif中演示的效果,方法签名如下 96 | 97 | ```c# 98 | public void ScrollToIndex(int index,bool smoothMove = false,float duration = 0.1f) 99 | ``` 100 | 101 | smoothMove的话就会有个滑动效果,然后是在duration的时间内达到指定cell的位置 102 | 103 | 使用协程实现,监听了OnBeginDrag,如果检测到drag就会取消滑动的协程。 -------------------------------------------------------------------------------- /gif/scrollrectloop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jechyang/ScrollRectLoop/11291f14e115eeb6a656305131cb19efe2a533fa/gif/scrollrectloop.gif --------------------------------------------------------------------------------