范川铭

1.暂时性的增加一个简单计时器延迟播放小恐龙动画

Showing 57 changed files with 4575 additions and 0 deletions

Too many changes to show.

To preserve performance only 57 of 57+ files are displayed.

  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3 + <PropertyGroup>
  4 + <LangVersion>9.0</LangVersion>
  5 + <_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package</_TargetFrameworkDirectories>
  6 + <_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package</_FullFrameworkReferenceAssemblyPaths>
  7 + <DisableHandlePackageFileConflicts>true</DisableHandlePackageFileConflicts>
  8 + </PropertyGroup>
  9 + <PropertyGroup>
  10 + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
  11 + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
  12 + <ProductVersion>10.0.20506</ProductVersion>
  13 + <SchemaVersion>2.0</SchemaVersion>
  14 + <RootNamespace></RootNamespace>
  15 + <ProjectGuid>{f1e4050a-a996-fa57-5ce2-b8a1c321e1c1}</ProjectGuid>
  16 + <ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
  17 + <OutputType>Library</OutputType>
  18 + <AppDesignerFolder>Properties</AppDesignerFolder>
  19 + <AssemblyName>Assembly-CSharp-Editor-firstpass</AssemblyName>
  20 + <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
  21 + <FileAlignment>512</FileAlignment>
  22 + <BaseDirectory>.</BaseDirectory>
  23 + </PropertyGroup>
  24 + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  25 + <DebugSymbols>true</DebugSymbols>
  26 + <DebugType>full</DebugType>
  27 + <Optimize>false</Optimize>
  28 + <OutputPath>Temp\Bin\Debug\Assembly-CSharp-Editor-firstpass\</OutputPath>
  29 + <DefineConstants>UNITY_2022_3_53;UNITY_2022_3;UNITY_2022;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_2020_1_OR_NEWER;UNITY_2020_2_OR_NEWER;UNITY_2020_3_OR_NEWER;UNITY_2021_1_OR_NEWER;UNITY_2021_2_OR_NEWER;UNITY_2021_3_OR_NEWER;UNITY_2022_1_OR_NEWER;UNITY_2022_2_OR_NEWER;UNITY_2022_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_VIRTUALTEXTURING;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_EDITOR_GAME_SERVICES;ENABLE_UNITY_GAME_SERVICES_ANALYTICS_SUPPORT;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_GENERATE_NATIVE_PLUGINS_FOR_ASSEMBLIES_API;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_MANAGED_UNITYTLS;INCLUDE_DYNAMIC_GI;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;ENABLE_ACCELERATOR_CLIENT_DEBUGGING;ENABLE_NAVIGATION_PACKAGE_DEBUG_VISUALIZATION;ENABLE_NAVIGATION_HEIGHTMESH_RUNTIME_SUPPORT;ENABLE_NAVIGATION_UI_REQUIRES_PACKAGE;PLATFORM_STANDALONE;TEXTCORE_1_0_OR_NEWER;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;UNITY_UGP_API;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_NVIDIA;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;PLATFORM_UPDATES_TIME_OUTSIDE_OF_PLAYER_LOOP;GFXDEVICE_WAITFOREVENT_MESSAGEPUMP;PLATFORM_INITIALIZES_MEMORY_MANAGER_EXPLICITLY;ENABLE_MONO;NET_4_6;NET_UNITY_4_8;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;TEXTCORE_FONT_ENGINE_1_5_OR_NEWER;DOTWEEN;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER;UNITY_EDITOR_ONLY_COMPILATION</DefineConstants>
  30 + <ErrorReport>prompt</ErrorReport>
  31 + <WarningLevel>4</WarningLevel>
  32 + <NoWarn>0169,0649</NoWarn>
  33 + <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
  34 + <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
  35 + </PropertyGroup>
  36 + <PropertyGroup>
  37 + <NoConfig>true</NoConfig>
  38 + <NoStdLib>true</NoStdLib>
  39 + <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>
  40 + <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>
  41 + <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>
  42 + </PropertyGroup>
  43 + <ItemGroup>
  44 + <Analyzer Include="D:\UnityEditor\2022.3.53f1c1\Editor\Data\Tools\Unity.SourceGenerators\Unity.SourceGenerators.dll" />
  45 + <Analyzer Include="D:\UnityEditor\2022.3.53f1c1\Editor\Data\Tools\Unity.SourceGenerators\Unity.Properties.SourceGenerator.dll" />
  46 + </ItemGroup>
  47 + <ItemGroup>
  48 + <Compile Include="Assets\Plugins\CircularScrollingList\Editor\CircularScrollingListEditor.cs" />
  49 + <Reference Include="UnityEngine">
  50 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.dll</HintPath>
  51 + </Reference>
  52 + <Reference Include="UnityEngine.AIModule">
  53 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AIModule.dll</HintPath>
  54 + </Reference>
  55 + <Reference Include="UnityEngine.ARModule">
  56 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ARModule.dll</HintPath>
  57 + </Reference>
  58 + <Reference Include="UnityEngine.AccessibilityModule">
  59 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AccessibilityModule.dll</HintPath>
  60 + </Reference>
  61 + <Reference Include="UnityEngine.AndroidJNIModule">
  62 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AndroidJNIModule.dll</HintPath>
  63 + </Reference>
  64 + <Reference Include="UnityEngine.AnimationModule">
  65 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AnimationModule.dll</HintPath>
  66 + </Reference>
  67 + <Reference Include="UnityEngine.AssetBundleModule">
  68 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AssetBundleModule.dll</HintPath>
  69 + </Reference>
  70 + <Reference Include="UnityEngine.AudioModule">
  71 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.AudioModule.dll</HintPath>
  72 + </Reference>
  73 + <Reference Include="UnityEngine.ClothModule">
  74 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ClothModule.dll</HintPath>
  75 + </Reference>
  76 + <Reference Include="UnityEngine.ClusterInputModule">
  77 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterInputModule.dll</HintPath>
  78 + </Reference>
  79 + <Reference Include="UnityEngine.ClusterRendererModule">
  80 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterRendererModule.dll</HintPath>
  81 + </Reference>
  82 + <Reference Include="UnityEngine.ContentLoadModule">
  83 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ContentLoadModule.dll</HintPath>
  84 + </Reference>
  85 + <Reference Include="UnityEngine.CoreModule">
  86 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll</HintPath>
  87 + </Reference>
  88 + <Reference Include="UnityEngine.CrashReportingModule">
  89 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.CrashReportingModule.dll</HintPath>
  90 + </Reference>
  91 + <Reference Include="UnityEngine.DSPGraphModule">
  92 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.DSPGraphModule.dll</HintPath>
  93 + </Reference>
  94 + <Reference Include="UnityEngine.DirectorModule">
  95 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.DirectorModule.dll</HintPath>
  96 + </Reference>
  97 + <Reference Include="UnityEngine.GIModule">
  98 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.GIModule.dll</HintPath>
  99 + </Reference>
  100 + <Reference Include="UnityEngine.GameCenterModule">
  101 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.GameCenterModule.dll</HintPath>
  102 + </Reference>
  103 + <Reference Include="UnityEngine.GridModule">
  104 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.GridModule.dll</HintPath>
  105 + </Reference>
  106 + <Reference Include="UnityEngine.HotReloadModule">
  107 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.HotReloadModule.dll</HintPath>
  108 + </Reference>
  109 + <Reference Include="UnityEngine.IMGUIModule">
  110 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.IMGUIModule.dll</HintPath>
  111 + </Reference>
  112 + <Reference Include="UnityEngine.ImageConversionModule">
  113 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ImageConversionModule.dll</HintPath>
  114 + </Reference>
  115 + <Reference Include="UnityEngine.InputModule">
  116 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.InputModule.dll</HintPath>
  117 + </Reference>
  118 + <Reference Include="UnityEngine.InputLegacyModule">
  119 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.InputLegacyModule.dll</HintPath>
  120 + </Reference>
  121 + <Reference Include="UnityEngine.JSONSerializeModule">
  122 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.JSONSerializeModule.dll</HintPath>
  123 + </Reference>
  124 + <Reference Include="UnityEngine.LocalizationModule">
  125 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.LocalizationModule.dll</HintPath>
  126 + </Reference>
  127 + <Reference Include="UnityEngine.NVIDIAModule">
  128 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.NVIDIAModule.dll</HintPath>
  129 + </Reference>
  130 + <Reference Include="UnityEngine.ParticleSystemModule">
  131 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ParticleSystemModule.dll</HintPath>
  132 + </Reference>
  133 + <Reference Include="UnityEngine.PerformanceReportingModule">
  134 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.PerformanceReportingModule.dll</HintPath>
  135 + </Reference>
  136 + <Reference Include="UnityEngine.PhysicsModule">
  137 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.PhysicsModule.dll</HintPath>
  138 + </Reference>
  139 + <Reference Include="UnityEngine.Physics2DModule">
  140 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.Physics2DModule.dll</HintPath>
  141 + </Reference>
  142 + <Reference Include="UnityEngine.ProfilerModule">
  143 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ProfilerModule.dll</HintPath>
  144 + </Reference>
  145 + <Reference Include="UnityEngine.PropertiesModule">
  146 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.PropertiesModule.dll</HintPath>
  147 + </Reference>
  148 + <Reference Include="UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule">
  149 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll</HintPath>
  150 + </Reference>
  151 + <Reference Include="UnityEngine.ScreenCaptureModule">
  152 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.ScreenCaptureModule.dll</HintPath>
  153 + </Reference>
  154 + <Reference Include="UnityEngine.SharedInternalsModule">
  155 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SharedInternalsModule.dll</HintPath>
  156 + </Reference>
  157 + <Reference Include="UnityEngine.SpriteMaskModule">
  158 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteMaskModule.dll</HintPath>
  159 + </Reference>
  160 + <Reference Include="UnityEngine.SpriteShapeModule">
  161 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteShapeModule.dll</HintPath>
  162 + </Reference>
  163 + <Reference Include="UnityEngine.StreamingModule">
  164 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.StreamingModule.dll</HintPath>
  165 + </Reference>
  166 + <Reference Include="UnityEngine.SubstanceModule">
  167 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SubstanceModule.dll</HintPath>
  168 + </Reference>
  169 + <Reference Include="UnityEngine.SubsystemsModule">
  170 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.SubsystemsModule.dll</HintPath>
  171 + </Reference>
  172 + <Reference Include="UnityEngine.TLSModule">
  173 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TLSModule.dll</HintPath>
  174 + </Reference>
  175 + <Reference Include="UnityEngine.TerrainModule">
  176 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TerrainModule.dll</HintPath>
  177 + </Reference>
  178 + <Reference Include="UnityEngine.TerrainPhysicsModule">
  179 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TerrainPhysicsModule.dll</HintPath>
  180 + </Reference>
  181 + <Reference Include="UnityEngine.TextCoreFontEngineModule">
  182 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TextCoreFontEngineModule.dll</HintPath>
  183 + </Reference>
  184 + <Reference Include="UnityEngine.TextCoreTextEngineModule">
  185 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TextCoreTextEngineModule.dll</HintPath>
  186 + </Reference>
  187 + <Reference Include="UnityEngine.TextRenderingModule">
  188 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TextRenderingModule.dll</HintPath>
  189 + </Reference>
  190 + <Reference Include="UnityEngine.TilemapModule">
  191 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.TilemapModule.dll</HintPath>
  192 + </Reference>
  193 + <Reference Include="UnityEngine.UIModule">
  194 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UIModule.dll</HintPath>
  195 + </Reference>
  196 + <Reference Include="UnityEngine.UIElementsModule">
  197 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UIElementsModule.dll</HintPath>
  198 + </Reference>
  199 + <Reference Include="UnityEngine.UmbraModule">
  200 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UmbraModule.dll</HintPath>
  201 + </Reference>
  202 + <Reference Include="UnityEngine.UnityAnalyticsModule">
  203 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityAnalyticsModule.dll</HintPath>
  204 + </Reference>
  205 + <Reference Include="UnityEngine.UnityAnalyticsCommonModule">
  206 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityAnalyticsCommonModule.dll</HintPath>
  207 + </Reference>
  208 + <Reference Include="UnityEngine.UnityConnectModule">
  209 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityConnectModule.dll</HintPath>
  210 + </Reference>
  211 + <Reference Include="UnityEngine.UnityCurlModule">
  212 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityCurlModule.dll</HintPath>
  213 + </Reference>
  214 + <Reference Include="UnityEngine.UnityTestProtocolModule">
  215 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityTestProtocolModule.dll</HintPath>
  216 + </Reference>
  217 + <Reference Include="UnityEngine.UnityWebRequestModule">
  218 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestModule.dll</HintPath>
  219 + </Reference>
  220 + <Reference Include="UnityEngine.UnityWebRequestAssetBundleModule">
  221 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>
  222 + </Reference>
  223 + <Reference Include="UnityEngine.UnityWebRequestAudioModule">
  224 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAudioModule.dll</HintPath>
  225 + </Reference>
  226 + <Reference Include="UnityEngine.UnityWebRequestTextureModule">
  227 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestTextureModule.dll</HintPath>
  228 + </Reference>
  229 + <Reference Include="UnityEngine.UnityWebRequestWWWModule">
  230 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestWWWModule.dll</HintPath>
  231 + </Reference>
  232 + <Reference Include="UnityEngine.VFXModule">
  233 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VFXModule.dll</HintPath>
  234 + </Reference>
  235 + <Reference Include="UnityEngine.VRModule">
  236 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VRModule.dll</HintPath>
  237 + </Reference>
  238 + <Reference Include="UnityEngine.VehiclesModule">
  239 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VehiclesModule.dll</HintPath>
  240 + </Reference>
  241 + <Reference Include="UnityEngine.VideoModule">
  242 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VideoModule.dll</HintPath>
  243 + </Reference>
  244 + <Reference Include="UnityEngine.VirtualTexturingModule">
  245 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.VirtualTexturingModule.dll</HintPath>
  246 + </Reference>
  247 + <Reference Include="UnityEngine.WindModule">
  248 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.WindModule.dll</HintPath>
  249 + </Reference>
  250 + <Reference Include="UnityEngine.XRModule">
  251 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.XRModule.dll</HintPath>
  252 + </Reference>
  253 + <Reference Include="UnityEditor">
  254 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.dll</HintPath>
  255 + </Reference>
  256 + <Reference Include="UnityEditor.CoreModule">
  257 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.CoreModule.dll</HintPath>
  258 + </Reference>
  259 + <Reference Include="UnityEditor.DeviceSimulatorModule">
  260 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.DeviceSimulatorModule.dll</HintPath>
  261 + </Reference>
  262 + <Reference Include="UnityEditor.DiagnosticsModule">
  263 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.DiagnosticsModule.dll</HintPath>
  264 + </Reference>
  265 + <Reference Include="UnityEditor.EditorToolbarModule">
  266 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.EditorToolbarModule.dll</HintPath>
  267 + </Reference>
  268 + <Reference Include="UnityEditor.GraphViewModule">
  269 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.GraphViewModule.dll</HintPath>
  270 + </Reference>
  271 + <Reference Include="UnityEditor.PresetsUIModule">
  272 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.PresetsUIModule.dll</HintPath>
  273 + </Reference>
  274 + <Reference Include="UnityEditor.QuickSearchModule">
  275 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.QuickSearchModule.dll</HintPath>
  276 + </Reference>
  277 + <Reference Include="UnityEditor.SceneTemplateModule">
  278 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.SceneTemplateModule.dll</HintPath>
  279 + </Reference>
  280 + <Reference Include="UnityEditor.SceneViewModule">
  281 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.SceneViewModule.dll</HintPath>
  282 + </Reference>
  283 + <Reference Include="UnityEditor.TextCoreFontEngineModule">
  284 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.TextCoreFontEngineModule.dll</HintPath>
  285 + </Reference>
  286 + <Reference Include="UnityEditor.TextCoreTextEngineModule">
  287 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.TextCoreTextEngineModule.dll</HintPath>
  288 + </Reference>
  289 + <Reference Include="UnityEditor.UIBuilderModule">
  290 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UIBuilderModule.dll</HintPath>
  291 + </Reference>
  292 + <Reference Include="UnityEditor.UIElementsModule">
  293 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsModule.dll</HintPath>
  294 + </Reference>
  295 + <Reference Include="UnityEditor.UIElementsSamplesModule">
  296 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsSamplesModule.dll</HintPath>
  297 + </Reference>
  298 + <Reference Include="UnityEditor.UnityConnectModule">
  299 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEditor.UnityConnectModule.dll</HintPath>
  300 + </Reference>
  301 + <Reference Include="UnityEditor.Graphs">
  302 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEditor.Graphs.dll</HintPath>
  303 + </Reference>
  304 + <Reference Include="UnityEditor.WebGL.Extensions">
  305 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\WebGLSupport\UnityEditor.WebGL.Extensions.dll</HintPath>
  306 + </Reference>
  307 + <Reference Include="UnityEditor.Android.Extensions">
  308 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\UnityEditor.Android.Extensions.dll</HintPath>
  309 + </Reference>
  310 + <Reference Include="UnityEditor.WindowsStandalone.Extensions">
  311 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\WindowsStandaloneSupport\UnityEditor.WindowsStandalone.Extensions.dll</HintPath>
  312 + </Reference>
  313 + <Reference Include="Unity.VisualScripting.YamlDotNet">
  314 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Editor\VisualScripting.Core\Dependencies\YamlDotNet\Unity.VisualScripting.YamlDotNet.dll</HintPath>
  315 + </Reference>
  316 + <Reference Include="ReportGeneratorMerged">
  317 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.testtools.codecoverage@1.2.6\lib\ReportGenerator\ReportGeneratorMerged.dll</HintPath>
  318 + </Reference>
  319 + <Reference Include="unityplastic">
  320 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\unityplastic.dll</HintPath>
  321 + </Reference>
  322 + <Reference Include="Unity.Plastic.Antlr3.Runtime">
  323 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\Unity.Plastic.Antlr3.Runtime.dll</HintPath>
  324 + </Reference>
  325 + <Reference Include="DOTweenEditor">
  326 + <HintPath>D:\U3DFrameWork\Assets\Plugins\Demigiant\DOTween\Editor\DOTweenEditor.dll</HintPath>
  327 + </Reference>
  328 + <Reference Include="Unity.Plastic.Newtonsoft.Json">
  329 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\Unity.Plastic.Newtonsoft.Json.dll</HintPath>
  330 + </Reference>
  331 + <Reference Include="log4netPlastic">
  332 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.collab-proxy@2.7.1\Lib\Editor\log4netPlastic.dll</HintPath>
  333 + </Reference>
  334 + <Reference Include="Unity.VisualScripting.IonicZip">
  335 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Editor\VisualScripting.Core\Dependencies\DotNetZip\Unity.VisualScripting.IonicZip.dll</HintPath>
  336 + </Reference>
  337 + <Reference Include="DOTween">
  338 + <HintPath>D:\U3DFrameWork\Assets\Plugins\Demigiant\DOTween\DOTween.dll</HintPath>
  339 + </Reference>
  340 + <Reference Include="Unity.VisualScripting.Antlr3.Runtime">
  341 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Runtime\VisualScripting.Flow\Dependencies\NCalc\Unity.VisualScripting.Antlr3.Runtime.dll</HintPath>
  342 + </Reference>
  343 + <Reference Include="DOTweenUpgradeManager">
  344 + <HintPath>D:\U3DFrameWork\Assets\Plugins\Demigiant\DOTween\Editor\DOTweenUpgradeManager.dll</HintPath>
  345 + </Reference>
  346 + <Reference Include="Unity.VisualScripting.TextureAssets">
  347 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.visualscripting@1.9.4\Editor\VisualScripting.Core\EditorAssetResources\Unity.VisualScripting.TextureAssets.dll</HintPath>
  348 + </Reference>
  349 + <Reference Include="nunit.framework">
  350 + <HintPath>D:\U3DFrameWork\Library\PackageCache\com.unity.ext.nunit@1.0.6\net35\unity-custom\nunit.framework.dll</HintPath>
  351 + </Reference>
  352 + <Reference Include="Unity.Android.Types">
  353 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Unity.Android.Types.dll</HintPath>
  354 + </Reference>
  355 + <Reference Include="Unity.Android.Gradle">
  356 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Unity.Android.Gradle.dll</HintPath>
  357 + </Reference>
  358 + <Reference Include="Unity.Android.GradleProject">
  359 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Unity.Android.GradleProject.dll</HintPath>
  360 + </Reference>
  361 + <Reference Include="mscorlib">
  362 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\mscorlib.dll</HintPath>
  363 + </Reference>
  364 + <Reference Include="System">
  365 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.dll</HintPath>
  366 + </Reference>
  367 + <Reference Include="System.Core">
  368 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Core.dll</HintPath>
  369 + </Reference>
  370 + <Reference Include="System.Runtime.Serialization">
  371 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Runtime.Serialization.dll</HintPath>
  372 + </Reference>
  373 + <Reference Include="System.Xml">
  374 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Xml.dll</HintPath>
  375 + </Reference>
  376 + <Reference Include="System.Xml.Linq">
  377 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Xml.Linq.dll</HintPath>
  378 + </Reference>
  379 + <Reference Include="System.Numerics">
  380 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Numerics.dll</HintPath>
  381 + </Reference>
  382 + <Reference Include="System.Numerics.Vectors">
  383 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Numerics.Vectors.dll</HintPath>
  384 + </Reference>
  385 + <Reference Include="System.Net.Http">
  386 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Net.Http.dll</HintPath>
  387 + </Reference>
  388 + <Reference Include="System.IO.Compression">
  389 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.IO.Compression.dll</HintPath>
  390 + </Reference>
  391 + <Reference Include="Microsoft.CSharp">
  392 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Microsoft.CSharp.dll</HintPath>
  393 + </Reference>
  394 + <Reference Include="System.Data">
  395 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Data.dll</HintPath>
  396 + </Reference>
  397 + <Reference Include="System.Data.DataSetExtensions">
  398 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Data.DataSetExtensions.dll</HintPath>
  399 + </Reference>
  400 + <Reference Include="System.Drawing">
  401 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Drawing.dll</HintPath>
  402 + </Reference>
  403 + <Reference Include="System.IO.Compression.FileSystem">
  404 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.IO.Compression.FileSystem.dll</HintPath>
  405 + </Reference>
  406 + <Reference Include="System.ComponentModel.Composition">
  407 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.ComponentModel.Composition.dll</HintPath>
  408 + </Reference>
  409 + <Reference Include="System.Transactions">
  410 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\System.Transactions.dll</HintPath>
  411 + </Reference>
  412 + <Reference Include="Microsoft.Win32.Primitives">
  413 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\Microsoft.Win32.Primitives.dll</HintPath>
  414 + </Reference>
  415 + <Reference Include="netstandard">
  416 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\netstandard.dll</HintPath>
  417 + </Reference>
  418 + <Reference Include="System.AppContext">
  419 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.AppContext.dll</HintPath>
  420 + </Reference>
  421 + <Reference Include="System.Buffers">
  422 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Buffers.dll</HintPath>
  423 + </Reference>
  424 + <Reference Include="System.Collections.Concurrent">
  425 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.Concurrent.dll</HintPath>
  426 + </Reference>
  427 + <Reference Include="System.Collections">
  428 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.dll</HintPath>
  429 + </Reference>
  430 + <Reference Include="System.Collections.NonGeneric">
  431 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.NonGeneric.dll</HintPath>
  432 + </Reference>
  433 + <Reference Include="System.Collections.Specialized">
  434 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Collections.Specialized.dll</HintPath>
  435 + </Reference>
  436 + <Reference Include="System.ComponentModel.Annotations">
  437 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.Annotations.dll</HintPath>
  438 + </Reference>
  439 + <Reference Include="System.ComponentModel">
  440 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.dll</HintPath>
  441 + </Reference>
  442 + <Reference Include="System.ComponentModel.EventBasedAsync">
  443 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.EventBasedAsync.dll</HintPath>
  444 + </Reference>
  445 + <Reference Include="System.ComponentModel.Primitives">
  446 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.Primitives.dll</HintPath>
  447 + </Reference>
  448 + <Reference Include="System.ComponentModel.TypeConverter">
  449 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ComponentModel.TypeConverter.dll</HintPath>
  450 + </Reference>
  451 + <Reference Include="System.Console">
  452 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Console.dll</HintPath>
  453 + </Reference>
  454 + <Reference Include="System.Data.Common">
  455 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Data.Common.dll</HintPath>
  456 + </Reference>
  457 + <Reference Include="System.Diagnostics.Contracts">
  458 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Contracts.dll</HintPath>
  459 + </Reference>
  460 + <Reference Include="System.Diagnostics.Debug">
  461 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Debug.dll</HintPath>
  462 + </Reference>
  463 + <Reference Include="System.Diagnostics.FileVersionInfo">
  464 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.FileVersionInfo.dll</HintPath>
  465 + </Reference>
  466 + <Reference Include="System.Diagnostics.Process">
  467 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Process.dll</HintPath>
  468 + </Reference>
  469 + <Reference Include="System.Diagnostics.StackTrace">
  470 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.StackTrace.dll</HintPath>
  471 + </Reference>
  472 + <Reference Include="System.Diagnostics.TextWriterTraceListener">
  473 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.TextWriterTraceListener.dll</HintPath>
  474 + </Reference>
  475 + <Reference Include="System.Diagnostics.Tools">
  476 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.Tools.dll</HintPath>
  477 + </Reference>
  478 + <Reference Include="System.Diagnostics.TraceSource">
  479 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Diagnostics.TraceSource.dll</HintPath>
  480 + </Reference>
  481 + <Reference Include="System.Drawing.Primitives">
  482 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Drawing.Primitives.dll</HintPath>
  483 + </Reference>
  484 + <Reference Include="System.Dynamic.Runtime">
  485 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Dynamic.Runtime.dll</HintPath>
  486 + </Reference>
  487 + <Reference Include="System.Globalization.Calendars">
  488 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.Calendars.dll</HintPath>
  489 + </Reference>
  490 + <Reference Include="System.Globalization">
  491 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.dll</HintPath>
  492 + </Reference>
  493 + <Reference Include="System.Globalization.Extensions">
  494 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Globalization.Extensions.dll</HintPath>
  495 + </Reference>
  496 + <Reference Include="System.IO.Compression.ZipFile">
  497 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.Compression.ZipFile.dll</HintPath>
  498 + </Reference>
  499 + <Reference Include="System.IO">
  500 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.dll</HintPath>
  501 + </Reference>
  502 + <Reference Include="System.IO.FileSystem">
  503 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.dll</HintPath>
  504 + </Reference>
  505 + <Reference Include="System.IO.FileSystem.DriveInfo">
  506 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.DriveInfo.dll</HintPath>
  507 + </Reference>
  508 + <Reference Include="System.IO.FileSystem.Primitives">
  509 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.Primitives.dll</HintPath>
  510 + </Reference>
  511 + <Reference Include="System.IO.FileSystem.Watcher">
  512 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.FileSystem.Watcher.dll</HintPath>
  513 + </Reference>
  514 + <Reference Include="System.IO.IsolatedStorage">
  515 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.IsolatedStorage.dll</HintPath>
  516 + </Reference>
  517 + <Reference Include="System.IO.MemoryMappedFiles">
  518 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.MemoryMappedFiles.dll</HintPath>
  519 + </Reference>
  520 + <Reference Include="System.IO.Pipes">
  521 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.Pipes.dll</HintPath>
  522 + </Reference>
  523 + <Reference Include="System.IO.UnmanagedMemoryStream">
  524 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.IO.UnmanagedMemoryStream.dll</HintPath>
  525 + </Reference>
  526 + <Reference Include="System.Linq">
  527 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.dll</HintPath>
  528 + </Reference>
  529 + <Reference Include="System.Linq.Expressions">
  530 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Expressions.dll</HintPath>
  531 + </Reference>
  532 + <Reference Include="System.Linq.Parallel">
  533 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Parallel.dll</HintPath>
  534 + </Reference>
  535 + <Reference Include="System.Linq.Queryable">
  536 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Linq.Queryable.dll</HintPath>
  537 + </Reference>
  538 + <Reference Include="System.Memory">
  539 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Memory.dll</HintPath>
  540 + </Reference>
  541 + <Reference Include="System.Net.Http.Rtc">
  542 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Http.Rtc.dll</HintPath>
  543 + </Reference>
  544 + <Reference Include="System.Net.NameResolution">
  545 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.NameResolution.dll</HintPath>
  546 + </Reference>
  547 + <Reference Include="System.Net.NetworkInformation">
  548 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.NetworkInformation.dll</HintPath>
  549 + </Reference>
  550 + <Reference Include="System.Net.Ping">
  551 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Ping.dll</HintPath>
  552 + </Reference>
  553 + <Reference Include="System.Net.Primitives">
  554 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Primitives.dll</HintPath>
  555 + </Reference>
  556 + <Reference Include="System.Net.Requests">
  557 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Requests.dll</HintPath>
  558 + </Reference>
  559 + <Reference Include="System.Net.Security">
  560 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Security.dll</HintPath>
  561 + </Reference>
  562 + <Reference Include="System.Net.Sockets">
  563 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.Sockets.dll</HintPath>
  564 + </Reference>
  565 + <Reference Include="System.Net.WebHeaderCollection">
  566 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebHeaderCollection.dll</HintPath>
  567 + </Reference>
  568 + <Reference Include="System.Net.WebSockets.Client">
  569 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebSockets.Client.dll</HintPath>
  570 + </Reference>
  571 + <Reference Include="System.Net.WebSockets">
  572 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Net.WebSockets.dll</HintPath>
  573 + </Reference>
  574 + <Reference Include="System.ObjectModel">
  575 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ObjectModel.dll</HintPath>
  576 + </Reference>
  577 + <Reference Include="System.Reflection.DispatchProxy">
  578 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.DispatchProxy.dll</HintPath>
  579 + </Reference>
  580 + <Reference Include="System.Reflection">
  581 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.dll</HintPath>
  582 + </Reference>
  583 + <Reference Include="System.Reflection.Emit">
  584 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.dll</HintPath>
  585 + </Reference>
  586 + <Reference Include="System.Reflection.Emit.ILGeneration">
  587 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.ILGeneration.dll</HintPath>
  588 + </Reference>
  589 + <Reference Include="System.Reflection.Emit.Lightweight">
  590 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Emit.Lightweight.dll</HintPath>
  591 + </Reference>
  592 + <Reference Include="System.Reflection.Extensions">
  593 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Extensions.dll</HintPath>
  594 + </Reference>
  595 + <Reference Include="System.Reflection.Primitives">
  596 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Reflection.Primitives.dll</HintPath>
  597 + </Reference>
  598 + <Reference Include="System.Resources.Reader">
  599 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.Reader.dll</HintPath>
  600 + </Reference>
  601 + <Reference Include="System.Resources.ResourceManager">
  602 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.ResourceManager.dll</HintPath>
  603 + </Reference>
  604 + <Reference Include="System.Resources.Writer">
  605 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Resources.Writer.dll</HintPath>
  606 + </Reference>
  607 + <Reference Include="System.Runtime.CompilerServices.VisualC">
  608 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.CompilerServices.VisualC.dll</HintPath>
  609 + </Reference>
  610 + <Reference Include="System.Runtime">
  611 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.dll</HintPath>
  612 + </Reference>
  613 + <Reference Include="System.Runtime.Extensions">
  614 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Extensions.dll</HintPath>
  615 + </Reference>
  616 + <Reference Include="System.Runtime.Handles">
  617 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Handles.dll</HintPath>
  618 + </Reference>
  619 + <Reference Include="System.Runtime.InteropServices">
  620 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.dll</HintPath>
  621 + </Reference>
  622 + <Reference Include="System.Runtime.InteropServices.RuntimeInformation">
  623 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
  624 + </Reference>
  625 + <Reference Include="System.Runtime.InteropServices.WindowsRuntime">
  626 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.InteropServices.WindowsRuntime.dll</HintPath>
  627 + </Reference>
  628 + <Reference Include="System.Runtime.Numerics">
  629 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Numerics.dll</HintPath>
  630 + </Reference>
  631 + <Reference Include="System.Runtime.Serialization.Formatters">
  632 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Formatters.dll</HintPath>
  633 + </Reference>
  634 + <Reference Include="System.Runtime.Serialization.Json">
  635 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Json.dll</HintPath>
  636 + </Reference>
  637 + <Reference Include="System.Runtime.Serialization.Primitives">
  638 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Primitives.dll</HintPath>
  639 + </Reference>
  640 + <Reference Include="System.Runtime.Serialization.Xml">
  641 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Runtime.Serialization.Xml.dll</HintPath>
  642 + </Reference>
  643 + <Reference Include="System.Security.Claims">
  644 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Claims.dll</HintPath>
  645 + </Reference>
  646 + <Reference Include="System.Security.Cryptography.Algorithms">
  647 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Algorithms.dll</HintPath>
  648 + </Reference>
  649 + <Reference Include="System.Security.Cryptography.Csp">
  650 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Csp.dll</HintPath>
  651 + </Reference>
  652 + <Reference Include="System.Security.Cryptography.Encoding">
  653 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Encoding.dll</HintPath>
  654 + </Reference>
  655 + <Reference Include="System.Security.Cryptography.Primitives">
  656 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.Primitives.dll</HintPath>
  657 + </Reference>
  658 + <Reference Include="System.Security.Cryptography.X509Certificates">
  659 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Cryptography.X509Certificates.dll</HintPath>
  660 + </Reference>
  661 + <Reference Include="System.Security.Principal">
  662 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.Principal.dll</HintPath>
  663 + </Reference>
  664 + <Reference Include="System.Security.SecureString">
  665 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Security.SecureString.dll</HintPath>
  666 + </Reference>
  667 + <Reference Include="System.ServiceModel.Duplex">
  668 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Duplex.dll</HintPath>
  669 + </Reference>
  670 + <Reference Include="System.ServiceModel.Http">
  671 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Http.dll</HintPath>
  672 + </Reference>
  673 + <Reference Include="System.ServiceModel.NetTcp">
  674 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.NetTcp.dll</HintPath>
  675 + </Reference>
  676 + <Reference Include="System.ServiceModel.Primitives">
  677 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Primitives.dll</HintPath>
  678 + </Reference>
  679 + <Reference Include="System.ServiceModel.Security">
  680 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ServiceModel.Security.dll</HintPath>
  681 + </Reference>
  682 + <Reference Include="System.Text.Encoding">
  683 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.Encoding.dll</HintPath>
  684 + </Reference>
  685 + <Reference Include="System.Text.Encoding.Extensions">
  686 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.Encoding.Extensions.dll</HintPath>
  687 + </Reference>
  688 + <Reference Include="System.Text.RegularExpressions">
  689 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Text.RegularExpressions.dll</HintPath>
  690 + </Reference>
  691 + <Reference Include="System.Threading">
  692 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.dll</HintPath>
  693 + </Reference>
  694 + <Reference Include="System.Threading.Overlapped">
  695 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Overlapped.dll</HintPath>
  696 + </Reference>
  697 + <Reference Include="System.Threading.Tasks">
  698 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.dll</HintPath>
  699 + </Reference>
  700 + <Reference Include="System.Threading.Tasks.Extensions">
  701 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.Extensions.dll</HintPath>
  702 + </Reference>
  703 + <Reference Include="System.Threading.Tasks.Parallel">
  704 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Tasks.Parallel.dll</HintPath>
  705 + </Reference>
  706 + <Reference Include="System.Threading.Thread">
  707 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Thread.dll</HintPath>
  708 + </Reference>
  709 + <Reference Include="System.Threading.ThreadPool">
  710 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.ThreadPool.dll</HintPath>
  711 + </Reference>
  712 + <Reference Include="System.Threading.Timer">
  713 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Threading.Timer.dll</HintPath>
  714 + </Reference>
  715 + <Reference Include="System.ValueTuple">
  716 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.ValueTuple.dll</HintPath>
  717 + </Reference>
  718 + <Reference Include="System.Xml.ReaderWriter">
  719 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.ReaderWriter.dll</HintPath>
  720 + </Reference>
  721 + <Reference Include="System.Xml.XDocument">
  722 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XDocument.dll</HintPath>
  723 + </Reference>
  724 + <Reference Include="System.Xml.XmlDocument">
  725 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XmlDocument.dll</HintPath>
  726 + </Reference>
  727 + <Reference Include="System.Xml.XmlSerializer">
  728 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XmlSerializer.dll</HintPath>
  729 + </Reference>
  730 + <Reference Include="System.Xml.XPath">
  731 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XPath.dll</HintPath>
  732 + </Reference>
  733 + <Reference Include="System.Xml.XPath.XDocument">
  734 + <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\UnityReferenceAssemblies\unity-4.8-api\Facades\System.Xml.XPath.XDocument.dll</HintPath>
  735 + </Reference>
  736 + <Reference Include="UnityEngine.TestRunner">
  737 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEngine.TestRunner.dll</HintPath>
  738 + </Reference>
  739 + <Reference Include="UnityEditor.TestRunner">
  740 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEditor.TestRunner.dll</HintPath>
  741 + </Reference>
  742 + <Reference Include="Unity.Timeline">
  743 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Timeline.dll</HintPath>
  744 + </Reference>
  745 + <Reference Include="Unity.TestTools.CodeCoverage.Editor.OpenCover.Mono.Reflection">
  746 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TestTools.CodeCoverage.Editor.OpenCover.Mono.Reflection.dll</HintPath>
  747 + </Reference>
  748 + <Reference Include="UnityEngine.UI">
  749 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEngine.UI.dll</HintPath>
  750 + </Reference>
  751 + <Reference Include="Unity.EditorCoroutines.Editor">
  752 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.EditorCoroutines.Editor.dll</HintPath>
  753 + </Reference>
  754 + <Reference Include="Unity.VisualScripting.SettingsProvider.Editor">
  755 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.SettingsProvider.Editor.dll</HintPath>
  756 + </Reference>
  757 + <Reference Include="Unity.Performance.Profile-Analyzer.Editor">
  758 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Performance.Profile-Analyzer.Editor.dll</HintPath>
  759 + </Reference>
  760 + <Reference Include="Unity.TestTools.CodeCoverage.Editor">
  761 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TestTools.CodeCoverage.Editor.dll</HintPath>
  762 + </Reference>
  763 + <Reference Include="Unity.TestTools.CodeCoverage.Editor.OpenCover.Model">
  764 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TestTools.CodeCoverage.Editor.OpenCover.Model.dll</HintPath>
  765 + </Reference>
  766 + <Reference Include="Unity.PlasticSCM.Editor">
  767 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.PlasticSCM.Editor.dll</HintPath>
  768 + </Reference>
  769 + <Reference Include="Unity.VisualScripting.State.Editor">
  770 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.State.Editor.dll</HintPath>
  771 + </Reference>
  772 + <Reference Include="Unity.Timeline.Editor">
  773 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Timeline.Editor.dll</HintPath>
  774 + </Reference>
  775 + <Reference Include="Unity.VisualScripting.Shared.Editor">
  776 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Shared.Editor.dll</HintPath>
  777 + </Reference>
  778 + <Reference Include="Unity.VisualStudio.Editor">
  779 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualStudio.Editor.dll</HintPath>
  780 + </Reference>
  781 + <Reference Include="Unity.TextMeshPro">
  782 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TextMeshPro.dll</HintPath>
  783 + </Reference>
  784 + <Reference Include="Unity.VisualScripting.Core">
  785 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Core.dll</HintPath>
  786 + </Reference>
  787 + <Reference Include="Unity.TextMeshPro.Editor">
  788 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.TextMeshPro.Editor.dll</HintPath>
  789 + </Reference>
  790 + <Reference Include="UnityEditor.UI">
  791 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\UnityEditor.UI.dll</HintPath>
  792 + </Reference>
  793 + <Reference Include="Unity.VisualScripting.Core.Editor">
  794 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Core.Editor.dll</HintPath>
  795 + </Reference>
  796 + <Reference Include="Unity.Rider.Editor">
  797 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.Rider.Editor.dll</HintPath>
  798 + </Reference>
  799 + <Reference Include="Unity.VisualScripting.State">
  800 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.State.dll</HintPath>
  801 + </Reference>
  802 + <Reference Include="Unity.VSCode.Editor">
  803 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VSCode.Editor.dll</HintPath>
  804 + </Reference>
  805 + <Reference Include="Unity.VisualScripting.Flow">
  806 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Flow.dll</HintPath>
  807 + </Reference>
  808 + <Reference Include="Unity.VisualScripting.Flow.Editor">
  809 + <HintPath>D:\U3DFrameWork\Library\ScriptAssemblies\Unity.VisualScripting.Flow.Editor.dll</HintPath>
  810 + </Reference>
  811 + </ItemGroup>
  812 + <ItemGroup>
  813 + <ProjectReference Include="Assembly-CSharp-firstpass.csproj">
  814 + <Project>{0fb0da77-85a4-96d4-1dc2-8ddaab877745}</Project>
  815 + <Name>Assembly-CSharp-firstpass</Name>
  816 + </ProjectReference>
  817 + <ProjectReference Include="IngameDebugConsole.Editor.csproj">
  818 + <Project>{9b47dfc7-464c-e716-7c49-c01c25245e7d}</Project>
  819 + <Name>IngameDebugConsole.Editor</Name>
  820 + </ProjectReference>
  821 + <ProjectReference Include="IngameDebugConsole.Runtime.csproj">
  822 + <Project>{f455341b-6302-350b-c7b4-f9a38305d0ae}</Project>
  823 + <Name>IngameDebugConsole.Runtime</Name>
  824 + </ProjectReference>
  825 + </ItemGroup>
  826 + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  827 + <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
  828 + Other similar extension points exist, see Microsoft.Common.targets.
  829 + <Target Name="BeforeBuild">
  830 + </Target>
  831 + <Target Name="AfterBuild">
  832 + </Target>
  833 + -->
  834 +</Project>
@@ -45,14 +45,64 @@ @@ -45,14 +45,64 @@
45 <Analyzer Include="D:\UnityEditor\2022.3.53f1c1\Editor\Data\Tools\Unity.SourceGenerators\Unity.Properties.SourceGenerator.dll" /> 45 <Analyzer Include="D:\UnityEditor\2022.3.53f1c1\Editor\Data\Tools\Unity.SourceGenerators\Unity.Properties.SourceGenerator.dll" />
46 </ItemGroup> 46 </ItemGroup>
47 <ItemGroup> 47 <ItemGroup>
  48 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\IntListBank.cs" />
  49 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\SpriteStringListBank.cs" />
  50 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\IListMovementProcessor.cs" />
  51 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\IBoxTransformController.cs" />
  52 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\DistanceMovementCurve.cs" />
  53 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListBank.cs" />
  54 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ContentManagement\IListContent.cs" />
48 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModulePhysics2D.cs" /> 55 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModulePhysics2D.cs" />
49 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUnityVersion.cs" /> 56 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUnityVersion.cs" />
  57 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\IntListContent.cs" />
  58 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\StringStarListBank.cs" />
50 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModulePhysics.cs" /> 59 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModulePhysics.cs" />
51 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleEPOOutline.cs" /> 60 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleEPOOutline.cs" />
  61 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\10-SelectionMovement\Scripts\ListIteration.cs" />
  62 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\IMovementCurve.cs" />
  63 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\InputProcessing\InputProcessor.cs" />
  64 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\ListMovementProcessor.cs" />
  65 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\FocusingBoxFinder.cs" />
  66 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\ListStateProcessorManager.cs" />
  67 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\Util\DeltaTimeCurve.cs" />
  68 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\08-ListRefreshing\Scripts\AdjustableStringListBank.cs" />
52 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUtils.cs" /> 69 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUtils.cs" />
  70 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\IMovementCtrl.cs" />
  71 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListSetting.cs" />
  72 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\IListBank.cs" />
  73 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\FPSLimiter.cs" />
  74 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ContentManagement\ContentIDState.cs" />
  75 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\UnitMovementCtrl.cs" />
  76 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\ColorStrListBox.cs" />
  77 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\ListFocusingState.cs" />
53 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleAudio.cs" /> 78 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleAudio.cs" />
  79 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\07-LateInitialization\Scripts\LateInitialization.cs" />
  80 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\Util\FactorUtility.cs" />
  81 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\StringStarListBox.cs" />
  82 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\BoxPositionState.cs" />
  83 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\Util\RangeMappingCurve.cs" />
  84 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListSetupData.cs" />
  85 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\VelocityMovementCurve.cs" />
  86 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\ColorStrListBank.cs" />
  87 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\05-CustomContent\Scripts\SpriteStringListBox.cs" />
54 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleSprite.cs" /> 88 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleSprite.cs" />
  89 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\ListBoxController.cs" />
  90 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\06-ListEvents\Scripts\ListEventDemo.cs" />
  91 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\CircularScrollingList.cs" />
  92 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListBoxSetting.cs" />
  93 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\IListBox.cs" />
  94 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\08-ListRefreshing\Scripts\StringListBox.cs" />
  95 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\IListBoxController.cs" />
  96 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\InputProcessing\InputInfo.cs" />
  97 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ContentManagement\ListContentProvider.cs" />
  98 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\00-Common\Scripts\IntListBox.cs" />
  99 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\MovementUtility.cs" />
  100 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListBox.cs" />
  101 + <Compile Include="Assets\Plugins\CircularScrollingList\_Demo\11-InteractingByScript\Scripts\ListInteraction.cs" />
  102 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\FreeMovementCtrl.cs" />
55 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUI.cs" /> 103 <Compile Include="Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUI.cs" />
  104 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListStateProcessing\Linear\Controller\BoxTransformController.cs" />
  105 + <Compile Include="Assets\Plugins\CircularScrollingList\Scripts\ListEvent.cs" />
56 <None Include="Assets\Plugins\Demigiant\DOTween\readme.txt" /> 106 <None Include="Assets\Plugins\Demigiant\DOTween\readme.txt" />
57 <Reference Include="UnityEngine"> 107 <Reference Include="UnityEngine">
58 <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.dll</HintPath> 108 <HintPath>D:\UnityEditor\2022.3.53f1c1\Editor\Data\Managed\UnityEngine\UnityEngine.dll</HintPath>
@@ -49,11 +49,14 @@ @@ -49,11 +49,14 @@
49 <Compile Include="Assets\Scripts\UI\Test3.cs" /> 49 <Compile Include="Assets\Scripts\UI\Test3.cs" />
50 <Compile Include="Assets\Scripts\Common\Singleton.cs" /> 50 <Compile Include="Assets\Scripts\Common\Singleton.cs" />
51 <Compile Include="Assets\Scripts\Manager\UIManager.cs" /> 51 <Compile Include="Assets\Scripts\Manager\UIManager.cs" />
  52 + <Compile Include="Assets\Scripts\ScrollView\ItemUI.cs" />
52 <Compile Include="Assets\Scripts\UI\Test2.cs" /> 53 <Compile Include="Assets\Scripts\UI\Test2.cs" />
53 <Compile Include="Assets\Scripts\Common\UIBase.cs" /> 54 <Compile Include="Assets\Scripts\Common\UIBase.cs" />
54 <Compile Include="Assets\Scripts\Main.cs" /> 55 <Compile Include="Assets\Scripts\Main.cs" />
55 <Compile Include="Assets\Scripts\UI\Test1.cs" /> 56 <Compile Include="Assets\Scripts\UI\Test1.cs" />
  57 + <Compile Include="Assets\Scripts\ScrollView\CustomListComponent.cs" />
56 <Compile Include="Assets\Scripts\Manager\ResourcesManager.cs" /> 58 <Compile Include="Assets\Scripts\Manager\ResourcesManager.cs" />
  59 + <Compile Include="Assets\Scripts\ScrollViewTest.cs" />
57 <Compile Include="Assets\Scripts\Manager\AudioManager.cs" /> 60 <Compile Include="Assets\Scripts\Manager\AudioManager.cs" />
58 <Compile Include="Assets\Scripts\Manager\UIAnimation.cs" /> 61 <Compile Include="Assets\Scripts\Manager\UIAnimation.cs" />
59 <Reference Include="UnityEngine"> 62 <Reference Include="UnityEngine">
  1 +fileFormatVersion: 2
  2 +guid: c4702c1f0a2004f4eb2ad526888939b5
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +# Change Log
  2 +
  3 +### [CircularList_v6.2] - 2023.05.17
  4 +
  5 +**Added**
  6 +
  7 +- Add `OnBoxMoved` to `ListBox`
  8 +
  9 +### [CircularList_v6.1] - 2023.04.06
  10 +
  11 +**Added**
  12 +
  13 +- Add `OnInitialized` to `ListBox`
  14 +
  15 +**Fixed**
  16 +
  17 +- Incorrect box state when refreshing the list with top/bottom focusing
  18 +
  19 +### [CircularList_v6] - 2023.03.25
  20 +
  21 +**Added**
  22 +
  23 +- Add events
  24 + - `OnBoxSelected`
  25 + - `OnFocusingBoxChanged`
  26 +- Allow multi-control modes at the same time
  27 +- Support 3 different focusing posiiton
  28 +- Support the list to be stopped at the top or the bottom
  29 +- Support layout preview in the editor
  30 +- Support runtime setup and initialization
  31 +- Stop the movement by the script
  32 +- Toggle the interaction of the list by the script
  33 +- Get the the boxes in the list and the list which the box belongs to
  34 +
  35 +**Changed**
  36 +
  37 +- Code refactoring a lot
  38 +- Arrange the demo scenes
  39 +- Arrange the displaying order of options
  40 +- Rename options
  41 + - The setting "Setting" -> "ListSetting"
  42 + - The mode "Drag" -> "Pointer"
  43 + - The option "Align Middle" -> "Align At Focusing Position"
  44 + - The option "Reverse Direction" -> "Reverse Scrolling Direction"
  45 + - The option "Centered Content ID" -> "Init Focusing Content ID"
  46 + - The option "Center Selected Box" -> "Focus Selected Box"
  47 + - The option "Reverse Order" -> "Reverse Content Order"
  48 +- Rename properties
  49 + - Capitalize the first character of properties
  50 +
  51 +**Fixed**
  52 +
  53 +- Incorrect layout when the list moves too fast
  54 +- Incorrect aligning position for even number of boxes
  55 +
  56 +**Removed**
  57 +
  58 +- Remove events
  59 + - `OnBoxClick`
  60 + - `OnCenteredContentChanged`
  61 +- Remove "Assign References of Bank and Boxes" option from the context menu
  62 +
  63 +### [CircularList_v5.1] - 2021.11.11
  64 +
  65 +**Fixed**
  66 +
  67 +- Fix the incorrect behaviour of the linear-function mode
  68 +
  69 +### [CircularList_v5] - 2021.08.05
  70 +
  71 +**Added**
  72 +
  73 +- Support custom type of the list box and list bank
  74 +- Support dynamic list contents, also 0 content
  75 +- Add new options
  76 + - Reverse scrolling direction
  77 + - Reverse order
  78 + - Center selected box
  79 + - Initialize on start
  80 +- Add new events
  81 + - `OnCenteredContentChanged`
  82 + - `OnMovementEnd`
  83 +- Select the list content from the script
  84 +- Image sorting - The centered box will be in front of the others.
  85 +
  86 +**Changed**
  87 +
  88 +- All the related classes are in the namespace `AirFishLab.ScrollingList`.
  89 +- Change setup class from `ListPositionCtrl` to `CircularScrollingList`
  90 +- Change the x range of the list position curve and list scale curve from [0, 1] to [-1, 1]
  91 +- Separate the curve used for list velocity and list movement
  92 +- The layout of the list is decided by the width/height of the rect transform.
  93 +- Improve the calculation of the dragging velocity
  94 +- Code refactoring
  95 +- The supported Unity version is 2018.4+ (C# 6.0+)
  96 +
  97 +### [CircularList_v4] - 2020.09.01
  98 +
  99 +**Added**
  100 +
  101 +- Use `AnimationCurve` to define the layout and the movement of the list
  102 +
  103 +**Changed**
  104 +
  105 +- Improve the movement
  106 +- Improve the inspector view for the list
  107 +- Rename mode "Button" to "Function"
  108 +
  109 +### [CircularList_v3] - 2019.06.09
  110 +
  111 +**Added**
  112 +
  113 +- Use Unity's event system to detect the input events
  114 +- Add linear mode
  115 +- Add control mode: Mouse Wheel (thanks to @aledg)
  116 +- Add OnBoxClick event for receiving the content ID of the selected box
  117 +- Add BaseListBank for creating independent list banks
  118 +- Support multiple lists in the same scene
  119 +
  120 +### [CircularList_v2.2] - 2019.01.08
  121 +
  122 +**Added**
  123 +
  124 +- Able to scroll the list by the mouse wheel
  125 +- Able to set the initial ID of the centered content
  126 +
  127 +**Fixed**
  128 +
  129 +- Fix the list won't be centered in the Button Mode when the up/down button is clicked too quickly.
  130 +
  131 +### [CircularList_v2] - 2017.09.30
  132 +
  133 +First release of circular scrolling list
  1 +fileFormatVersion: 2
  2 +guid: 712c5f1290a753844a9fbb871c30966e
  3 +TextScriptImporter:
  4 + externalObjects: {}
  5 + userData:
  6 + assetBundleName:
  7 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: 455b15c8a28d12b4bbb4840e8f69eb61
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +%YAML 1.1
  2 +%TAG !u! tag:unity3d.com,2011:
  3 +--- !u!114 &1
  4 +MonoBehaviour:
  5 + m_ObjectHideFlags: 52
  6 + m_CorrespondingSourceObject: {fileID: 0}
  7 + m_PrefabInstance: {fileID: 0}
  8 + m_PrefabAsset: {fileID: 0}
  9 + m_GameObject: {fileID: 0}
  10 + m_Enabled: 1
  11 + m_EditorHideFlags: 0
  12 + m_Script: {fileID: 12322, guid: 0000000000000000e000000000000000, type: 0}
  13 + m_Name: BoxCurvePresets
  14 + m_EditorClassIdentifier:
  15 + m_Presets:
  16 + - m_Name: Position_HalfCurve
  17 + m_Curve:
  18 + serializedVersion: 2
  19 + m_Curve:
  20 + - serializedVersion: 3
  21 + time: -1
  22 + value: 0
  23 + inSlope: 0.5
  24 + outSlope: 0.5
  25 + tangentMode: 34
  26 + weightedMode: 0
  27 + inWeight: 0
  28 + outWeight: 0.33333334
  29 + - serializedVersion: 3
  30 + time: 0
  31 + value: 0.5
  32 + inSlope: 0
  33 + outSlope: 0
  34 + tangentMode: 34
  35 + weightedMode: 0
  36 + inWeight: 0.33333334
  37 + outWeight: 0.33333334
  38 + - serializedVersion: 3
  39 + time: 1
  40 + value: 0
  41 + inSlope: -0.5
  42 + outSlope: -0.5
  43 + tangentMode: 34
  44 + weightedMode: 0
  45 + inWeight: 0.33333334
  46 + outWeight: 0
  47 + m_PreInfinity: 2
  48 + m_PostInfinity: 2
  49 + m_RotationOrder: 4
  50 + - m_Name: Position_SineCurve
  51 + m_Curve:
  52 + serializedVersion: 2
  53 + m_Curve:
  54 + - serializedVersion: 3
  55 + time: -1
  56 + value: 0
  57 + inSlope: 1.3471838
  58 + outSlope: 1.3471838
  59 + tangentMode: 0
  60 + weightedMode: 0
  61 + inWeight: 0
  62 + outWeight: 0.28449523
  63 + - serializedVersion: 3
  64 + time: -0.5
  65 + value: 0.5
  66 + inSlope: 0
  67 + outSlope: 0
  68 + tangentMode: 0
  69 + weightedMode: 0
  70 + inWeight: 0.33333334
  71 + outWeight: 0.33333334
  72 + - serializedVersion: 3
  73 + time: 0
  74 + value: 0
  75 + inSlope: -1.3768258
  76 + outSlope: -1.3768258
  77 + tangentMode: 0
  78 + weightedMode: 0
  79 + inWeight: 0.21422008
  80 + outWeight: 0.18656707
  81 + - serializedVersion: 3
  82 + time: 0.5
  83 + value: -0.5
  84 + inSlope: 0
  85 + outSlope: 0
  86 + tangentMode: 0
  87 + weightedMode: 0
  88 + inWeight: 0.33333334
  89 + outWeight: 0.33333334
  90 + - serializedVersion: 3
  91 + time: 1
  92 + value: 0
  93 + inSlope: 1.8056066
  94 + outSlope: 1.8056066
  95 + tangentMode: 0
  96 + weightedMode: 0
  97 + inWeight: 0.28912723
  98 + outWeight: 0
  99 + m_PreInfinity: 2
  100 + m_PostInfinity: 2
  101 + m_RotationOrder: 4
  102 + - m_Name: Position_Middle
  103 + m_Curve:
  104 + serializedVersion: 2
  105 + m_Curve:
  106 + - serializedVersion: 3
  107 + time: -1
  108 + value: 0
  109 + inSlope: 0
  110 + outSlope: 0
  111 + tangentMode: 0
  112 + weightedMode: 0
  113 + inWeight: 0
  114 + outWeight: 0
  115 + - serializedVersion: 3
  116 + time: 1
  117 + value: 0
  118 + inSlope: 0
  119 + outSlope: 0
  120 + tangentMode: 0
  121 + weightedMode: 0
  122 + inWeight: 0
  123 + outWeight: 0
  124 + m_PreInfinity: 2
  125 + m_PostInfinity: 2
  126 + m_RotationOrder: 4
  127 + - m_Name: Scale_LargeMiddle
  128 + m_Curve:
  129 + serializedVersion: 2
  130 + m_Curve:
  131 + - serializedVersion: 3
  132 + time: -1
  133 + value: 1
  134 + inSlope: 0
  135 + outSlope: 0
  136 + tangentMode: 0
  137 + weightedMode: 0
  138 + inWeight: 0
  139 + outWeight: 0
  140 + - serializedVersion: 3
  141 + time: 0
  142 + value: 1.5
  143 + inSlope: 0
  144 + outSlope: 0
  145 + tangentMode: 0
  146 + weightedMode: 0
  147 + inWeight: 0.33333334
  148 + outWeight: 0.33333334
  149 + - serializedVersion: 3
  150 + time: 1
  151 + value: 1
  152 + inSlope: 0
  153 + outSlope: 0
  154 + tangentMode: 0
  155 + weightedMode: 0
  156 + inWeight: 0
  157 + outWeight: 0
  158 + m_PreInfinity: 2
  159 + m_PostInfinity: 2
  160 + m_RotationOrder: 4
  161 + - m_Name: Scale_OneKind
  162 + m_Curve:
  163 + serializedVersion: 2
  164 + m_Curve:
  165 + - serializedVersion: 3
  166 + time: -1
  167 + value: 1
  168 + inSlope: 0
  169 + outSlope: 0
  170 + tangentMode: 0
  171 + weightedMode: 0
  172 + inWeight: 0
  173 + outWeight: 0
  174 + - serializedVersion: 3
  175 + time: 1
  176 + value: 1
  177 + inSlope: 0
  178 + outSlope: 0
  179 + tangentMode: 0
  180 + weightedMode: 0
  181 + inWeight: 0
  182 + outWeight: 0
  183 + m_PreInfinity: 2
  184 + m_PostInfinity: 2
  185 + m_RotationOrder: 4
  186 + - m_Name: Movement_VelocityRelated
  187 + m_Curve:
  188 + serializedVersion: 2
  189 + m_Curve:
  190 + - serializedVersion: 3
  191 + time: 0
  192 + value: 1
  193 + inSlope: -2.665783
  194 + outSlope: -2.665783
  195 + tangentMode: 0
  196 + weightedMode: 0
  197 + inWeight: 0
  198 + outWeight: 0.048507463
  199 + - serializedVersion: 3
  200 + time: 1
  201 + value: 0
  202 + inSlope: -0.028004175
  203 + outSlope: -0.028004175
  204 + tangentMode: 0
  205 + weightedMode: 0
  206 + inWeight: 0.10261196
  207 + outWeight: 0
  208 + m_PreInfinity: 2
  209 + m_PostInfinity: 2
  210 + m_RotationOrder: 4
  211 + - m_Name: Movement_PositionRelated
  212 + m_Curve:
  213 + serializedVersion: 2
  214 + m_Curve:
  215 + - serializedVersion: 3
  216 + time: 0
  217 + value: 0
  218 + inSlope: 10.214248
  219 + outSlope: 10.214248
  220 + tangentMode: 0
  221 + weightedMode: 0
  222 + inWeight: 0
  223 + outWeight: 0.04838854
  224 + - serializedVersion: 3
  225 + time: 0.25
  226 + value: 1
  227 + inSlope: -0.000001252862
  228 + outSlope: -0.000001252862
  229 + tangentMode: 0
  230 + weightedMode: 0
  231 + inWeight: 0.09514958
  232 + outWeight: 0
  233 + m_PreInfinity: 2
  234 + m_PostInfinity: 2
  235 + m_RotationOrder: 4
  1 +fileFormatVersion: 2
  2 +guid: 596c0779ff9bf3649a52d5e9e885d626
  3 +NativeFormatImporter:
  4 + externalObjects: {}
  5 + mainObjectFileID: 0
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +using UnityEditor;
  2 +using UnityEngine;
  3 +
  4 +namespace AirFishLab.ScrollingList.Editor
  5 +{
  6 + [CustomEditor(typeof(CircularScrollingList))]
  7 + [CanEditMultipleObjects]
  8 + public class CircularScrollingListEditor : UnityEditor.Editor
  9 + {
  10 + private bool _toGenerateBoxes;
  11 +
  12 + public override void OnInspectorGUI()
  13 + {
  14 + serializedObject.Update();
  15 +
  16 + DrawPropertyField("_listBank");
  17 + DrawBoxSetting();
  18 + DrawListSetting();
  19 +
  20 + if (_toGenerateBoxes)
  21 + GenerateBoxesAndArrange();
  22 +
  23 + serializedObject.ApplyModifiedProperties();
  24 + }
  25 +
  26 + private void DrawPropertyField(string path, bool includeChildren = false)
  27 + {
  28 + EditorGUILayout.PropertyField(
  29 + serializedObject.FindProperty(path), includeChildren);
  30 + }
  31 +
  32 + #region Box Property Drawer
  33 +
  34 + private SerializedProperty _boxSettingProperty;
  35 +
  36 + private SerializedProperty GetBoxSettingProperty(string path)
  37 + {
  38 + return _boxSettingProperty.FindPropertyRelative(path);
  39 + }
  40 +
  41 + private void DrawBoxSettingProperty(string path)
  42 + {
  43 + EditorGUILayout.PropertyField(GetBoxSettingProperty(path));
  44 + }
  45 +
  46 + private void DrawBoxSetting()
  47 + {
  48 + _boxSettingProperty = serializedObject.FindProperty("_boxSetting");
  49 + _boxSettingProperty.isExpanded =
  50 + EditorGUILayout.Foldout(_boxSettingProperty.isExpanded, "Box Setting");
  51 + if (!_boxSettingProperty.isExpanded)
  52 + return;
  53 +
  54 + ++EditorGUI.indentLevel;
  55 +
  56 + DrawBoxSettingProperty("_boxRootTransform");
  57 + DrawBoxSettingProperty("_boxPrefab");
  58 + DrawBoxSettingProperty("_numOfBoxes");
  59 + _toGenerateBoxes = GUILayout.Button(
  60 + new GUIContent(
  61 + "Generate Boxes and Arrange",
  62 + "Generate the boxes under the specified box root transform and "
  63 + + "arrange them according to the list setting"));
  64 +
  65 + DrawListBoxes();
  66 +
  67 + --EditorGUI.indentLevel;
  68 + }
  69 +
  70 + private void DrawListBoxes()
  71 + {
  72 + const string showBoxesText = "Show the Boxes";
  73 + const string hideBoxesText = "Hide the Boxes";
  74 +
  75 + var listBoxesProperty = serializedObject.FindProperty("_listBoxes");
  76 + var toShowBoxes = listBoxesProperty.isExpanded;
  77 + if (GUILayout.Button(toShowBoxes ? hideBoxesText : showBoxesText)) {
  78 + toShowBoxes = !toShowBoxes;
  79 + listBoxesProperty.isExpanded = toShowBoxes;
  80 + }
  81 +
  82 + if (toShowBoxes)
  83 + DrawPropertyField("_listBoxes", true);
  84 + }
  85 +
  86 + #endregion
  87 +
  88 + #region List Setting Property Drawer
  89 +
  90 + private SerializedProperty _listSettingProperty;
  91 + private SerializedProperty _focusingPosition;
  92 + private SerializedProperty _controlMode;
  93 +
  94 + private SerializedProperty GetListSettingProperty(string path)
  95 + {
  96 + return _listSettingProperty.FindPropertyRelative(path);
  97 + }
  98 +
  99 + private void DrawListSettingProperty(string path)
  100 + {
  101 + EditorGUILayout.PropertyField(GetListSettingProperty(path));
  102 + }
  103 +
  104 + private void DrawListSetting()
  105 + {
  106 + _listSettingProperty = serializedObject.FindProperty("_listSetting");
  107 + _listSettingProperty.isExpanded =
  108 + EditorGUILayout.Foldout(_listSettingProperty.isExpanded, "List Setting");
  109 + if (!_listSettingProperty.isExpanded)
  110 + return;
  111 +
  112 + ++EditorGUI.indentLevel;
  113 +
  114 + _focusingPosition = GetListSettingProperty("_focusingPosition");
  115 + _controlMode = GetListSettingProperty("_controlMode");
  116 + DrawListMode();
  117 + EditorGUILayout.Space();
  118 + DrawListAppearance();
  119 + EditorGUILayout.Space();
  120 + DrawEvents();
  121 +
  122 + --EditorGUI.indentLevel;
  123 + }
  124 +
  125 + private void DrawListMode()
  126 + {
  127 + EditorGUILayout.LabelField("List Mode", EditorStyles.boldLabel);
  128 + DrawListSettingProperty("_listType");
  129 + DrawListSettingProperty("_direction");
  130 + DrawListSettingProperty("_controlMode");
  131 +
  132 + ++EditorGUI.indentLevel;
  133 + if (HasFlag(
  134 + _controlMode.intValue,
  135 + (int)CircularScrollingList.ControlMode.Pointer)) {
  136 + DrawListSettingProperty("_alignAtFocusingPosition");
  137 + }
  138 +
  139 + if (HasFlag(
  140 + _controlMode.intValue,
  141 + (int)CircularScrollingList.ControlMode.MouseWheel)) {
  142 + DrawListSettingProperty("_reverseScrollingDirection");
  143 + }
  144 + --EditorGUI.indentLevel;
  145 +
  146 + DrawListSettingProperty("_focusingPosition");
  147 +
  148 + ++EditorGUI.indentLevel;
  149 + if (_focusingPosition.intValue ==
  150 + (int)CircularScrollingList.FocusingPosition.Center)
  151 + DrawListSettingProperty("_reverseContentOrder");
  152 + --EditorGUI.indentLevel;
  153 +
  154 + DrawListSettingProperty("_initFocusingContentID");
  155 + DrawListSettingProperty("_focusSelectedBox");
  156 + DrawListSettingProperty("_initializeOnStart");
  157 + }
  158 +
  159 + private void DrawListAppearance()
  160 + {
  161 + EditorGUILayout.LabelField("List Appearance", EditorStyles.boldLabel);
  162 + DrawListSettingProperty("_boxDensity");
  163 + DrawListSettingProperty("_boxPositionCurve");
  164 + DrawListSettingProperty("_boxScaleCurve");
  165 + if (HasFlag(
  166 + _controlMode.intValue,
  167 + (int)CircularScrollingList.ControlMode.Pointer))
  168 + DrawListSettingProperty("_boxVelocityCurve");
  169 + DrawListSettingProperty("_boxMovementCurve");
  170 + }
  171 +
  172 + private void DrawEvents()
  173 + {
  174 + var boldFoldout =
  175 + new GUIStyle(EditorStyles.foldout) {
  176 + fontStyle = FontStyle.Bold
  177 + };
  178 +
  179 + var onBoxSelected = GetListSettingProperty("_onBoxSelected");
  180 + onBoxSelected.isExpanded =
  181 + EditorGUILayout.Foldout(
  182 + onBoxSelected.isExpanded, "List Events", true, boldFoldout);
  183 +
  184 + if (!onBoxSelected.isExpanded)
  185 + return;
  186 +
  187 + ++EditorGUI.indentLevel;
  188 + DrawListSettingProperty("_onBoxSelected");
  189 + DrawListSettingProperty("_onFocusingBoxChanged");
  190 + DrawListSettingProperty("_onMovementEnd");
  191 + --EditorGUI.indentLevel;
  192 + }
  193 +
  194 + #endregion
  195 +
  196 + #region Generate Boxes
  197 +
  198 + private void GenerateBoxesAndArrange()
  199 + {
  200 + var scrollingList = target as CircularScrollingList;
  201 + if (!scrollingList)
  202 + return;
  203 +
  204 + Undo.RecordObject(scrollingList, "Generate Boxes and Arrange");
  205 + scrollingList.GenerateBoxesAndArrange();
  206 + }
  207 +
  208 + #endregion
  209 +
  210 + #region Utility
  211 +
  212 + private bool HasFlag(int enumIntValue, int flagValue)
  213 + {
  214 + return (enumIntValue & flagValue) != 0;
  215 + }
  216 +
  217 + #endregion
  218 + }
  219 +}
  1 +fileFormatVersion: 2
  2 +guid: b4cf2c0d8a8536d44a450ecc475aafe0
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +# Circular Scrolling List
  2 +
  3 +<img src="./ReadmeData~/list_outline_demo.gif" width=350px />
  4 +
  5 +The quick overview of version 6 - [Demo video](https://youtu.be/6y-_MaeWIAg)
  6 +
  7 +## Outline
  8 +
  9 +- [Circular Scrolling List](#circular-scrolling-list)
  10 + - [Outline](#outline)
  11 + - [Features](#features)
  12 + - [Setting](#setting)
  13 + - [Box Setting](#box-setting)
  14 + - [List Setting](#list-setting)
  15 + - [List Mode](#list-mode)
  16 + - [List Appearance](#list-appearance)
  17 + - [List Events](#list-events)
  18 + - [How to Use](#how-to-use)
  19 + - [Setup the List](#setup-the-list)
  20 + - [Set the Layout Area](#set-the-layout-area)
  21 + - [Set the Control Mode](#set-the-control-mode)
  22 + - [Set the Focusing Position](#set-the-focusing-position)
  23 + - [Appearance Curves](#appearance-curves)
  24 + - [Curve Presets](#curve-presets)
  25 + - [`ListBank` and `ListBox`](#listbank-and-listbox)
  26 + - [Custom `ListBank`](#custom-listbank)
  27 + - [Custom `ListBox`](#custom-listbox)
  28 + - [Use Them in the List](#use-them-in-the-list)
  29 + - [Pass Data of Primitive Type](#pass-data-of-primitive-type)
  30 + - [List Events](#list-events-1)
  31 + - [`OnBoxSelected` Event](#onboxselected-event)
  32 + - [`OnFocusingBoxChanged` Event](#onfocusingboxchanged-event)
  33 + - [Manually Get the Focusing Box](#manually-get-the-focusing-box)
  34 + - [`OnMovementEnd` event](#onmovementend-event)
  35 + - [Box Events](#box-events)
  36 + - [`OnInitialized` event](#oninitialized-event)
  37 + - [`OnBoxMoved` event](#onboxmoved-event)
  38 + - [Script Operations](#script-operations)
  39 + - [Late Initialization](#late-initialization)
  40 + - [Toggle List Interaction](#toggle-list-interaction)
  41 + - [Select the Content](#select-the-content)
  42 + - [Refresh the List](#refresh-the-list)
  43 + - [Stop the Movement](#stop-the-movement)
  44 +
  45 +## Features
  46 +
  47 +- Use finite list boxes to display infinite contents
  48 +- 2 list types: Circular or Linear mode
  49 +- 3 control modes: Pointer, Mouse wheel, and Script
  50 +- 3 focusing position: Top, Center, and Bottom
  51 +- Support both vertical and horizontal scrolling
  52 +- Support all three render modes of the canvas plane
  53 +- Custom layout and movement, and layout preview in the editor
  54 +- Custom displaying contents
  55 +- Support dynamic list contents
  56 +- Support interaction via the script - Content selection, toggle interaction state, etc.
  57 +- Runtime setup and initialization
  58 +- Image sorting - The focused box will be popped up
  59 +- Provide callback events
  60 +- Support Unity 2018.4+ (Tested in Unity 2018.4.15f1. The demo scenes in the project are made in Unity 2019.4.16f1)
  61 +
  62 +## Setting
  63 +
  64 +<img src="./ReadmeData~/circular_scrolling_list_panel_general.png" width=400px />
  65 +
  66 +|Property|Description|
  67 +|:-------|:----------|
  68 +|**List Bank**|The game object that stores the contents for the list to display|
  69 +|**Box Setting**|The setting of the list box. See [Box Setting](#box-setting) section|
  70 +|**List Setting**|The setting of the list. See [List Setting](#list-setting) section|
  71 +
  72 +### Box Setting
  73 +
  74 +<img src="./ReadmeData~/circular_scrolling_list_panel_list_box_setting.png" width=400px />
  75 +
  76 +|Property|Description|
  77 +|:-------|:----------|
  78 +|**Box Root Transform**|The root rect transform that holding the list boxes.<br>Default to the gameobject where the script is attached to|
  79 +|**Box Prefab**|The prefab of the list box|
  80 +|**Num Of Boxes**|The number of boxes to be generated|
  81 +|**Generate Boxes and Arrange**|Generate the boxes under the "Box Root Transform" and<br>arrange them according to the [list appearance](#list-appearance)|
  82 +|**Show/Hide the Boxes**|Show or hide the reference of managed boxes|
  83 +
  84 +The managed boxes will be shown when click the "Show the Boxes" button, and be hidden by clicking the button again: \
  85 +<img src="./ReadmeData~/circular_scrolling_list_panel_show_the_boxes.png" width=600px />
  86 +
  87 +### List Setting
  88 +
  89 +#### List Mode
  90 +
  91 +<img src="./ReadmeData~/circular_scrolling_list_panel_list_mode.png" width=470px />
  92 +
  93 +|Property|Description|
  94 +|:-------|:----------|
  95 +|**List Type**|The type of the list. Could be **Circular** or **Linear**|
  96 +|**Direction**|The major scrolling direction. Could be **Vertical** or **Horizontal**|
  97 +|**Control Mode**|The controlling mode. Could be **Nothing**, or **Everthing**, **Pointer**, and **Mouse Wheel**<br>See [Set the Control Mode](#set-the-control-mode) for more information|
  98 +|┕ **Align At Focusing Position**|Whether to align a box at the focusing position after sliding or not.<br>Available if the control mode has **Pointer** set.|
  99 +|┕ **Reverse Scrolling Direction**|Whether to reverse the scrolling direction or not.<br>Available if the control mode has **Mouse Wheel** set.|
  100 +|**Focusing Position**|The focusing (ending) position of the list. Could be **Top**, **Center**, or **Bottom**<br>See [Set the Focusing Position](#set-the-focusing-position) for more information|
  101 +|┕ **Reverse Content Order**|Whether to reverse the content displaying order or not.<br>Available if the focusing position is **Center**.|
  102 +|**Init Focusing Content ID**|The initial content ID to be displayed in the focusing box|
  103 +|**Focus Selected Box**|Whether to move the selected box to the focusing position or not.<br>The list box must be a button to make this function take effect.|
  104 +|**Initialize On Start**|Whether to initialize the list in its `Start()` or not<br>If it is false, manually initialize the list by invoking `CircularScrollingList.Initialize()`|
  105 +
  106 +#### List Appearance
  107 +
  108 +<img src="./ReadmeData~/circular_scrolling_list_panel_list_appearance.png" width=470px />
  109 +
  110 +|Property|Description|
  111 +|:-------|:----------|
  112 +|**Box Density**|The factor for adjusting the distance between boxes.<br>The larger, the closer|
  113 +|**Box Position Curve**|The curve specifying the minor position of the box|
  114 +|**Box Scale Curve**|The curve specifying the box scale|
  115 +|**Box Velocity Curve**|The curve specifying the velocity factor of the box after releasing.<br>Available if the control mode has **Pointer** set.|
  116 +|**Box Movement Curve**|The curve specifying the movement factor of the box|
  117 +
  118 +For the detailed information of the curves, see [Appearance Curves](#appearance-curves).
  119 +
  120 +#### List Events
  121 +
  122 +<img src="./ReadmeData~/circular_scrolling_list_panel_list_events.png" width=470px />
  123 +
  124 +|Property|Description|
  125 +|:-------|:----------|
  126 +|**On Box Selected**|The callback to be invoked when a box is selected by clicking.<br>The `ListBox` parameter is the selected box.|
  127 +|**On Focusing Box Changed**|The callback to be invoked when the focusing box is changed.<br>The first parameter is the previous focusing box,<br>and the second parameter is the current one.|
  128 +|**On Movement End**|The callback to be invoked when the list movement is ended|
  129 +
  130 +## How to Use
  131 +
  132 +### Setup the List
  133 +
  134 +1. Add a Canvas plane to the scene. Set the render mode to "Screen Space - Camera" for example, and assign the "Main Camera" to the "Render Camera". Set the ui scale mode to "Scale With Screen Size", and the "Match" to 1. \
  135 + <img src="./ReadmeData~/step_a_1.png" width=400px />
  136 +2. Create an empty gameobject as the child of the canvas plane, rename it to "CircularScrollingList" (or other name you like), and set the height to 400. It will define the reference area of the list (See [Set the Layout Area](#set-the-layout-area) for more information). Then attach the script `ListPositionCtrl.cs` to it. \
  137 + <img src="./ReadmeData~/step_a_2.png" width=650px />
  138 +3. Create a Button gameobject as the child of the "CircularScrollingList", rename it to "ListBox", and adjust the image or text size if needed. \
  139 + <img src="./ReadmeData~/step_a_3.png" width=650px />
  140 +4. Create a new script `IntListBox.cs` and add the following code. For more information, see [ListBank and ListBox](#listbank-and-listbox) section.
  141 +
  142 + ```csharp
  143 + using AirFishLab.ScrollingList.ContentManagement;
  144 + using UnityEngine;
  145 + using UnityEngine.UI;
  146 +
  147 + // The box used for displaying the content
  148 + // Must inherit from the class `ListBox`
  149 + public class IntListBox : ListBox
  150 + {
  151 + [SerializeField]
  152 + private Text _contentText;
  153 +
  154 + // This function is invoked by the `CircularScrollingList` for updating the list content.
  155 + protected override void UpdateDisplayContent(IListContent listContent)
  156 + {
  157 + // Code will be added later
  158 + }
  159 + }
  160 + ```
  161 +
  162 +5. Attach the script `IntListBox.cs` to it, assign the gameobject "Text" of the Button to the "Content Text" of the `ListBox.cs`, and then create a prefab of it.\
  163 + <img src="./ReadmeData~/step_a_5.png" width=650px/>
  164 +6. Assign the created prefab to the "Box Prefab" in the "Box Setting" of the `CircularScrollingList.cs`. \
  165 + <img src="./ReadmeData~/step_a_6.png" width=650px/>
  166 +7. Click the "Generate Boxes and Arrange" button, and 4 more boxes will be generated and arranged. Click "Show the Boxes" button to view the referenced boxes. \
  167 + <img src="./ReadmeData~/step_a_7.png" width=800px />
  168 +8. Create a new script `IntListBank.cs` and add the following code. For more information, see [ListBank and ListBox](#listbank-and-listbox) section.
  169 +
  170 + ```csharp
  171 + using AirFishLab.ScrollingList.ContentManagement;
  172 +
  173 + // The bank for providing the content for the box to display
  174 + // Must be inherit from the class BaseListBank
  175 + public class IntListBank : BaseListBank
  176 + {
  177 + // The content to be passed to the list box
  178 + // must inherit from the class `IListContent`.
  179 + public class Content : IListContent
  180 + {
  181 + public int Value;
  182 + }
  183 +
  184 + private readonly int[] _contents = {
  185 + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  186 + };
  187 +
  188 + // This function will be invoked by the `CircularScrollingList`
  189 + // to get the content to display.
  190 + public override IListContent GetListContent(int index)
  191 + {
  192 + var content = new Content {
  193 + Value = _contents[index]
  194 + };
  195 +
  196 + return content;
  197 + }
  198 +
  199 + public override int GetContentCount()
  200 + {
  201 + return _contents.Length;
  202 + }
  203 + }
  204 + ```
  205 +
  206 +9. In the script `IntListBox.cs`, add the code to the function `UpdateDisplayContent()` to receive the content.
  207 +
  208 + ```csharp
  209 + using AirFishLab.ScrollingList.ContentManagement;
  210 + using UnityEngine;
  211 + using UnityEngine.UI;
  212 +
  213 + // The box used for displaying the content
  214 + // Must inherit from the class `ListBox`
  215 + public class IntListBox : ListBox
  216 + {
  217 + [SerializeField]
  218 + private Text _contentText;
  219 +
  220 + // This function is invoked by the `CircularScrollingList` for updating the list content.
  221 + protected override void UpdateDisplayContent(IListContent listContent)
  222 + {
  223 + var content = (IntListBank.Content)listContent;
  224 + _contentText.text = content.Value;
  225 + }
  226 + }
  227 + ```
  228 +
  229 +10. Attach the script `IntListBank.cs` to the gameobject "CircularScrollingList" (or another gameobejct you like), and assign the reference to the "List Bank" of the `CircularScrollingList.cs`. \
  230 + <img src="./ReadmeData~/step_a_10.png" width=650px />
  231 +11. Click "Play" to see the result
  232 +
  233 +### Set the Layout Area
  234 +
  235 +*Related demo scene: 01-ListType*
  236 +
  237 +The rect size of the given "Box Root Transform" defines the layout area. If the direction of the list is **Vertical**, the list will use the height of the rect size to arrange the boxes. If the direction of the list is **Horizontal**, the list will use the width instead. \
  238 +<img src="./ReadmeData~/set-the-layout-area.png" width=650px />
  239 +
  240 +The gap between the boxes could be adjusted by setting the "Box Density" in the "List Appearence" section of the setting. The higher, the closer. \
  241 +<img src="./ReadmeData~/set-the-layout-area-box-density.png" width=500px />
  242 +
  243 +### Set the Control Mode
  244 +
  245 +*Related demo scene: 02-ControlMode*
  246 +
  247 +There are 3 control modes. Two of them could be toggled in the setting. \
  248 +<img src="./ReadmeData~/control-modes.png" width=450px />
  249 +
  250 +- **Pointer**: The list can be moved by dragging it.
  251 + - **Align At Focusing Position** option will be shown if this control mode is set. If it is activated, the list will align a box to the focusing position after the list is released.
  252 +- **Mouse Wheel**: The list can be moved by scrolling the mouse wheel.
  253 + - **Reverse Scrolling Direction** option will be shown if this contol mode is set. If it is activated, the list will be scrolled in the reversed direction.
  254 +
  255 +The last control mode is **Function**. The list can be moved by invoking `CircularScrollingList.MoveOneUnitUp()` or `CircularScrollingList.MoveOneUnitDown()`. In this mode, the list can be moved by buttons which invoking these two functions. \
  256 +<img src="./ReadmeData~/function_mode_demo.png" width=650px />
  257 +
  258 +### Set the Focusing Position
  259 +
  260 +*Related demo scene: 03-FocusingPosition*
  261 +
  262 +The focusing position defines which box will be the focusing box at that position. The **Reverse Content Order** option will be shown if the focusing position is set to **Center**. \
  263 +<img src="./ReadmeData~/focusing-position.png" width=450px />
  264 +
  265 +Here is the focusing position related to the position of the box. The focusing position will affect the result of the `OnFocusingBoxChanged` event. \
  266 +<img src="./ReadmeData~/focusing-position-target-box.png" width=650px />
  267 +
  268 +If the focusing position is set to **Top**, the order of the displaying content will be from the top to the bottom. If it is **Bottom**, the order will be reversed. If it is **Center**, the order is decided by the **Reverse Content Order** option. \
  269 +<img src="./ReadmeData~/focusing-position-circular-list.png" width=500px />
  270 +
  271 +The focusing position also defines the ending position of the **Linear** list. If it is set to **Top**, the list will be ended at the bottom. If it is set to **Bottom**, the list will be ended at the top. That is, unlike **Center** focusing position, the box showing the last content couldn't be dragged to the focusing position. \
  272 +<img src="./ReadmeData~/focusing-position-ending-position.png" width=500px />
  273 +
  274 +But if the number of the content is less than the number of the boxes, the content will be shown from the focusing position, and the list couldn't be dragged, when the focusing position is set to **Top** or **Bottom**. \
  275 +<img src="./ReadmeData~/focusing-position-ending-position-fewer-content.png" width=500px />
  276 +
  277 +### Appearance Curves
  278 +
  279 +*Related demo scene: 04-LayoutAndMovement*
  280 +
  281 +- **Box Position Curve**: The curve specifying the minor position of the box
  282 + - X axis: The major position of the box, which is mapped to [-1, 1] (from the smallest major position to the largest major position).
  283 + - Y axis: The factor of the minor position.
  284 +
  285 + For example, in the vertical mode, the major position is the y position and the minor position is the x position: \
  286 + <img src="./ReadmeData~/list_position_vertical_curve_explain.png" width=700px /> \
  287 + It is intuitive in the horizontal mode: \
  288 + <img src="./ReadmeData~/list_position_horizontal_curve_explain.png" width=700px /> \
  289 + Note that "1" in the curve equals to `(number of boxes / 2) * unitPos`, where unitPos equals to `(width or length of root rect size / (number of boxes - 1))`. For example, if there are 5 boxes, then the length of "1" is 2.5 unitPos. And if the width of the root rect transform is 400, then the unitPos is 100.
  290 +
  291 +- **Box Scale Curve**: The curve specifying the box scale
  292 + - X axis: Same as the box position curve
  293 + - Y axis: The scale value of the box at that major position
  294 +- **Box Velocity Curve**: The curve specifying the velocity factor of the box after releasing
  295 + - X axis: The movement duration in seconds, which starts from 0.
  296 + - Y axis: The factor of the releasing velocity. It should **start from 1 and end with 0**. \
  297 + <img src="./ReadmeData~/box_velocity_curve_example.png" width=400px />
  298 +- **Box Movement Curve**: The curve specifying the movement factor of the box.
  299 + - X axis: Same as the box velocity curve
  300 + - Y axis: The lerping factor between current position and the target position. It should **start from 0 and end with 1**. \
  301 + <img src="./ReadmeData~/box_movement_curve_example.png" width=400px />
  302 +
  303 +#### Curve Presets
  304 +
  305 +The project provides curve presets. Open the curve editing panel and select the `BoxCurvePresets` to use them. \
  306 +<img src="./ReadmeData~/import_curve_preset.png" width=500px /> \
  307 +<img src="./ReadmeData~/curve_preset_detail.png" /> \
  308 +Part A are position curves, part B are scale curves, part C is a velocity curve, and part D is a movement curve.
  309 +
  310 +## `ListBank` and `ListBox`
  311 +
  312 +*Related demo scene: 05-CustomContent*
  313 +
  314 +Since version 5, the list supports custom content type. Different type of `ListBank` and `ListBox` can be used in the different list. In this section mentions how to implement your own `ListBank` and `ListBox`.
  315 +
  316 +<img src="./ReadmeData~/custom_list_example.png" width=200px>
  317 +
  318 +### Custom `ListBank`
  319 +
  320 +Here is the example of the custom `ColorStrListBank`:
  321 +
  322 +```csharp
  323 +using System;
  324 +using AirFishLab.ScrollingList.ContentManagement;
  325 +using UnityEngine;
  326 +
  327 +public class ColorStrListBank : BaseListBank
  328 +{
  329 + [SerializeField]
  330 + private ColorString[] _contents;
  331 +
  332 + public override IListContent GetListContent(int index)
  333 + {
  334 + return _contents[index];
  335 + }
  336 +
  337 + public override int GetContentCount()
  338 + {
  339 + return _contents.Length;
  340 + }
  341 +}
  342 +
  343 +[Serializable]
  344 +public class ColorString : IListContent
  345 +{
  346 + public Color color;
  347 + public string name;
  348 +}
  349 +```
  350 +
  351 +The class must inherit from the class `BaseListBank`, and there are 2 methods to be implemented:
  352 +
  353 +- `public override IListContent GetListContent(int index)`: The function for the list to get the content to display. The data object passed by this function should inherit `IListContent`, and it should be converted back to its orignal type for being used in the custom `ListBox`.
  354 +- `public override int GetListLength()`: Get the number of the content.
  355 +
  356 +### Custom `ListBox`
  357 +
  358 +Here is the example of the corresponding `ColorStrListBox`:
  359 +
  360 +```csharp
  361 +using AirFishLab.ScrollingList.ContentManagement;
  362 +using UnityEngine;
  363 +using UnityEngine.UI;
  364 +
  365 +public class ColorStrListBox : ListBox
  366 +{
  367 + [SerializeField]
  368 + private Image _contentImage;
  369 + [SerializeField]
  370 + private Text _contentText;
  371 +
  372 + protected override void UpdateDisplayContent(IListContent content)
  373 + {
  374 + // Convert the content type back to the ColorString to get the data
  375 + var colorString = (ColorString)content;
  376 + _contentImage.color = colorString.color;
  377 + _contentText.text = colorString.name;
  378 + }
  379 +}
  380 +```
  381 +
  382 +The class must inherit from the class `ListBox`, and there is 1 method to be implemented:
  383 +
  384 +- `protected override void UpdateDisplayContent(IListContent content)`: The function for the list to update the content of the box. `content` is the content requested from `GetListContent()` of the custom list bank, and it should be converted back to its original type for being used.
  385 +
  386 +### Use Them in the List
  387 +
  388 +Same as the setup steps in the [Setup the List](#setup-the-list) section but replacing the `IntListBox` and `IntListBank` with your own version of `ListBox` and `ListBank`.
  389 +
  390 +<img src="./ReadmeData~/custom_list_box_example.png" width=650px /> \
  391 +<img src="./ReadmeData~/custom_list_bank_example.png" width=650px />
  392 +
  393 +### Pass Data of Primitive Type
  394 +
  395 +If the type of the content is primitive type such as `int` or `string`, you should create a class carrying the data and make it inherit from the `IListContent`.
  396 +
  397 +For example, for passing the string as the content:
  398 +
  399 +```csharp
  400 +public class StringListBank : BaseListBank
  401 +{
  402 + /// <summary>
  403 + /// Used for carrying the data
  404 + /// </summary>
  405 + public class DataWrapper : IListContent
  406 + {
  407 + public string Data;
  408 + }
  409 +
  410 + private string[] _contents = {"apple", "book", "car", "door", "egg"};
  411 + // Create a wrapper object for carrying the data
  412 + private DataWrapper _dataWrapper = new DataWrapper();
  413 +
  414 + public override IListContent GetListContent(int index)
  415 + {
  416 + // Store the content in the data wrapper
  417 + _dataWrapper.Data = _contents[index];
  418 + return _dataWrapper;
  419 + }
  420 +
  421 + public override int GetContentCount()
  422 + {
  423 + return _contents.Length;
  424 + }
  425 +}
  426 +
  427 +public class StringListBox : ListBox
  428 +{
  429 + [SerializeField]
  430 + private Text _text;
  431 +
  432 + protected override void UpdateDisplayContent(IListContent content)
  433 + {
  434 + var dataWrapper = (StringListBank.DataWrapper)content;
  435 + // Extract the content from the wrapper
  436 + _text.text = dataWrapper.Data;
  437 + }
  438 +}
  439 +```
  440 +
  441 +## List Events
  442 +
  443 +*Related demo scene: 06-ListEvents*
  444 +
  445 +All the events could be subscribed or unsubscribed by script by invoking:
  446 +
  447 +```csharp
  448 +CircularScrollingList.ListSetting.AddXXXCallback(callback)
  449 +CircularScrollingList.ListSetting.RemoveXXXCallback(callback)
  450 +```
  451 +
  452 +### `OnBoxSelected` Event
  453 +
  454 +When a box is clicked, the list will launch the `OnBoxSelected` event (actually launch from the `Button.onClick` event). The callback function (or the listener) for the event must have 1 parameter for receiving the focusing box.
  455 +
  456 +Here is an example of the callback function:
  457 +
  458 +```csharp
  459 +using AirFishLab.ScrollingList;
  460 +using UnityEngine;
  461 +using UnityEngine.UI;
  462 +
  463 +public class ListEventDemo : MonoBehaviour
  464 +{
  465 + [SerializeField]
  466 + private CircularScrollingList _list;
  467 + [SerializeField]
  468 + private Text _selectedContentText;
  469 +
  470 + public void OnBoxSelected(ListBox listBox)
  471 + {
  472 + var contentID = listBox.ContentID;
  473 + // Get the content by the content ID
  474 + var content = (IntListContent)_list.ListBank.GetListContent(contentID);
  475 + _selectedContentText.text =
  476 + $"Selected content ID: {contentID}, Content: {content}";
  477 + }
  478 +
  479 + public void OnBoxSelected2(ListBox listBox)
  480 + {
  481 + // The other way is to convert the type of the box back to its original type,
  482 + // and then get the custom property from the box
  483 + var customBox = (CustomBox)listBox;
  484 + _selectedContentText.text =
  485 + $"Selected content ID: {customBox.ContentID}, Content: {customBox.Content}";
  486 + }
  487 +}
  488 +```
  489 +
  490 +Then, assign it to the property "On Box Selected (ListBox)". \
  491 +<img src="./ReadmeData~/on-box-selected-event.png" width=500px>
  492 +
  493 +It will be like (ReadmeData~/on-box-selected-event-demo.gif): \
  494 +<img src="./ReadmeData~/on-box-selected-event-demo.gif" width=400px />
  495 +
  496 +### `OnFocusingBoxChanged` Event
  497 +
  498 +The `OnFocusingBoxChanged` event will be invoked when the box at the specified "Focusing Position" is changed. Two parameters are required for the callback: the last focusing box and the current one.
  499 +
  500 +Here is an example of the callback function:
  501 +
  502 +```csharp
  503 +using AirFishLab.ScrollingList;
  504 +using UnityEngine;
  505 +using UnityEngine.UI;
  506 +
  507 +public class ListEventDemo : MonoBehaviour
  508 +{
  509 + [SerializeField]
  510 + private CircularScrollingList _list;
  511 + [SerializeField]
  512 + private Text _autoUpdatedContentText;
  513 +
  514 + public void OnFocusingBoxChanged(
  515 + ListBox prevFocusingBox, ListBox curFocusingBox)
  516 + {
  517 + var curFocusingIntBox = (IntListBox)curFocusingBox;
  518 + // The `IntListBox` has custom property `Content` for storing the displaying content
  519 + _autoUpdatedContentText.text =
  520 + $"(Auto updated)\nFocusing content: {curFocusingIntBox.Content}";
  521 + }
  522 +}
  523 +```
  524 +
  525 +Assign it to the property "On Focusing Box Changed (ListBox, ListBox)" \
  526 +<img src="./ReadmeData~/on-focusing-box-changed.png" width=500px />
  527 +
  528 +If the "Focusing Position" is set to **Center**, then it will be like (ReadmeData~/on-focusing-box-changed-demo.gif): \
  529 +<img src="./ReadmeData~/on-focusing-box-changed-demo.gif" width=320px />
  530 +
  531 +If the "Focusing Position" is set to **Top**, then it will be like (ReadmeData~/on-focusing-box-changed-demo-top-pos.gif): \
  532 +<img src="./ReadmeData~/on-focusing-box-changed-demo-top-pos.gif" width=320px />
  533 +
  534 +### Manually Get the Focusing Box
  535 +
  536 +Manually get the focusing box by invoking:
  537 +
  538 +```csharp
  539 +CircularScrollingList.GetFocusingBox()
  540 +```
  541 +
  542 +To get the content id by invoking:
  543 +
  544 +```csharp
  545 +CircularScrollingList.GetFocusingContentID()
  546 +```
  547 +
  548 +For example, create a function which will update the content of the focusing content to the `Text`, and use a `Button` to invoke it.
  549 +
  550 +```csharp
  551 +using AirFishLab.ScrollingList;
  552 +using UnityEngine;
  553 +using UnityEngine.UI;
  554 +
  555 +public class ListEventDemo : MonoBehaviour
  556 +{
  557 + [SerializeField]
  558 + private CircularScrollingList _list;
  559 + [SerializeField]
  560 + private Text _displayText;
  561 +
  562 + public void DisplayFocusingContent()
  563 + {
  564 + var focusingBox = (IntListBox)_list.GetFocusingBox();
  565 + // The `IntListBox` has custom property `Content` for storing the displaying content
  566 + var focusingContent = focusingBox.Content;
  567 + _displayText.text = "Focusing content: " + focusingContent;
  568 + }
  569 +}
  570 +```
  571 +
  572 +If the "Focusing Position" is set to **Bottom**, then it will be like (ReadmeData~/get-focusing-box-demo.gif): \
  573 +<img src="./ReadmeData~/get-focusing-box-demo.gif" width=280px />
  574 +
  575 +### `OnMovementEnd` event
  576 +
  577 +`OnMovementEnd` event will be invoked when the list stops moving.
  578 +
  579 +## Box Events
  580 +
  581 +The `ListBox.cs` provides some event callbacks. You could define custom behaviour by overriding these event callbacks.
  582 +
  583 +### `OnInitialized` event
  584 +
  585 +`OnInitialized` event is invoked when the list is initialized (`CircularScrollingList.Initialize()`).
  586 +
  587 +```csharp
  588 +public class MyListBox : ListBox
  589 +{
  590 + protected override void OnInitialized()
  591 + {
  592 + ...
  593 + }
  594 +}
  595 +```
  596 +
  597 +### `OnBoxMoved` event
  598 +
  599 +`OnBoxMoved` event is invoked when the box is moving. In addition, when the box is initialized.
  600 +
  601 +The event has 1 parameter `positionRatio` which is from -1 to 1.
  602 +
  603 +```csharp
  604 +public class MyListBox : ListBox
  605 +{
  606 + [SerializedField]
  607 + private Image _image;
  608 +
  609 + public override void OnBoxMoved(float positionRatio)
  610 + {
  611 + var color = _image.color;
  612 + color.a = 1 - Mathf.Abs(positionRatio);
  613 + _image.color = color;
  614 + }
  615 +}
  616 +```
  617 +
  618 +## Script Operations
  619 +
  620 +### Late Initialization
  621 +
  622 +*Related demo scene: 07-LateInitialization*
  623 +
  624 +If the **Initialize On Start** is not set, the list could be initialized by invoking:
  625 +
  626 +```csharp
  627 +CircularScrollingList.Initialize()
  628 +```
  629 +
  630 +The setting of the list could be setup before the `Initialize()` call. The `XXX` below is the placeholder of the setting name:
  631 +
  632 +- To set the `ListBank` by invoking `CircularScrollingList.SetListBank()`
  633 +- To set the box setting by invoking `CircularScrollingList.BoxSetting.SetXXX()`, such as `SetBoxPrefab()`
  634 +- To set the list setting by invoking `CircularScrollingList.ListSetting.SetXXX()`, such as `SetFocusSelectedBox()`
  635 +- To register the event callback by invoking `CircularScrollingList.ListSetting.AddXXXCallback()`, such as `AddOnBoxSelectedCallback()`
  636 +- To unregister the event callback by invoking `CircularScrollingList.ListSetting.RemoveXXXCallback()`, such as `RemoveOnBoxSelctedCallback()`
  637 +
  638 +The callback registration/unregistration could be invoked at any time. But for other functions, they will print the warning message and ignore the value after `Initialize()` call.
  639 +
  640 +### Toggle List Interaction
  641 +
  642 +*Related demo scene: 11-InteractingByScript*
  643 +
  644 +The list interaction could be toggled by invoking:
  645 +
  646 +```csharp
  647 +CircularScrolingList.SetInteractable(bool isInteractable)
  648 +```
  649 +
  650 +and the current interaction state could be checked by:
  651 +
  652 +```csharp
  653 +CircularScrollingList.IsInteractable
  654 +```
  655 +
  656 +Here is an example:
  657 +
  658 +```csharp
  659 +public class ListInteraction : MonoBehaviour
  660 +{
  661 + [SerializeField]
  662 + private CircularScrollingList _scrollingList;
  663 + [SerializeField]
  664 + private Text _toggleInteractionText;
  665 +
  666 + public void ToggleListInteractable()
  667 + {
  668 + _scrollingList.SetInteractable(!_scrollingList.IsInteractable);
  669 +
  670 + var interactingState = _scrollingList.IsInteractable ? "ON" : "OFF";
  671 + _toggleInteractionText.text = $"List interactable: {interactingState}";
  672 + }
  673 +}
  674 +```
  675 +
  676 +### Select the Content
  677 +
  678 +*Related demo scene: 10-SelectionMovement*
  679 +
  680 +The list content could be selected from the script by invoking:
  681 +
  682 +```csharp
  683 +CircularScrollingList.SelectContentID(int contentID, bool notToIgnore = true)
  684 +```
  685 +
  686 +Whether the "Focus Selected Box" is on or off, the selected content will always be moved to the focusing position. \
  687 +If the specified `contentID` is invalid, it will raise `IndexOutOfRangeException`. It the list has no content to display, this function has no effect, no matter what the value of `contentID` is. \
  688 +If the `notToIgnore` is `true`, the selection movement still works even if the list is not interactable. If it is `false`, then this function call will be ignored instead.
  689 +
  690 +Here is an example for iteration through the list contents by selecting each content:
  691 +
  692 +```csharp
  693 +using AirFishLab.ScrollingList;
  694 +
  695 +public class ListIteration : MonoBehaviour
  696 +{
  697 + [SerializeField]
  698 + private CircularScrollingList _list;
  699 + [SerializeField]
  700 + private float _stepInterval = 0.1f;
  701 +
  702 + private int _currentID;
  703 +
  704 + private void Start()
  705 + {
  706 + // Make the list not interactable while it is controlled by the script
  707 + _list.SetInteractable(false);
  708 + StartCoroutine(IterationLoop());
  709 + }
  710 +
  711 + private IEnumerator IterationLoop()
  712 + {
  713 + while (true) {
  714 + // The selection movement still works even if the list is not interactable.
  715 + // The default value of 'notToIgnore' parameter is true.
  716 + _list.SelectContentID(_currentID);
  717 + _currentID =
  718 + (int)Mathf.Repeat(_currentID + 1, _list.listBank.GetListLength());
  719 + yield return new WaitForSeconds(_stepInterval);
  720 + }
  721 + }
  722 +}
  723 +```
  724 +
  725 +It will be like (ReadmeData~/list_selection_demo.gif): \
  726 +<img src="./ReadmeData~/list_selection_demo.gif" width=320px />
  727 +
  728 +### Refresh the List
  729 +
  730 +*Related demo scene: 08-ListRefreshing*
  731 +
  732 +When the content in the list bank is changed, make the list refresh its displaying contents by invoking:
  733 +
  734 +```csharp
  735 +CircularScrollingList.Refresh(int focusingContentID = -1)
  736 +```
  737 +
  738 +The boxes in the list will recalculate their content ID and reacquire the content from the list bank. \
  739 +The `focusingContentID` specifies the ID of the focusing content after the list is refreshed. If the value is invalid, the function will raise `IndexOutOfRangeException`. \
  740 +If the `focusingContentID` is negative, whose defalut value is -1, the list will use the current focusing content ID as the content ID of the focusing box (Note that it uses the ID, not content). If the current focusing content ID is larger than the number of contents, it will be the ID of the last content. If there is no content to be displayed before calling `Refresh()`, the focusing content ID will be 0.
  741 +
  742 +Here is an example for extracting new contents and refresh the list:
  743 +
  744 +```csharp
  745 +using AirFishLab.ScrollingList;
  746 +
  747 +public class VariableStringListBank : BaseListBank
  748 +{
  749 + [SerializeField]
  750 + private InputField _contentInputField;
  751 + [SerializeField]
  752 + private string[] _contents = {"a", "b", "c", "d", "e"};
  753 + [SerializeField]
  754 + private CircularScrollingList _list;
  755 +
  756 + private Content _dataWrapper = new Content();
  757 +
  758 + /// <summary>
  759 + /// Extract the contents from the input field and refresh the list
  760 + /// </summary>
  761 + /// This function is assigned to a button.
  762 + public void ChangeContents()
  763 + {
  764 + _contents =
  765 + _contentInputField.text.Split(
  766 + new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries);
  767 + _list.Refresh();
  768 + }
  769 +
  770 + public override IListContent GetListContent(int index)
  771 + {
  772 + _dataWrapper.Content = _contents[index];
  773 + return _dataWrapper;
  774 + }
  775 +
  776 + public override int GetListLength()
  777 + {
  778 + return _contents.Length;
  779 + }
  780 +
  781 + public class Content : IListContent
  782 + {
  783 + public string Value;
  784 + }
  785 +}
  786 +```
  787 +
  788 +It will be like (ReadmeData~/list_refreshing_demo.gif): \
  789 +<img src="./ReadmeData~/list_refreshing_demo.gif" width=600px />
  790 +
  791 +### Stop the Movement
  792 +
  793 +*Related demo scene: 11-InteractingByScript*
  794 +
  795 +The list movement could be stopped by invoking:
  796 +
  797 +```csharp
  798 +CircularScrollingList.EndMovement()
  799 +```
  800 +
  801 +A box will be aligned if the fucntion is invoked:
  802 +
  803 +- during the **Mouse Wheel** or the **Function** movement, or
  804 +- during movement after the **Pointer** releases and the **Align At Focusing Position** option is set.
  805 +
  806 +The `OnMovementEnd` event will be invoked when the movement is ended.
  1 +fileFormatVersion: 2
  2 +guid: ef99c8c5bdf673547bbf446a42b0a4b0
  3 +TextScriptImporter:
  4 + externalObjects: {}
  5 + userData:
  6 + assetBundleName:
  7 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: de360eb105c13fb47b743a0dc7e1e8f3
  3 +DefaultImporter:
  4 + externalObjects: {}
  5 + userData:
  6 + assetBundleName:
  7 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: c3aac170f14188349ba1b62364b26270
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +using System;
  2 +using System.Collections.Generic;
  3 +using AirFishLab.ScrollingList.ContentManagement;
  4 +using AirFishLab.ScrollingList.ListStateProcessing;
  5 +using UnityEngine;
  6 +using UnityEngine.EventSystems;
  7 +using UnityEngine.Serialization;
  8 +#if UNITY_EDITOR
  9 +using UnityEditor;
  10 +#endif
  11 +
  12 +namespace AirFishLab.ScrollingList
  13 +{
  14 + /// <summary>
  15 + /// Manage and control the circular scrolling list
  16 + /// </summary>
  17 + public class CircularScrollingList : MonoBehaviour,
  18 + IBeginDragHandler, IDragHandler, IEndDragHandler, IScrollHandler
  19 + {
  20 + #region Enum Definitions
  21 +
  22 + /// <summary>
  23 + /// The type of the list
  24 + /// </summary>
  25 + public enum ListType
  26 + {
  27 + Circular,
  28 + Linear
  29 + };
  30 +
  31 + /// <summary>
  32 + /// The controlling mode of the list
  33 + /// </summary>
  34 + [Flags]
  35 + public enum ControlMode
  36 + {
  37 + /// <summary>
  38 + /// Control the list by the mouse pointer or finger
  39 + /// </summary>
  40 + Pointer = 1 << 0,
  41 + /// <summary>
  42 + /// Control the list by the mouse wheel
  43 + /// </summary>
  44 + MouseWheel = 1 << 1,
  45 + /// <summary>
  46 + /// All the control modes
  47 + /// </summary>
  48 + Everything = ~(~0 << 2),
  49 + };
  50 +
  51 + /// <summary>
  52 + /// The focusing position of the list
  53 + /// </summary>
  54 + public enum FocusingPosition
  55 + {
  56 + Top,
  57 + Center,
  58 + Bottom,
  59 + }
  60 +
  61 + /// <summary>
  62 + /// The major moving direction of the list
  63 + /// </summary>
  64 + public enum Direction
  65 + {
  66 + Vertical,
  67 + Horizontal
  68 + };
  69 +
  70 + #endregion
  71 +
  72 + #region Settings
  73 +
  74 + [SerializeField]
  75 + [Tooltip("The object that stores the contents for the list to display. " +
  76 + "It should be derived from the class BaseListBank.")]
  77 + private BaseListBank _listBank;
  78 + [SerializeField]
  79 + private ListBoxSetting _boxSetting;
  80 + [SerializeField]
  81 + [Tooltip("The objects that are used for displaying the content. " +
  82 + "They should be derived from the class ListBox")]
  83 + private List<ListBox> _listBoxes;
  84 + [SerializeField]
  85 + [FormerlySerializedAs("_setting")]
  86 + [Tooltip("The setting of this list")]
  87 + private ListSetting _listSetting;
  88 +
  89 + #endregion
  90 +
  91 + #region Exposed Properties
  92 +
  93 + public BaseListBank ListBank => _listBank;
  94 + public ListBox[] ListBoxes => _listBoxes.ToArray();
  95 + public ListBoxSetting BoxSetting => _boxSetting;
  96 + public ListSetting ListSetting => _listSetting;
  97 + /// <summary>
  98 + /// Is the list interactable?
  99 + /// </summary>
  100 + public bool IsInteractable => _isInteractable;
  101 +
  102 + #endregion
  103 +
  104 + #region Private Members
  105 +
  106 + /// <summary>
  107 + /// The rect transform that this list belongs to
  108 + /// </summary>
  109 + private RectTransform _rectTransform;
  110 + /// <summary>
  111 + /// The camera that the parent canvas is referenced
  112 + /// </summary>
  113 + private Camera _canvasRefCamera;
  114 + /// <summary>
  115 + /// The controlling mode of the list
  116 + /// </summary>
  117 + private ControlMode _controlMode;
  118 + /// <summary>
  119 + /// The component for handing the user input
  120 + /// </summary>
  121 + private InputProcessor _inputProcessor;
  122 + /// <summary>
  123 + /// The component for processing the state of the list
  124 + /// </summary>
  125 + private IListMovementProcessor _listMovementProcessor;
  126 + /// <summary>
  127 + /// The component for managing the list boxes
  128 + /// </summary>
  129 + private IListBoxController _listBoxController;
  130 + /// <summary>
  131 + /// The component for providing the content for the boxes
  132 + /// </summary>
  133 + private ListContentProvider _listContentProvider;
  134 + /// <summary>
  135 + /// Is the list initialized?
  136 + /// </summary>
  137 + private bool _isInitialized;
  138 + /// <summary>
  139 + /// Is the list interactable?
  140 + /// </summary>
  141 + private bool _isInteractable = true;
  142 + /// <summary>
  143 + /// Does the list bank has no content?
  144 + /// </summary>
  145 + /// It is used for blocking any input if the list has nothing to display.
  146 + private bool _hasNoContent;
  147 + /// <summary>
  148 + /// Is the list moving?
  149 + /// </summary>
  150 + private bool _isMoving;
  151 +
  152 + #endregion
  153 +
  154 + private void Reset()
  155 + {
  156 + if (_boxSetting == null)
  157 + _boxSetting = new ListBoxSetting();
  158 + _boxSetting.BoxRootTransform = transform;
  159 + }
  160 +
  161 + private void Start()
  162 + {
  163 + if (_listSetting.InitializeOnStart)
  164 + Initialize();
  165 + }
  166 +
  167 + #region Initialization
  168 +
  169 + /// <summary>
  170 + /// Set the list bank of the list
  171 + /// </summary>
  172 + public void SetListBank(BaseListBank listBank)
  173 + {
  174 + if (CheckIsInitialized())
  175 + return;
  176 +
  177 + _listBank = listBank;
  178 + }
  179 +
  180 + /// <summary>
  181 + /// Initialize the list
  182 + /// </summary>
  183 + public void Initialize()
  184 + {
  185 + if (CheckIsInitialized())
  186 + return;
  187 +
  188 + Validate();
  189 + _boxSetting.Initialize(gameObject);
  190 + _listSetting.Initialize(_listBank, name);
  191 +
  192 + GetComponentReference();
  193 + SetListBoxes();
  194 + InitializeMembers();
  195 +
  196 + _isInitialized = true;
  197 + }
  198 +
  199 + /// <summary>
  200 + /// Check if the list is initialized
  201 + /// </summary>
  202 + private bool CheckIsInitialized()
  203 + {
  204 + if (_isInitialized)
  205 + Debug.LogWarning($"The list '{name}' is initialized. Skip.");
  206 +
  207 + return _isInitialized;
  208 + }
  209 +
  210 + /// <summary>
  211 + /// Validate the setting
  212 + /// </summary>
  213 + private void Validate()
  214 + {
  215 + if (!_listBank)
  216 + throw new UnassignedReferenceException(
  217 + $"The 'ListBank' is not assigned in the list '{name}'");
  218 + }
  219 +
  220 + /// <summary>
  221 + /// Get the reference of the used component
  222 + /// </summary>
  223 + private void GetComponentReference()
  224 + {
  225 + _rectTransform = GetComponent<RectTransform>();
  226 + var parentCanvas = GetComponentInParent<Canvas>();
  227 + if (parentCanvas.renderMode != RenderMode.ScreenSpaceOverlay)
  228 + _canvasRefCamera = parentCanvas.worldCamera;
  229 + }
  230 +
  231 + /// <summary>
  232 + /// Initialize the related list members
  233 + /// </summary>
  234 + private void InitializeMembers()
  235 + {
  236 + if (_listSetting.FocusSelectedBox)
  237 + _listSetting.OnBoxSelected.AddListener(
  238 + box => SelectContentID(box.ContentID, false));
  239 + _controlMode = _listSetting.ControlMode;
  240 +
  241 + _inputProcessor =
  242 + new InputProcessor(_rectTransform, _canvasRefCamera);
  243 + _listContentProvider =
  244 + new ListContentProvider(_listSetting, _listBank, _listBoxes.Count);
  245 + _hasNoContent = _listContentProvider.GetContentCount() == 0;
  246 +
  247 + var setupData =
  248 + new ListSetupData(
  249 + this, _listSetting, _rectTransform, _canvasRefCamera,
  250 + new List<IListBox>(_listBoxes), _listContentProvider);
  251 + ListStateProcessorManager.GetProcessors(
  252 + setupData, out _listMovementProcessor, out _listBoxController);
  253 + }
  254 +
  255 + #endregion
  256 +
  257 + #region Box Setup Functions
  258 +
  259 + /// <summary>
  260 + /// Set the list boxes to be used by the list
  261 + /// </summary>
  262 + private void SetListBoxes()
  263 + {
  264 + var prefab = _boxSetting.BoxPrefab;
  265 + var rootTransform = _boxSetting.BoxRootTransform;
  266 + var numOfBoxes = _boxSetting.NumOfBoxes;
  267 +#if UNITY_EDITOR
  268 + var undoGroupID = Undo.GetCurrentGroup();
  269 +#endif
  270 +
  271 + var curNumOfBoxes = ReassignListBoxes(_listBoxes, rootTransform, numOfBoxes);
  272 + for (var i = curNumOfBoxes; i < numOfBoxes; ++i) {
  273 + var box = GenerateListBox(prefab, rootTransform, i);
  274 +#if UNITY_EDITOR
  275 + Undo.RegisterCreatedObjectUndo(
  276 + box.gameObject, "Generate Boxes and Arrange");
  277 + Undo.CollapseUndoOperations(undoGroupID);
  278 + // TODO Record the change of the list boxes
  279 +#endif
  280 + _listBoxes.Add(box);
  281 + }
  282 + }
  283 +
  284 + /// <summary>
  285 + /// Reassign the list boxes from the box root transform
  286 + /// </summary>
  287 + /// <param name="listBoxes">The container for holding the boxes</param>
  288 + /// <param name="rootTransform">The root transform for finding boxes</param>
  289 + /// <param name="desiredNumOfBoxes">The number of desired boxes</param>
  290 + /// <returns>The number of boxes added</returns>
  291 + private int ReassignListBoxes(
  292 + List<ListBox> listBoxes, Transform rootTransform, int desiredNumOfBoxes)
  293 + {
  294 + var existingBoxes = new List<ListBox>();
  295 +
  296 + foreach (Transform child in rootTransform) {
  297 + if (!child.TryGetComponent<ListBox>(out var box))
  298 + continue;
  299 + existingBoxes.Add(box);
  300 + }
  301 +
  302 + var numOfExistingBoxes = existingBoxes.Count;
  303 + if (numOfExistingBoxes > desiredNumOfBoxes)
  304 + Debug.LogWarning("The number of existing boxes are more than "
  305 + + $"the number of desired boxes in the list '{name}'");
  306 +
  307 + var numOfBoxes = Mathf.Min(numOfExistingBoxes, desiredNumOfBoxes);
  308 + listBoxes.Clear();
  309 + for (var i = 0; i < numOfBoxes; ++i) {
  310 + listBoxes.Add(existingBoxes[i]);
  311 + }
  312 +
  313 + return numOfBoxes;
  314 + }
  315 +
  316 + /// <summary>
  317 + /// Generate a list box under the box root transform
  318 + /// </summary>
  319 + /// <param name="prefab">The prefab of the box</param>
  320 + /// <param name="rootTransform">
  321 + /// The root transform for the box to be generated at
  322 + /// </param>
  323 + /// <param name="index">The index of the box</param>
  324 + /// <returns>The generated box</returns>
  325 + private static ListBox GenerateListBox(
  326 + ListBox prefab, Transform rootTransform, int index)
  327 + {
  328 + ListBox box;
  329 +
  330 +#if UNITY_EDITOR
  331 + if (!Application.isPlaying && PrefabUtility.IsPartOfAnyPrefab(prefab)) {
  332 + // If it is the prefab instance, get the source prefab asset
  333 + if (PrefabUtility.IsPartOfPrefabInstance(prefab))
  334 + prefab = PrefabUtility.GetCorrespondingObjectFromSource(prefab);
  335 + box = PrefabUtility.InstantiatePrefab(prefab, rootTransform) as ListBox;
  336 + }
  337 + else
  338 +#endif
  339 + box = Instantiate(prefab, rootTransform);
  340 +
  341 + box.name = $"{prefab.name} ({index})";
  342 + return box;
  343 + }
  344 +
  345 + #endregion
  346 +
  347 + #region Public Movement Operations
  348 +
  349 + /// <summary>
  350 + /// Whether the list is interactable or not
  351 + /// </summary>
  352 + /// <param name="interactable">Is the list interactable?</param>
  353 + public void SetInteractable(bool interactable)
  354 + {
  355 + _isInteractable = interactable;
  356 + }
  357 +
  358 + /// <summary>
  359 + /// Move the list one unit up or right
  360 + /// </summary>
  361 + public void MoveOneUnitUp()
  362 + {
  363 + if (_hasNoContent)
  364 + return;
  365 +
  366 + SetUnitMovement(1);
  367 + }
  368 +
  369 + /// <summary>
  370 + /// Move the list one unit down or left
  371 + /// </summary>
  372 + public void MoveOneUnitDown()
  373 + {
  374 + if (_hasNoContent)
  375 + return;
  376 +
  377 + SetUnitMovement(-1);
  378 + }
  379 +
  380 + /// <summary>
  381 + /// Stop the list immediately
  382 + /// </summary>
  383 + public void EndMovement()
  384 + {
  385 + if (_listMovementProcessor.IsMovementEnded())
  386 + return;
  387 +
  388 + var toAlign = _listMovementProcessor.NeedToAlign();
  389 + _listMovementProcessor.EndMovement(toAlign);
  390 +
  391 + if (toAlign)
  392 + return;
  393 +
  394 + _listSetting.OnMovementEnd.Invoke();
  395 + _isMoving = false;
  396 + }
  397 +
  398 + #endregion
  399 +
  400 + #region Public Box And Content Operations
  401 +
  402 + /// <summary>
  403 + /// Get the focusing box
  404 + /// </summary>
  405 + public ListBox GetFocusingBox() =>
  406 + _listBoxController.GetFocusingBox() as ListBox;
  407 +
  408 + /// <summary>
  409 + /// Get the content ID of the focusing box
  410 + /// </summary>
  411 + public int GetFocusingContentID() =>
  412 + _listBoxController.GetFocusingBox().ContentID;
  413 +
  414 + /// <summary>
  415 + /// Make the boxes recalculate their content ID and reacquire the contents
  416 + /// </summary>
  417 + /// <param name="focusingContentID">
  418 + /// The focusing content ID after the list is refreshed
  419 + /// If it is negative, it will take current focusing content ID. <para />
  420 + /// If current focusing content ID is larger than the number of contents,
  421 + /// it will be the ID of the last content.
  422 + /// </param>
  423 + public void Refresh(int focusingContentID = -1)
  424 + {
  425 + _hasNoContent = _listContentProvider.GetContentCount() == 0;
  426 + _listBoxController.RefreshBoxes(focusingContentID);
  427 + }
  428 +
  429 + /// <summary>
  430 + /// Select the specified content ID and make it be aligned at the center
  431 + /// </summary>
  432 + /// <param name="contentID">The target content ID</param>
  433 + /// <param name="notToIgnore">
  434 + /// Not to ignore the selection movement when the list is not interactable
  435 + /// </param>
  436 + public void SelectContentID(int contentID, bool notToIgnore = true)
  437 + {
  438 + if (_hasNoContent)
  439 + return;
  440 +
  441 + if (!_listContentProvider.IsIDValid(contentID))
  442 + throw new IndexOutOfRangeException(
  443 + $"'{nameof(contentID)}' is invalid");
  444 +
  445 + var focusingContentID = GetFocusingContentID();
  446 + var idDiff =
  447 + _listContentProvider.GetShortestIDDiff(focusingContentID, contentID);
  448 +
  449 + SetSelectionMovement(idDiff, notToIgnore);
  450 + }
  451 +
  452 + #endregion
  453 +
  454 + #region Event System Callback
  455 +
  456 + public void OnBeginDrag(PointerEventData eventData)
  457 + {
  458 + if (!_controlMode.HasFlag(ControlMode.Pointer))
  459 + return;
  460 +
  461 + SetMovement(eventData, InputPhase.Began);
  462 + }
  463 +
  464 + public void OnDrag(PointerEventData eventData)
  465 + {
  466 + if (!_controlMode.HasFlag(ControlMode.Pointer))
  467 + return;
  468 +
  469 + SetMovement(eventData, InputPhase.Moved);
  470 + }
  471 +
  472 + public void OnEndDrag(PointerEventData eventData)
  473 + {
  474 + if (!_controlMode.HasFlag(ControlMode.Pointer))
  475 + return;
  476 +
  477 + SetMovement(eventData, InputPhase.Ended);
  478 + }
  479 +
  480 + public void OnScroll(PointerEventData eventData)
  481 + {
  482 + if (!_controlMode.HasFlag(ControlMode.MouseWheel))
  483 + return;
  484 +
  485 + SetMovement(eventData, InputPhase.Scrolled);
  486 + }
  487 +
  488 + #endregion
  489 +
  490 + private void Update()
  491 + {
  492 + if (!_isInitialized || !_isMoving)
  493 + return;
  494 +
  495 + var movementValue = _listMovementProcessor.GetMovement(Time.deltaTime);
  496 + _listBoxController.UpdateBoxes(movementValue);
  497 +
  498 + if (!_listMovementProcessor.IsMovementEnded())
  499 + return;
  500 +
  501 + _listSetting.OnMovementEnd.Invoke();
  502 + _isMoving = false;
  503 + }
  504 +
  505 + #region Movement Setup Functions
  506 +
  507 + /// <summary>
  508 + /// Whether to ignore the movement request or not
  509 + /// </summary>
  510 + private bool ToIgnoreMovement()
  511 + {
  512 + return _hasNoContent || !_isInteractable;
  513 + }
  514 +
  515 + /// <summary>
  516 + /// Set the movement to the list movement processor
  517 + /// </summary>
  518 + private void SetMovement(PointerEventData eventData, InputPhase phase)
  519 + {
  520 + if (ToIgnoreMovement())
  521 + return;
  522 +
  523 + var inputInfo = _inputProcessor.GetInputInfo(eventData, phase);
  524 + _listMovementProcessor.SetMovement(inputInfo);
  525 + _isMoving = true;
  526 + }
  527 +
  528 + /// <summary>
  529 + /// Set the unit movement to the list movement processor
  530 + /// </summary>
  531 + /// <param name="unit">The units to be moved</param>
  532 + private void SetUnitMovement(int unit)
  533 + {
  534 + if (ToIgnoreMovement())
  535 + return;
  536 +
  537 + _listMovementProcessor.SetUnitMovement(unit);
  538 + _isMoving = true;
  539 + }
  540 +
  541 + /// <summary>
  542 + /// Set the selection movement to the list movement processor
  543 + /// </summary>
  544 + /// <param name="shortestIDDiff">
  545 + /// The shortest id difference between centered content and the selected content
  546 + /// </param>
  547 + /// <param name="notToIgnore">Not to ignore this movement</param>
  548 + private void SetSelectionMovement(int shortestIDDiff, bool notToIgnore)
  549 + {
  550 + if (!notToIgnore && ToIgnoreMovement())
  551 + return;
  552 +
  553 + _listMovementProcessor.SetSelectionMovement(shortestIDDiff);
  554 + _isMoving = true;
  555 + }
  556 +
  557 + #endregion
  558 +
  559 + #region Editor Utility
  560 +#if UNITY_EDITOR
  561 +
  562 + /// <summary>
  563 + /// Generate the boxes and arrange them
  564 + /// </summary>
  565 + public void GenerateBoxesAndArrange()
  566 + {
  567 + if (Application.isPlaying)
  568 + return;
  569 +
  570 + GetComponentReference();
  571 + SetListBoxes();
  572 + // It's ok that the content provider is not created
  573 + var setupData = new ListSetupData(
  574 + this, _listSetting, _rectTransform, _canvasRefCamera,
  575 + new List<IListBox>(_listBoxes), null);
  576 + ListStateProcessorManager.PreviewBoxLayout(setupData);
  577 + }
  578 +
  579 +#endif
  580 + #endregion
  581 + }
  582 +}
  1 +fileFormatVersion: 2
  2 +guid: 831ecc00ba8a38f448ccce2a87cd76db
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: 3662b4ff103ca9e4e8a81d2ad481b23d
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +using System;
  2 +
  3 +namespace AirFishLab.ScrollingList.ContentManagement
  4 +{
  5 + /// <summary>
  6 + /// The state of the content id
  7 + /// </summary>
  8 + [Flags]
  9 + public enum ContentIDState
  10 + {
  11 + /// <summary>
  12 + /// There has no content in the list bank
  13 + /// </summary>
  14 + NoContent = 0,
  15 + /// <summary>
  16 + /// The id is valid for getting the content
  17 + /// </summary>
  18 + Valid = 1 << 0,
  19 + /// <summary>
  20 + /// The id is less than 0
  21 + /// </summary>
  22 + Underflow = 1 << 1,
  23 + /// <summary>
  24 + /// The id is greater than or equals to the number of the contents
  25 + /// </summary>
  26 + Overflow = 1 << 2,
  27 + /// <summary>
  28 + /// The id is the first content
  29 + /// </summary>
  30 + First = 1 << 3,
  31 + /// <summary>
  32 + /// The id is the last content
  33 + /// </summary>
  34 + Last = 1 << 4,
  35 + }
  36 +}
  1 +fileFormatVersion: 2
  2 +guid: dfc03e6cf77fbf14385c17006ef5b7fd
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +namespace AirFishLab.ScrollingList.ContentManagement
  2 +{
  3 + /// <summary>
  4 + /// The content for the list boxes
  5 + /// </summary>
  6 + public interface IListContent
  7 + {
  8 + }
  9 +}
  1 +fileFormatVersion: 2
  2 +guid: ed576fcf853bb2c4aa6cf304c1eec302
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using System;
  2 +using UnityEngine;
  3 +
  4 +namespace AirFishLab.ScrollingList.ContentManagement
  5 +{
  6 + public class ListContentProvider
  7 + {
  8 + #region Constant Value
  9 +
  10 + /// <summary>
  11 + /// The content id that represents there has no content to display
  12 + /// </summary>
  13 + public const int NO_CONTENT_ID = int.MinValue;
  14 +
  15 + #endregion
  16 +
  17 + #region Private Members
  18 +
  19 + /// <summary>
  20 + /// The setting of the list
  21 + /// </summary>
  22 + private readonly ListSetting _listSetting;
  23 + /// <summary>
  24 + /// The components holding the list contents
  25 + /// </summary>
  26 + private readonly IListBank _listBank;
  27 + /// <summary>
  28 + /// The number of the list boxes
  29 + /// </summary>
  30 + private readonly int _numOfBoxes;
  31 + /// <summary>
  32 + /// The factor for getting the next/last content ID
  33 + /// </summary>
  34 + private readonly int _idFactor;
  35 + /// <summary>
  36 + /// The function for calculating the final content ID
  37 + /// </summary>
  38 + private readonly Func<int, int> _idCalculationFunc;
  39 +
  40 + #endregion
  41 +
  42 + /// <summary>
  43 + /// Constructor
  44 + /// </summary>
  45 + /// <param name="listSetting">The setting of the list</param>
  46 + /// <param name="listBank">The list content bank</param>
  47 + /// <param name="numOfBoxes">The number of boxes</param>
  48 + public ListContentProvider(
  49 + ListSetting listSetting, IListBank listBank, int numOfBoxes)
  50 + {
  51 + _listSetting = listSetting;
  52 + _listBank = listBank;
  53 + _numOfBoxes = numOfBoxes;
  54 +
  55 + _idFactor = _listSetting.ReverseContentOrder ? -1 : 1;
  56 + if (_listSetting.ListType == CircularScrollingList.ListType.Circular)
  57 + _idCalculationFunc = GetLoopedContentID;
  58 + else
  59 + _idCalculationFunc = GetNonLoopedContentID;
  60 + }
  61 +
  62 + #region Content ID Calculation
  63 +
  64 + /// <summary>
  65 + /// Get the initial content ID for the specified box
  66 + /// </summary>
  67 + /// <param name="listBoxID">The id of the box</param>
  68 + /// <returns>The content ID</returns>
  69 + public int GetInitialContentID(int listBoxID)
  70 + {
  71 + var contentCount = GetContentCount();
  72 + if (contentCount == 0)
  73 + return NO_CONTENT_ID;
  74 +
  75 + var contentID = 0;
  76 + var initFocusedContentID = _listSetting.InitFocusingContentID;
  77 + switch (_listSetting.FocusingPosition) {
  78 + case CircularScrollingList.FocusingPosition.Top:
  79 + case CircularScrollingList.FocusingPosition.Bottom:
  80 + if (_listSetting.ListType
  81 + == CircularScrollingList.ListType.Circular)
  82 + // No need to do content adjusting in the circular mode
  83 + contentID = 0;
  84 + else if (contentCount <= _numOfBoxes)
  85 + initFocusedContentID = 0;
  86 + else {
  87 + var numOfLackingContents =
  88 + contentCount - initFocusedContentID - _numOfBoxes;
  89 + if (numOfLackingContents < 0)
  90 + initFocusedContentID += numOfLackingContents;
  91 + }
  92 +
  93 + // The reverse content order will be true,
  94 + // if focusing position is 'bottom'.
  95 + // Otherwise, it will be false.
  96 + contentID =
  97 + _listSetting.ReverseContentOrder
  98 + ? _numOfBoxes - 1 - listBoxID + initFocusedContentID
  99 + : listBoxID + initFocusedContentID;
  100 + break;
  101 +
  102 + case CircularScrollingList.FocusingPosition.Center:
  103 + contentID =
  104 + _listSetting.ReverseContentOrder
  105 + ? _numOfBoxes / 2 - listBoxID
  106 + : listBoxID - _numOfBoxes / 2;
  107 + contentID += initFocusedContentID;
  108 + break;
  109 + }
  110 +
  111 + return _idCalculationFunc(contentID);
  112 + }
  113 +
  114 + /// <summary>
  115 + /// Get the content id after the list content is refreshed
  116 + /// </summary>
  117 + /// <param name="origContentID">The original content ID</param>
  118 + /// <returns>The converted content ID</returns>
  119 + public int GetRefreshedContentID(int origContentID) =>
  120 + _listBank.GetContentCount() == 0
  121 + ? NO_CONTENT_ID
  122 + : _idCalculationFunc(origContentID);
  123 +
  124 + /// <summary>
  125 + /// Get the content ID according to the content ID of the next box
  126 + /// </summary>
  127 + /// <param name="nextBoxContentID">The content ID of the next box</param>
  128 + /// <returns>The content ID</returns>
  129 + public int GetContentIDByNextBox(int nextBoxContentID) =>
  130 + _idCalculationFunc(nextBoxContentID - _idFactor);
  131 +
  132 + /// <summary>
  133 + /// Get the content ID according to the content ID of the last box
  134 + /// </summary>
  135 + /// <param name="lastBoxContentID">The content ID of the last box</param>
  136 + /// <returns>The content ID</returns>
  137 + public int GetContentIDByLastBox(int lastBoxContentID) =>
  138 + _idCalculationFunc(lastBoxContentID + _idFactor);
  139 +
  140 + /// <summary>
  141 + /// Check the state of the specified id
  142 + /// </summary>
  143 + /// <param name="contentID">The content id</param>
  144 + /// <returns>The state of the id</returns>
  145 + public ContentIDState GetIDState(int contentID)
  146 + {
  147 + return GetIDState(contentID, _listBank.GetContentCount());
  148 + }
  149 +
  150 + /// <summary>
  151 + /// Check the state of the specified id
  152 + /// </summary>
  153 + /// <param name="contentID">The content id</param>
  154 + /// <param name="contentCount">The number of the contents</param>
  155 + /// <returns>The state of the id</returns>
  156 + public static ContentIDState GetIDState(int contentID, int contentCount)
  157 + {
  158 + if (contentID == NO_CONTENT_ID)
  159 + return ContentIDState.NoContent;
  160 +
  161 + var state = contentID < 0
  162 + ? ContentIDState.Underflow
  163 + : contentID >= contentCount
  164 + ? ContentIDState.Overflow
  165 + : ContentIDState.Valid;
  166 +
  167 + if (state != ContentIDState.Valid)
  168 + return state;
  169 +
  170 + if (contentID == 0)
  171 + state |= ContentIDState.First;
  172 + if (contentID == contentCount - 1)
  173 + state |= ContentIDState.Last;
  174 +
  175 + return state;
  176 + }
  177 +
  178 + /// <summary>
  179 + /// Is the content id valid for getting the list content?
  180 + /// </summary>
  181 + /// <param name="contentID">The content id</param>
  182 + /// <returns>The content id is valid or not</returns>
  183 + public bool IsIDValid(int contentID) =>
  184 + contentID >= 0 && contentID < _listBank.GetContentCount();
  185 +
  186 + /// <summary>
  187 + /// Get the shortest length for starting from one id to another id
  188 + /// </summary>
  189 + /// <param name="fromContentID">The starting content id</param>
  190 + /// <param name="toContentID">The target content id</param>
  191 + /// <returns>The shortest length</returns>
  192 + public int GetShortestIDDiff(int fromContentID, int toContentID)
  193 + {
  194 + if (!IsIDValid(fromContentID))
  195 + throw new IndexOutOfRangeException(nameof(fromContentID));
  196 + if (!IsIDValid(toContentID))
  197 + throw new IndexOutOfRangeException(nameof(toContentID));
  198 +
  199 + var length = toContentID - fromContentID;
  200 +
  201 + if (_listSetting.ListType == CircularScrollingList.ListType.Linear)
  202 + return length;
  203 +
  204 + var numOfContents = _listBank.GetContentCount();
  205 + var halfNumOfContents = numOfContents / 2;
  206 +
  207 + if (Mathf.Abs(length) > halfNumOfContents)
  208 + length -= (int) Mathf.Sign(length) * numOfContents;
  209 +
  210 + return length;
  211 + }
  212 +
  213 + /// <summary>
  214 + /// Loop the input ID within the range of the indexes of the contents
  215 + /// </summary>
  216 + private int GetLoopedContentID(int contentID) =>
  217 + (int)Mathf.Repeat(contentID, _listBank.GetContentCount());
  218 +
  219 + /// <summary>
  220 + /// Just return the input ID
  221 + /// </summary>
  222 + private int GetNonLoopedContentID(int contentID) => contentID;
  223 +
  224 + #endregion
  225 +
  226 + #region Content Handling
  227 +
  228 + /// <summary>
  229 + /// Get the number of the contents
  230 + /// </summary>
  231 + public int GetContentCount() => _listBank.GetContentCount();
  232 +
  233 + /// <summary>
  234 + /// Try to get the content of the list
  235 + /// </summary>
  236 + /// <param name="contentID">The id of the content</param>
  237 + /// <param name="content">
  238 + /// The content. If the content is not available, it will be null.
  239 + /// </param>
  240 + /// <returns>It the content available?</returns>
  241 + public bool TryGetContent(int contentID, out IListContent content)
  242 + {
  243 + var isIDValid = IsIDValid(contentID);
  244 + content = isIDValid ? _listBank.GetListContent(contentID) : null;
  245 + return isIDValid;
  246 + }
  247 +
  248 + #endregion
  249 + }
  250 +}
  1 +fileFormatVersion: 2
  2 +guid: b89e5bd958468194e8d125d7fb9348bb
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using AirFishLab.ScrollingList.ContentManagement;
  2 +
  3 +namespace AirFishLab.ScrollingList
  4 +{
  5 + public interface IListBank
  6 + {
  7 + /// <summary>
  8 + /// Get the list content
  9 + /// </summary>
  10 + /// <param name="index">The index of the content</param>
  11 + /// <returns>The content</returns>
  12 + IListContent GetListContent(int index);
  13 +
  14 + /// <summary>
  15 + /// Get the number of the contents
  16 + /// </summary>
  17 + /// <returns>The number of content</returns>
  18 + int GetContentCount();
  19 + }
  20 +}
  1 +fileFormatVersion: 2
  2 +guid: 02ac4bf6ed5ab1241a409616eafd1d81
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using AirFishLab.ScrollingList.ContentManagement;
  2 +using UnityEngine;
  3 +
  4 +namespace AirFishLab.ScrollingList
  5 +{
  6 + /// <summary>
  7 + /// The interface of the list box
  8 + /// </summary>
  9 + public interface IListBox
  10 + {
  11 + /// <summary>
  12 + /// The id of the box
  13 + /// </summary>
  14 + int ListBoxID { get; }
  15 +
  16 + /// <summary>
  17 + /// The id of the content that the box refers
  18 + /// </summary>
  19 + int ContentID { get; }
  20 +
  21 + /// <summary>
  22 + /// The last list box
  23 + /// </summary>
  24 + IListBox LastListBox { get; }
  25 +
  26 + /// <summary>
  27 + /// The next list box
  28 + /// </summary>
  29 + IListBox NextListBox { get; }
  30 +
  31 + /// <summary>
  32 + /// The event to be invoked when the box is selected
  33 + /// </summary>
  34 + ListBoxSelectedEvent OnBoxSelected { get; }
  35 +
  36 + /// <summary>
  37 + /// Is the box activated?
  38 + /// </summary>
  39 + bool IsActivated { get; set; }
  40 +
  41 + /// <summary>
  42 + /// The list which this box belongs to
  43 + /// </summary>
  44 + CircularScrollingList ScrollingList { get; }
  45 +
  46 + /// <summary>
  47 + /// Initialize the list box
  48 + /// </summary>
  49 + /// <param name="scrollingList">The list which this box belongs to</param>
  50 + /// <param name="listBoxID">The id of the box</param>
  51 + /// <param name="lastListBox">The last box</param>
  52 + /// <param name="nextListBox">The next box</param>
  53 + void Initialize(
  54 + CircularScrollingList scrollingList,
  55 + int listBoxID, IListBox lastListBox, IListBox nextListBox);
  56 +
  57 + /// <summary>
  58 + /// Get the transform of the box
  59 + /// </summary>
  60 + /// <returns>The transform of the box</returns>
  61 + Transform GetTransform();
  62 +
  63 + /// <summary>
  64 + /// Get the box position factor in the list
  65 + /// </summary>
  66 + /// <returns>The box position factor</returns>
  67 + float GetPositionFactor();
  68 +
  69 + /// <summary>
  70 + /// The function to be invoked when the box is moved
  71 + /// NOTE: This function is for the future feature
  72 + /// </summary>
  73 + /// <param name="positionRatio">
  74 + /// The ratio of the position in the list, which is from -1 to 1.
  75 + /// 0 means that thw box is at the center of the list
  76 + /// </param>
  77 + void OnBoxMoved(float positionRatio);
  78 +
  79 + /// <summary>
  80 + /// Set the content id of the box
  81 + /// </summary>
  82 + /// <param name="contentID">The content id</param>
  83 + void SetContentID(int contentID);
  84 +
  85 + /// <summary>
  86 + /// Set the content for the box
  87 + /// </summary>
  88 + /// <param name="content">The content</param>
  89 + void SetContent(IListContent content);
  90 +
  91 + /// <summary>
  92 + /// Pop the box to the front
  93 + /// </summary>
  94 + void PopToFront();
  95 +
  96 + /// <summary>
  97 + /// Push the box to the back
  98 + /// </summary>
  99 + void PushToBack();
  100 + }
  101 +}
  1 +fileFormatVersion: 2
  2 +guid: bbd60f6bae853ab4aa572073d97ddd72
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: 003d0c2e746f8d44daa94f9eb7d985b3
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +using UnityEngine;
  2 +
  3 +namespace AirFishLab.ScrollingList
  4 +{
  5 + /// <summary>
  6 + /// The data of the input information
  7 + /// </summary>
  8 + public struct InputInfo
  9 + {
  10 + /// <summary>
  11 + /// The phase of the input timing
  12 + /// </summary>
  13 + public InputPhase Phase;
  14 +
  15 + /// <summary>
  16 + /// The local delta position of the input
  17 + /// </summary>
  18 + /// <remarks>
  19 + /// If the <c>Phase</c> is Began, the value will be 0.
  20 + /// If the <c>Phase</c> is Scrolled, the value will be scroll delta.
  21 + /// </remarks>
  22 + public Vector2 DeltaLocalPos;
  23 +
  24 + /// <summary>
  25 + /// The normalized delta position whose value is [-1, 1]
  26 + /// </summary>
  27 + public Vector2 DeltaLocalPosNormalized;
  28 +
  29 + /// <summary>
  30 + /// The delta time between two input events
  31 + /// </summary>
  32 + /// <remarks>
  33 + /// If the <c>Phase</c> is Began or Scrolled, it will be 0.
  34 + /// </remarks>
  35 + public float DeltaTime;
  36 +
  37 + public override string ToString() =>
  38 + $"Phase: {Phase}, "
  39 + + $"DeltaLocalPos: {DeltaLocalPos}, "
  40 + + $"DeltaLocalPosNormalized: {DeltaLocalPosNormalized}, "
  41 + + $"DeltaTime: {DeltaTime}";
  42 + }
  43 +
  44 + /// <summary>
  45 + /// The phase of the input timing
  46 + /// </summary>
  47 + public enum InputPhase
  48 + {
  49 + None,
  50 + Began,
  51 + Moved,
  52 + Ended,
  53 + Scrolled
  54 + }
  55 +}
  1 +fileFormatVersion: 2
  2 +guid: 28884e566e24aba449221d18fa6a7738
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using UnityEngine;
  2 +using UnityEngine.EventSystems;
  3 +
  4 +namespace AirFishLab.ScrollingList
  5 +{
  6 + /// <summary>
  7 + /// The class for processing the input value
  8 + /// </summary>
  9 + public class InputProcessor
  10 + {
  11 + #region Private Members
  12 +
  13 + /// <summary>
  14 + /// The target detecting rect transform
  15 + /// </summary>
  16 + private readonly RectTransform _rectTransform;
  17 + /// <summary>
  18 + /// The maximum coordinate of the target rect transform
  19 + /// </summary>
  20 + private readonly Vector2 _maxRectPos;
  21 + /// <summary>
  22 + /// The camera which the canvas is referenced
  23 + /// </summary>
  24 + private readonly Camera _canvasRefCamera;
  25 + /// <summary>
  26 + /// The time of the last input event
  27 + /// </summary>
  28 + private float _lastInputTime;
  29 + /// <summary>
  30 + /// The last input position in the space of the target rect transform
  31 + /// </summary>
  32 + private Vector2 _lastLocalInputPos;
  33 +
  34 + #endregion
  35 +
  36 + public InputProcessor(RectTransform rectTransform, Camera canvasRefCamera)
  37 + {
  38 + _rectTransform = rectTransform;
  39 + _maxRectPos = _rectTransform.rect.max;
  40 + _canvasRefCamera = canvasRefCamera;
  41 + }
  42 +
  43 + /// <summary>
  44 + /// Get the input information according to the input event data
  45 + /// </summary>
  46 + public InputInfo GetInputInfo(PointerEventData eventData, InputPhase phase)
  47 + {
  48 + var deltaPos =
  49 + phase == InputPhase.Scrolled
  50 + ? GetScrollDeltaPos(eventData.scrollDelta)
  51 + : GetDeltaPos(eventData.position, phase);
  52 + var deltaPosNormalized =
  53 + new Vector2(
  54 + deltaPos.x / _maxRectPos.x,
  55 + deltaPos.y / _maxRectPos.y);
  56 +
  57 + var curTime = Time.realtimeSinceStartup;
  58 + if (phase == InputPhase.Began || phase == InputPhase.Scrolled)
  59 + _lastInputTime = curTime;
  60 + var deltaTime = curTime - _lastInputTime;
  61 + _lastInputTime = curTime;
  62 +
  63 + return new InputInfo {
  64 + Phase = phase,
  65 + DeltaLocalPos = deltaPos,
  66 + DeltaLocalPosNormalized = deltaPosNormalized,
  67 + DeltaTime = deltaTime
  68 + };
  69 + }
  70 +
  71 + /// <summary>
  72 + /// Get the unit delta pos for the scrolling
  73 + /// </summary>
  74 + /// <param name="scrollDelta">The original input value</param>
  75 + /// <returns>The unit delta pos</returns>
  76 + private Vector2 GetScrollDeltaPos(Vector2 scrollDelta)
  77 + {
  78 + // Ignore the scalar, only return the unit pos and the direction
  79 + return scrollDelta.y > 0 ? Vector2.up : Vector2.down;
  80 + }
  81 +
  82 + /// <summary>
  83 + /// Calculate the local delta position
  84 + /// </summary>
  85 + private Vector2 GetDeltaPos(Vector2 screenInputPos, InputPhase phase)
  86 + {
  87 + RectTransformUtility.ScreenPointToLocalPointInRectangle(
  88 + _rectTransform, screenInputPos, _canvasRefCamera, out var localPos);
  89 +
  90 + if (phase == InputPhase.Began) {
  91 + _lastLocalInputPos = localPos;
  92 + return Vector2.zero;
  93 + }
  94 +
  95 + var deltaPos = localPos - _lastLocalInputPos;
  96 + _lastLocalInputPos = localPos;
  97 + return deltaPos;
  98 + }
  99 + }
  100 +}
  1 +fileFormatVersion: 2
  2 +guid: 3a564f7df25922643abfa1ba9977145e
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using AirFishLab.ScrollingList.ContentManagement;
  2 +using UnityEngine;
  3 +
  4 +namespace AirFishLab.ScrollingList
  5 +{
  6 + /// <summary>
  7 + /// Store the contents for the list boxes to display
  8 + /// </summary>
  9 + public abstract class BaseListBank : MonoBehaviour, IListBank
  10 + {
  11 + public abstract IListContent GetListContent(int index);
  12 + public abstract int GetContentCount();
  13 + }
  14 +
  15 +/* The example of the ListBank
  16 + */
  17 + public class ListBank : BaseListBank
  18 + {
  19 + private int[] contents = {
  20 + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  21 + };
  22 +
  23 + private readonly Content _contentWrapper = new Content();
  24 +
  25 + public override IListContent GetListContent(int index)
  26 + {
  27 + _contentWrapper.Value = contents[index];
  28 + return _contentWrapper;
  29 + }
  30 +
  31 + public override int GetContentCount()
  32 + {
  33 + return contents.Length;
  34 + }
  35 +
  36 + public class Content : IListContent
  37 + {
  38 + public int Value;
  39 + }
  40 + }
  41 +}
  1 +fileFormatVersion: 2
  2 +guid: baffa4b9e229e4b4d9a150fcb5a60153
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using System;
  2 +using AirFishLab.ScrollingList.ContentManagement;
  3 +using AirFishLab.ScrollingList.Util;
  4 +using UnityEngine;
  5 +using UnityEngine.UI;
  6 +
  7 +namespace AirFishLab.ScrollingList
  8 +{
  9 + /// <summary>
  10 + /// The basic component of the scrolling list.
  11 + /// Control the position and update the content of the list element.
  12 + /// </summary>
  13 + public class ListBox : MonoBehaviour, IListBox
  14 + {
  15 + #region Properties of IListBox
  16 +
  17 + public int ListBoxID { get; private set; }
  18 + public int ContentID { get; private set; }
  19 + public IListBox LastListBox { get; private set; }
  20 + public IListBox NextListBox { get; private set; }
  21 + public ListBoxSelectedEvent OnBoxSelected { get; } = new ListBoxSelectedEvent();
  22 + public CircularScrollingList ScrollingList { get; private set; }
  23 + public bool IsActivated
  24 + {
  25 + get => _gameObject.activeSelf;
  26 + set => _gameObject.SetActive(value);
  27 + }
  28 +
  29 + #endregion
  30 +
  31 + #region Private Members
  32 +
  33 + private GameObject _gameObject;
  34 + private Transform _transform;
  35 + private Func<Vector2, float> _factorFunc;
  36 +
  37 + #endregion
  38 +
  39 + #region IListBox
  40 +
  41 + public void Initialize(
  42 + CircularScrollingList scrollingList,
  43 + int listBoxID, IListBox lastListBox, IListBox nextListBox)
  44 + {
  45 + ScrollingList = scrollingList;
  46 + ListBoxID = listBoxID;
  47 + LastListBox = lastListBox;
  48 + NextListBox = nextListBox;
  49 +
  50 + _gameObject = gameObject;
  51 + _transform = transform;
  52 + if (scrollingList.ListSetting.Direction
  53 + == CircularScrollingList.Direction.Horizontal)
  54 + _factorFunc = FactorUtility.GetVector2X;
  55 + else
  56 + _factorFunc = FactorUtility.GetVector2Y;
  57 +
  58 + RegisterClickEvent();
  59 +
  60 + OnInitialized();
  61 + }
  62 +
  63 + public Transform GetTransform()
  64 + {
  65 +#if UNITY_EDITOR
  66 + if (!Application.isPlaying)
  67 + return transform;
  68 +#endif
  69 + return _transform;
  70 + }
  71 +
  72 + public float GetPositionFactor()
  73 + {
  74 + return _factorFunc(_transform.localPosition);
  75 + }
  76 +
  77 + public virtual void OnBoxMoved(float positionRatio)
  78 + {}
  79 +
  80 + public void SetContentID(int contentID)
  81 + {
  82 + ContentID = contentID;
  83 + }
  84 +
  85 + public void SetContent(IListContent content)
  86 + {
  87 + UpdateDisplayContent(content);
  88 + }
  89 +
  90 + public void PopToFront()
  91 + {
  92 + transform.SetAsLastSibling();
  93 + }
  94 +
  95 + public void PushToBack()
  96 + {
  97 + transform.SetAsFirstSibling();
  98 + }
  99 +
  100 + #endregion
  101 +
  102 + #region Initialization
  103 +
  104 + /// <summary>
  105 + /// Register the callback to the button clicking event
  106 + /// </summary>
  107 + private void RegisterClickEvent()
  108 + {
  109 + if (TryGetComponent<Button>(out var button)) {
  110 + button.onClick.AddListener(OnButtonClick);
  111 + }
  112 + }
  113 +
  114 + private void OnButtonClick()
  115 + {
  116 + OnBoxSelected?.Invoke(this);
  117 + }
  118 +
  119 + #endregion
  120 +
  121 + #region Content Handling
  122 +
  123 + /// <summary>
  124 + /// This function is called after the box is initialized
  125 + /// </summary>
  126 + protected virtual void OnInitialized()
  127 + {}
  128 +
  129 + /// <summary>
  130 + /// Update the displaying content on the ListBox
  131 + /// </summary>
  132 + /// <param name="content">The content to be displayed</param>
  133 + protected virtual void UpdateDisplayContent(IListContent content)
  134 + {
  135 + Debug.Log(content);
  136 + }
  137 +
  138 + #endregion
  139 + }
  140 +}
  1 +fileFormatVersion: 2
  2 +guid: d74fb0bc5cdce554eba6c60a0e789157
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using System;
  2 +using UnityEngine;
  3 +
  4 +namespace AirFishLab.ScrollingList
  5 +{
  6 + [Serializable]
  7 + public class ListBoxSetting
  8 + {
  9 + [SerializeField]
  10 + [Tooltip("The root transform that holding the list boxes")]
  11 + private Transform _boxRootTransform;
  12 + [SerializeField]
  13 + [Tooltip("The prefab of the box")]
  14 + private ListBox _boxPrefab;
  15 + [SerializeField, Min(1)]
  16 + [Tooltip("The number of boxes to be generated")]
  17 + private int _numOfBoxes = 5;
  18 +
  19 + public Transform BoxRootTransform
  20 + {
  21 + get => _boxRootTransform;
  22 + set => _boxRootTransform = value;
  23 + }
  24 + public ListBox BoxPrefab => _boxPrefab;
  25 + public int NumOfBoxes => _numOfBoxes;
  26 +
  27 + #region Private Members
  28 +
  29 + /// <summary>
  30 + /// The name of the list
  31 + /// </summary>
  32 + private string _name;
  33 + /// <summary>
  34 + /// Is the setting initialized?
  35 + /// </summary>
  36 + private bool _isInitialized;
  37 +
  38 + #endregion
  39 +
  40 + #region Property Setter
  41 +
  42 + public void SetBoxRootTransform(RectTransform rootTransform)
  43 + {
  44 + if (CheckIsInitialized())
  45 + return;
  46 +
  47 + _boxRootTransform = rootTransform;
  48 + }
  49 +
  50 + public void SetBoxPrefab(ListBox boxPrefab)
  51 + {
  52 + if (CheckIsInitialized())
  53 + return;
  54 +
  55 + _boxPrefab = boxPrefab;
  56 + }
  57 +
  58 + public void SetNumOfBoxes(int numOfBoxes)
  59 + {
  60 + if (CheckIsInitialized())
  61 + return;
  62 +
  63 + _numOfBoxes = numOfBoxes;
  64 + }
  65 +
  66 + #endregion
  67 +
  68 + /// <summary>
  69 + /// Is the box setting initialized?
  70 + /// </summary>
  71 + private bool CheckIsInitialized()
  72 + {
  73 + if (_isInitialized)
  74 + Debug.LogWarning(
  75 + $"The list setting of the list '{_name}' is initialized. Skip");
  76 +
  77 + return _isInitialized;
  78 + }
  79 +
  80 + /// <summary>
  81 + /// Initialize the setting
  82 + /// </summary>
  83 + /// <param name="listObject">The game object of the scrolling list</param>
  84 + public void Initialize(GameObject listObject)
  85 + {
  86 + var listName = listObject.name;
  87 +
  88 + if (!BoxRootTransform) {
  89 + Debug.LogWarning(
  90 + $"The 'BoxRootTransform' is not assigned in the list '{listName}'. "
  91 + + "Use itself as the 'BoxRootTransform'");
  92 + BoxRootTransform = listObject.transform;
  93 + }
  94 +
  95 + if (!BoxPrefab)
  96 + throw new UnassignedReferenceException(
  97 + $"The 'BoxPrefab' is not assigned in the list '{listName}'");
  98 +
  99 + if (NumOfBoxes <= 0)
  100 + throw new InvalidOperationException(
  101 + $"The 'NumOfBoxes' is 0 or negative in the list '{listName}'");
  102 +
  103 + _name = listName;
  104 + _isInitialized = true;
  105 + }
  106 + }
  107 +}
  1 +fileFormatVersion: 2
  2 +guid: 59ac863c7aee14240a107bdee39edb86
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using System;
  2 +using UnityEngine.Events;
  3 +
  4 +namespace AirFishLab.ScrollingList
  5 +{
  6 + /// <summary>
  7 + /// This event is used for passing the selected box
  8 + /// </summary>
  9 + [Serializable]
  10 + public class ListBoxSelectedEvent : UnityEvent<ListBox>
  11 + {}
  12 +
  13 + /// <summary>
  14 + /// This event is used for passing the two list boxes
  15 + /// </summary>
  16 + [Serializable]
  17 + public class ListTwoBoxesEvent : UnityEvent<ListBox, ListBox>
  18 + {}
  19 +}
  1 +fileFormatVersion: 2
  2 +guid: 588b9c003192ecc43afce3f28213e518
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using System;
  2 +using UnityEngine;
  3 +using UnityEngine.Events;
  4 +using UnityEngine.Serialization;
  5 +
  6 +namespace AirFishLab.ScrollingList
  7 +{
  8 + [Serializable]
  9 + public class ListSetting
  10 + {
  11 + #region List Mode
  12 +
  13 + [SerializeField]
  14 + [Tooltip("The type of the list.")]
  15 + private CircularScrollingList.ListType _listType =
  16 + CircularScrollingList.ListType.Circular;
  17 + [SerializeField]
  18 + [Tooltip("The major moving direction of the list.")]
  19 + private CircularScrollingList.Direction _direction =
  20 + CircularScrollingList.Direction.Vertical;
  21 + [SerializeField]
  22 + [Tooltip("The controlling mode of the list.")]
  23 + private CircularScrollingList.ControlMode _controlMode =
  24 + CircularScrollingList.ControlMode.Everything;
  25 + [SerializeField]
  26 + [Tooltip("The focusing position of the list")]
  27 + private CircularScrollingList.FocusingPosition _focusingPosition =
  28 + CircularScrollingList.FocusingPosition.Center;
  29 + [SerializeField]
  30 + [Tooltip("To show the list contents in the reversed order. "
  31 + + "Available when the 'FocusingPosition' is 'center'")]
  32 + [FormerlySerializedAs("_reverseOrder")]
  33 + private bool _reverseContentOrder;
  34 + [SerializeField]
  35 + [Tooltip("To align a box at the focusing position after sliding")]
  36 + [FormerlySerializedAs("_alignMiddle")]
  37 + [FormerlySerializedAs("_alignInCenter")]
  38 + private bool _alignAtFocusingPosition;
  39 + [SerializeField]
  40 + [Tooltip("To reverse the scrolling direction")]
  41 + [FormerlySerializedAs("_reverseDirection")]
  42 + private bool _reverseScrollingDirection;
  43 + [SerializeField]
  44 + [Tooltip("Specify the initial content ID at the focusing position")]
  45 + [FormerlySerializedAs(" _centeredContentID")]
  46 + private int _initFocusingContentID;
  47 + [SerializeField]
  48 + [Tooltip("Move the selected box to the focusing position")]
  49 + [FormerlySerializedAs("_centerSelectedBox")]
  50 + private bool _focusSelectedBox;
  51 + [SerializeField]
  52 + [Tooltip("Whether to initialize the list on Start or not. " +
  53 + "If set to false, manually call Initialize() to initialize the list.")]
  54 + private bool _initializeOnStart = true;
  55 +
  56 + #endregion
  57 +
  58 + #region List Appearance
  59 +
  60 + [SerializeField]
  61 + [Tooltip("The factor that adjusting the distance between boxes. " +
  62 + "The larger, the closer.")]
  63 + private float _boxDensity = 1.0f;
  64 + [SerializeField]
  65 + [Tooltip("The curve specifying the passive position of the box. " +
  66 + "The x axis is the major position of the box, which is mapped to [-1, 1]. " +
  67 + "The y axis defines the factor of the passive position of the box. " +
  68 + "Point (0, 0) is the center of the list layout.")]
  69 + private AnimationCurve _boxPositionCurve =
  70 + AnimationCurve.Constant(-1.0f, 1.0f, 0.0f);
  71 + [SerializeField]
  72 + [Tooltip("The curve specifying the box scale. " +
  73 + "The x axis is the major position of the box, which is mapped to [-1, 1]. " +
  74 + "The y axis specifies the value of 'localScale' of the box at the " +
  75 + "corresponding position.")]
  76 + private AnimationCurve _boxScaleCurve =
  77 + AnimationCurve.Constant(-1.0f, 1.0f, 1.0f);
  78 + [SerializeField]
  79 + [Tooltip("The curve specifying the velocity factor of the box after releasing. " +
  80 + "The x axis is the the moving duration in seconds, which starts from 0. " +
  81 + "The y axis is the factor of releasing velocity.")]
  82 + private AnimationCurve _boxVelocityCurve =
  83 + new AnimationCurve(
  84 + new Keyframe(0.0f, 1.0f, 0.0f, -2.5f),
  85 + new Keyframe(1.0f, 0.0f, 0.0f, 0.0f));
  86 + [SerializeField]
  87 + [Tooltip("The curve specifying the movement factor of the box. " +
  88 + "The x axis is the moving duration in seconds, which starts from 0. " +
  89 + "The y axis is the lerping factor for reaching the target position.")]
  90 + private AnimationCurve _boxMovementCurve =
  91 + new AnimationCurve(
  92 + new Keyframe(0.0f, 0.0f, 0.0f, 8f),
  93 + new Keyframe(0.25f, 1.0f, 0.0f, 0.0f));
  94 +
  95 + #endregion
  96 +
  97 + #region Events
  98 +
  99 + [SerializeField]
  100 + [Tooltip("The callback to be invoked when a box is selected. " +
  101 + "The registered callbacks will be added to the 'onClick' event of boxes, " +
  102 + "therefore, boxes should be 'Button's.")]
  103 + private ListBoxSelectedEvent _onBoxSelected;
  104 + [SerializeField]
  105 + [Tooltip("The callback to be invoked when the focusing box is changed. " +
  106 + "The first argument is previous focusing box, " +
  107 + "and the second one is current focusing box.")]
  108 + [FormerlySerializedAs("_onCenteredBoxChanged")]
  109 + private ListTwoBoxesEvent _onFocusingBoxChanged;
  110 + [SerializeField]
  111 + [Tooltip("The callback to be invoked when the movement is ended")]
  112 + private UnityEvent _onMovementEnd;
  113 +
  114 + #endregion
  115 +
  116 + #region Setting Getter
  117 +
  118 + public CircularScrollingList.ListType ListType => _listType;
  119 + public CircularScrollingList.Direction Direction => _direction;
  120 + public CircularScrollingList.ControlMode ControlMode => _controlMode;
  121 + public bool AlignAtFocusingPosition => _alignAtFocusingPosition;
  122 + public bool ReverseScrollingDirection => _reverseScrollingDirection;
  123 + public CircularScrollingList.FocusingPosition FocusingPosition =>
  124 + _focusingPosition;
  125 + public bool ReverseContentOrder => _reverseContentOrder;
  126 + public int InitFocusingContentID => _initFocusingContentID;
  127 + public bool FocusSelectedBox => _focusSelectedBox;
  128 + public bool InitializeOnStart => _initializeOnStart;
  129 +
  130 + public float BoxDensity => _boxDensity;
  131 + public AnimationCurve BoxPositionCurve => _boxPositionCurve;
  132 + public AnimationCurve BoxScaleCurve => _boxScaleCurve;
  133 + public AnimationCurve BoxVelocityCurve => _boxVelocityCurve;
  134 + public AnimationCurve BoxMovementCurve => _boxMovementCurve;
  135 +
  136 + public ListBoxSelectedEvent OnBoxSelected => _onBoxSelected;
  137 + public ListTwoBoxesEvent OnFocusingBoxChanged => _onFocusingBoxChanged;
  138 + public UnityEvent OnMovementEnd => _onMovementEnd;
  139 +
  140 + #endregion
  141 +
  142 + #region Private Members
  143 +
  144 + /// <summary>
  145 + /// The name of the list
  146 + /// </summary>
  147 + private string _name;
  148 + /// <summary>
  149 + /// Is the setting initialized?
  150 + /// </summary>
  151 + private bool _isInitialized;
  152 +
  153 + #endregion
  154 +
  155 + #region Property Setters
  156 +
  157 + public void SetListType(CircularScrollingList.ListType listType)
  158 + {
  159 + if (CheckIsInitialized())
  160 + return;
  161 +
  162 + _listType = listType;
  163 + }
  164 +
  165 + public void SetDirection(CircularScrollingList.Direction direction)
  166 + {
  167 + if (CheckIsInitialized())
  168 + return;
  169 +
  170 + _direction = direction;
  171 + }
  172 +
  173 + public void SetControlMode(CircularScrollingList.ControlMode controlMode)
  174 + {
  175 + if (CheckIsInitialized())
  176 + return;
  177 +
  178 + _controlMode = controlMode;
  179 + }
  180 +
  181 + public void SetAlignAtFocusingPosition(bool toAlign)
  182 + {
  183 + if (CheckIsInitialized())
  184 + return;
  185 +
  186 + _alignAtFocusingPosition = toAlign;
  187 + }
  188 +
  189 + public void SetReverseScrollingDirection(bool toReverse)
  190 + {
  191 + if (CheckIsInitialized())
  192 + return;
  193 +
  194 + _reverseScrollingDirection = toReverse;
  195 + }
  196 +
  197 + public void SetFocusingPosition(
  198 + CircularScrollingList.FocusingPosition focusingPosition)
  199 + {
  200 + if (CheckIsInitialized())
  201 + return;
  202 +
  203 + _focusingPosition = focusingPosition;
  204 + }
  205 +
  206 + public void SetReverseContentOrder(bool toReverse)
  207 + {
  208 + if (CheckIsInitialized())
  209 + return;
  210 +
  211 + _reverseContentOrder = toReverse;
  212 + }
  213 +
  214 + public void SetInitFocusingContentID(int contentID)
  215 + {
  216 + if (CheckIsInitialized())
  217 + return;
  218 +
  219 + _initFocusingContentID = contentID;
  220 + }
  221 +
  222 + public void SetFocusSelectedBox(bool toFocus)
  223 + {
  224 + if (CheckIsInitialized())
  225 + return;
  226 +
  227 + _focusSelectedBox = toFocus;
  228 + }
  229 +
  230 + #endregion
  231 +
  232 + #region Appearance Setters
  233 +
  234 + public void SetBoxDensity(float boxDensity)
  235 + {
  236 + if (CheckIsInitialized())
  237 + return;
  238 +
  239 + _boxDensity = boxDensity;
  240 + }
  241 +
  242 + public void SetBoxPositionCurve(AnimationCurve curve)
  243 + {
  244 + if (CheckIsInitialized())
  245 + return;
  246 +
  247 + _boxPositionCurve = curve;
  248 + }
  249 +
  250 + public void SetBoxScaleCurve(AnimationCurve curve)
  251 + {
  252 + if (CheckIsInitialized())
  253 + return;
  254 +
  255 + _boxScaleCurve = curve;
  256 + }
  257 +
  258 + public void SetBoxVelocityCurve(AnimationCurve curve)
  259 + {
  260 + if (CheckIsInitialized())
  261 + return;
  262 +
  263 + _boxVelocityCurve = curve;
  264 + }
  265 +
  266 + public void SetBoxMovementCurve(AnimationCurve curve)
  267 + {
  268 + if (CheckIsInitialized())
  269 + return;
  270 +
  271 + _boxMovementCurve = curve;
  272 + }
  273 +
  274 + #endregion
  275 +
  276 + #region Event Setters
  277 +
  278 + public void AddOnBoxSelectedCallback(UnityAction<ListBox> callback) =>
  279 + _onBoxSelected.AddListener(callback);
  280 +
  281 + public void RemoveOnBoxSelectedCallback(UnityAction<ListBox> callback) =>
  282 + _onBoxSelected.RemoveListener(callback);
  283 +
  284 + public void AddOnFocusingBoxChangedCallback(
  285 + UnityAction<ListBox, ListBox> callback) =>
  286 + _onFocusingBoxChanged.AddListener(callback);
  287 +
  288 + public void RemoveOnFocusingBoxChangedCallback(
  289 + UnityAction<ListBox, ListBox> callback) =>
  290 + _onFocusingBoxChanged.RemoveListener(callback);
  291 +
  292 + public void AddOnMovementEndCallback(UnityAction callback) =>
  293 + _onMovementEnd.AddListener(callback);
  294 +
  295 + public void RemoveOnMovementEndCallback(UnityAction callback) =>
  296 + _onMovementEnd.RemoveListener(callback);
  297 +
  298 + #endregion
  299 +
  300 + #region Public Functions
  301 +
  302 + /// <summary>
  303 + /// Is the list initialized?
  304 + /// </summary>
  305 + private bool CheckIsInitialized()
  306 + {
  307 + if (_isInitialized)
  308 + Debug.LogWarning(
  309 + $"The list setting of the list '{_name}' is initialized. Skip");
  310 +
  311 + return _isInitialized;
  312 + }
  313 +
  314 + /// <summary>
  315 + /// Initialize the settings
  316 + /// </summary>
  317 + /// <param name="listBank">The list bank</param>
  318 + /// <param name="name">The name of the list</param>
  319 + public void Initialize(BaseListBank listBank, string name)
  320 + {
  321 + var contentCount = listBank.GetContentCount();
  322 + if (_initFocusingContentID < 0
  323 + || (contentCount > 0 && _initFocusingContentID >= contentCount))
  324 + throw new IndexOutOfRangeException(
  325 + "The 'InitFocusingContentID' is negative "
  326 + + "or greater than the number of contents in the list bank "
  327 + + $"in the list '{name}'.");
  328 +
  329 + if (Mathf.Approximately(_boxDensity, 0f))
  330 + throw new InvalidOperationException(
  331 + $"The 'BoxDensity' shouldn't be 0 in the list '{name}'");
  332 +
  333 + switch (_focusingPosition) {
  334 + case CircularScrollingList.FocusingPosition.Top:
  335 + _reverseContentOrder = false;
  336 + break;
  337 + case CircularScrollingList.FocusingPosition.Bottom:
  338 + _reverseContentOrder = true;
  339 + break;
  340 + }
  341 +
  342 + _name = name;
  343 + _isInitialized = true;
  344 + }
  345 +
  346 + #endregion
  347 + }
  348 +}
  1 +fileFormatVersion: 2
  2 +guid: a2fd1ffb35261eb4e82cf7a148212876
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using System.Collections.Generic;
  2 +using AirFishLab.ScrollingList.ContentManagement;
  3 +using UnityEngine;
  4 +
  5 +namespace AirFishLab.ScrollingList
  6 +{
  7 + /// <summary>
  8 + /// The data for setting up the list
  9 + /// </summary>
  10 + public class ListSetupData
  11 + {
  12 + #region Public Members
  13 +
  14 + /// <summary>
  15 + /// The scrolling list
  16 + /// </summary>
  17 + public readonly CircularScrollingList ScrollingList;
  18 +
  19 + /// <summary>
  20 + /// The setting of the list
  21 + /// </summary>
  22 + public readonly ListSetting ListSetting;
  23 +
  24 + /// <summary>
  25 + /// The root rect transform of the list
  26 + /// </summary>
  27 + public readonly RectTransform RectTransform;
  28 +
  29 + /// <summary>
  30 + /// The camera that the root canvas is referenced
  31 + /// </summary>
  32 + /// If the canvas is in "Screen Space - Overlay" mode, it will be null.
  33 + public readonly Camera CanvasRefCamera;
  34 +
  35 + /// <summary>
  36 + /// The boxes in the list
  37 + /// </summary>
  38 + public readonly List<IListBox> ListBoxes;
  39 +
  40 + /// <summary>
  41 + /// The components for providing the list contents
  42 + /// </summary>
  43 + public readonly ListContentProvider ListContentProvider;
  44 +
  45 + #endregion
  46 +
  47 + public ListSetupData(
  48 + CircularScrollingList scrollingList,
  49 + ListSetting listSetting, RectTransform rectTransform,
  50 + Camera canvasRefCamera, List<IListBox> listBoxes,
  51 + ListContentProvider listContentProvider)
  52 + {
  53 + ScrollingList = scrollingList;
  54 + ListSetting = listSetting;
  55 + RectTransform = rectTransform;
  56 + CanvasRefCamera = canvasRefCamera;
  57 + ListBoxes = listBoxes;
  58 + ListContentProvider = listContentProvider;
  59 + }
  60 + }
  61 +}
  1 +fileFormatVersion: 2
  2 +guid: 226efc1966183ac4b8725f3fa26b93f0
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: e987fb3fa5514564cbf5b037fe035412
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +namespace AirFishLab.ScrollingList.ListStateProcessing
  2 +{
  3 + /// <summary>
  4 + /// The state of the box transform position
  5 + /// </summary>
  6 + public enum BoxPositionState
  7 + {
  8 + Nothing,
  9 + JumpToTop,
  10 + JumpToBottom,
  11 + }
  12 +}
  1 +fileFormatVersion: 2
  2 +guid: 0d1bb7c63807ed943bb88cd80d417063
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +using UnityEngine;
  2 +
  3 +namespace AirFishLab.ScrollingList.ListStateProcessing
  4 +{
  5 + /// <summary>
  6 + /// The interface for controlling the box transform
  7 + /// </summary>
  8 + public interface IBoxTransformController
  9 + {
  10 + /// <summary>
  11 + /// Set the initial local transform
  12 + /// </summary>
  13 + /// <param name="box">The target box</param>
  14 + /// <param name="boxID">The id of the box</param>
  15 + void SetInitialLocalTransform(IListBox box, int boxID);
  16 +
  17 + /// <summary>
  18 + /// Update the local transform of the box according to the moving distance
  19 + /// </summary>
  20 + /// <param name="box">The target box</param>
  21 + /// <param name="deltaPos">The moving distance</param>
  22 + /// <returns>The final status of the transform position</returns>
  23 + BoxPositionState UpdateLocalTransform(IListBox box, float deltaPos);
  24 + }
  25 +}
  1 +fileFormatVersion: 2
  2 +guid: a6abd419fc468014baa0d60c952a6ecd
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +namespace AirFishLab.ScrollingList.ListStateProcessing
  2 +{
  3 + /// <summary>
  4 + /// The interface for controlling the list boxes
  5 + /// </summary>
  6 + public interface IListBoxController
  7 + {
  8 + /// <summary>
  9 + /// Set the boxes to the controller
  10 + /// </summary>
  11 + /// <param name="setupData">The setup data of the list</param>
  12 + void Initialize(ListSetupData setupData);
  13 +
  14 + /// <summary>
  15 + /// Update the state of the boxes
  16 + /// </summary>
  17 + /// <param name="movementValue">The value for moving the boxes</param>
  18 + void UpdateBoxes(float movementValue);
  19 +
  20 + /// <summary>
  21 + /// Make the boxes recalculate their content ID and reacquire the content
  22 + /// </summary>
  23 + /// <param name="focusingContentID">The new focusing content ID</param>
  24 + void RefreshBoxes(int focusingContentID = -1);
  25 +
  26 + /// <summary>
  27 + /// Get the focusing box
  28 + /// </summary>
  29 + /// <returns>The current focusing box</returns>
  30 + IListBox GetFocusingBox();
  31 + }
  32 +}
  1 +fileFormatVersion: 2
  2 +guid: 52ea34424a638624ca119742ab49e2dc
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +namespace AirFishLab.ScrollingList.ListStateProcessing
  2 +{
  3 + /// <summary>
  4 + /// The interface of the processor for controlling the list movement
  5 + /// </summary>
  6 + public interface IListMovementProcessor
  7 + {
  8 + /// <summary>
  9 + /// Initialize the controller
  10 + /// </summary>
  11 + /// <param name="setupData">The data for setting up the list</param>
  12 + void Initialize(ListSetupData setupData);
  13 +
  14 + /// <summary>
  15 + /// Set the movement
  16 + /// </summary>
  17 + /// <param name="inputInfo">The information of the input value</param>
  18 + void SetMovement(InputInfo inputInfo);
  19 +
  20 + /// <summary>
  21 + /// Set the movement for moving several times of units
  22 + /// </summary>
  23 + /// <param name="unit">The number of units to move</param>
  24 + void SetUnitMovement(int unit);
  25 +
  26 + /// <summary>
  27 + /// Set the movement for centering the selected box
  28 + /// </summary>
  29 + /// <param name="units">The number of units to move</param>
  30 + void SetSelectionMovement(int units);
  31 +
  32 + /// <summary>
  33 + /// Get the current movement for the boxes
  34 + /// </summary>
  35 + /// <param name="detailTime">The time passed in seconds in this call</param>
  36 + /// <returns>The value for moving the boxes</returns>
  37 + float GetMovement(float detailTime);
  38 +
  39 + /// <summary>
  40 + /// Is the movement ended?
  41 + /// </summary>
  42 + bool IsMovementEnded();
  43 +
  44 + /// <summary>
  45 + /// Whether need to align a box or not
  46 + /// </summary>
  47 + bool NeedToAlign();
  48 +
  49 + /// <summary>
  50 + /// Discard the current movement
  51 + /// </summary>
  52 + /// <param name="toAlign">Whether to align a box</param>
  53 + void EndMovement(bool toAlign);
  54 + }
  55 +}
  1 +fileFormatVersion: 2
  2 +guid: 5e768792902e39946824fcea2a5a6401
  3 +MonoImporter:
  4 + externalObjects: {}
  5 + serializedVersion: 2
  6 + defaultReferences: []
  7 + executionOrder: 0
  8 + icon: {instanceID: 0}
  9 + userData:
  10 + assetBundleName:
  11 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: de4017d8903b2e042b411a2cd5b0c472
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant:
  1 +fileFormatVersion: 2
  2 +guid: cf8b16b2a6c9ddf42ba06cd41aaa3da7
  3 +folderAsset: yes
  4 +DefaultImporter:
  5 + externalObjects: {}
  6 + userData:
  7 + assetBundleName:
  8 + assetBundleVariant: